// xiSample.cpp : program that captures 10 images #include "stdafx.h" #ifdef WIN32 #include "xiApi.h" // Windows #else #include // Linux, OSX #endif #include #define HandleResult(res,place) if (res!=XI_OK) {printf("Error after %s (%d)\n",place,res);goto finish;} #define XI_PRM_IMAGE_CORRECTION_SELECTOR "image_correction_selector"// Select image correction function XI_IMAGE_CORRECTION_SELECTOR #define XI_PRM_IMAGE_CORRECTION_VALUE "image_correction_value" // Select image correction selected function value #define XI_CORR_TYPE_SENSOR_DEFECTS_FACTORY 0 // Factory defect list #define XI_CORR_TYPE_SENSOR_DEFECTS_USER0 4 // User defect list typedef enum { XI_CORRECTION_TYPE_SELECTOR = 0, // Correction Type selected see XI_TYPE_CORRECTION_SELECTOR XI_DEFECT_ID = 1, // Select defect id XI_DEFECTS_COUNT_BY_TYPE = 2, // Count of defects selected by current XI_DEFECT_TYPE XI_DEFECT_TYPE = 3, // Type of defect see XI_IMAGE_DEFECT_TYPE XI_DEFECT_SUB_TYPE = 4, // Defect sub type see XI_IMAGE_DEFECT_SUB_TYPE XI_DEFECT_POS_X = 5, // Defect position x XI_DEFECT_POS_Y = 6, // Defect position y XI_DEFECT_CMD_ADD = 7, // Write cached defect to the list XI_DEFECT_CMD_DELETE = 8, // Delete defect to the list XI_DEFECT_CMD_APPLY_CHANGES = 9, // Apply changes XI_DEFECT_CMD_LIST_CLEAR = 10, // Clear list XI_DEFECT_CMD_LISTS_CLEAR = 11, // Clear lists XI_DEFECT_CMD_SAVE = 12, // Save list to device XI_CORRECTION_TYPE_ENABLED = 13, // Enable or disable correction type XI_DEFECT_ID_BY_TYPE = 14, // Select defect id by type XI_LIST_ID = 15, // Select list id XI_DEFECT_CMD_APPLY_CHANGES_ALL = 16, // Apply changes to all lists XI_LIST_STATUS = 17, // Current list status (Read-only). Result is mask of bits XI_LIST_STATUS_GENERATED, XI_LIST_STATUS_... XI_IMG_COR_TAP_SELECTOR = 64, // Selected tap id (0-N) for image correction XI_IMG_COR_GAIN_TUNE = 65, // Adjustment of gain in dB. For multitap sensors, active tap is selected by XI_IMG_COR_TAP_SELECTOR. XI_IMG_COR_OFFSET_TUNE = 66, // Adjustment of pixel values offset. For multitap sensors, active tap is selected by XI_IMG_COR_TAP_SELECTOR. } XI_IMAGE_CORRECTION_SELECTOR; typedef enum { XI_IMAGE_DEFECT_TYPE_PIXEL = 0, // Defect is pixel XI_IMAGE_DEFECT_TYPE_COLUMN = 1, // Defect is column XI_IMAGE_DEFECT_TYPE_ROW = 2, // Defect is row } XI_IMAGE_DEFECT_TYPE; XI_RETURN ListDefectPixels(HANDLE xiH); int _tmain(int argc, _TCHAR* argv[]) { #define SLEEP_TIME 2000 // image buffer XI_IMG image; memset(&image, 0, sizeof(image)); image.size = sizeof(XI_IMG); // Sample for XIMEA API V4.05 HANDLE xiH = NULL; XI_RETURN stat = XI_OK; // for MU,MQ, MD cameras the new processing chain must be enabled if order to be able to manipulate the defect list stat = xiSetParamInt(0, XI_PRM_NEW_PROCESS_CHAIN_ENABLE, XI_ON); HandleResult(stat, "xiSetParam (XI_PRM_NEW_PROCESS_CHAIN_ENABLE )"); // Retrieving a handle to the camera device printf("Opening first camera...\n"); stat = xiOpenDevice(0, &xiH); HandleResult(stat, "xiOpenDevice"); // to initalize the processing chain the acquisition must be started and xiGetImage must be called at least once stat = xiStartAcquisition(xiH); HandleResult(stat, "xiStartAcquisition"); stat = xiGetImage(xiH, 5000, &image); HandleResult(stat, "xiGetImage"); // Listing defect pixels in factory list stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_CORRECTION_TYPE_SELECTOR); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_CORRECTION_TYPE_SELECTOR )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, XI_CORR_TYPE_SENSOR_DEFECTS_FACTORY); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE,XI_CORR_TYPE_SENSOR_DEFECTS_FACTORY )"); printf("Listing factory defect pixels:\n"); stat = ListDefectPixels(xiH); HandleResult(stat, "ListDefectPixels"); Sleep(SLEEP_TIME); // Listing defect pixels in user list stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_CORRECTION_TYPE_SELECTOR); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_CORRECTION_TYPE_SELECTOR )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, XI_CORR_TYPE_SENSOR_DEFECTS_USER0); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE,XI_CORR_TYPE_SENSOR_DEFECTS_USER0 )"); printf("Listing defect pixels in user list:\n"); stat = ListDefectPixels(xiH); HandleResult(stat, "ListDefectPixels"); Sleep(SLEEP_TIME); //Adding defect pixel to user list stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_TYPE); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, XI_IMAGE_DEFECT_TYPE_PIXEL); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); int x = 152; int y = 154; printf("Adding defect pixel (%d,%d) to user list\n", x, y); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_POS_X); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, x); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_POS_Y); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, y); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_CMD_ADD); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_CMD_APPLY_CHANGES); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_CMD_SAVE); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); // Listing defect pixels printf("Listing defect pixels in user list:\n"); stat = ListDefectPixels(xiH); HandleResult(stat, "ListDefectPixels"); Sleep(SLEEP_TIME); //Removing last added defect pixel stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_TYPE); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_TYPE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, XI_IMAGE_DEFECT_TYPE_PIXEL); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); int defect_count = 0; stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECTS_COUNT_BY_TYPE); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECTS_COUNT_BY_TYPE )"); stat = xiGetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, &defect_count); HandleResult(stat, "xiGetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_ID); HandleResult(stat, "xiGetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_ID )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, defect_count - 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_CMD_DELETE); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_CMD_DELETE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_CMD_APPLY_CHANGES); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_CMD_APPLY_CHANGES )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_CMD_SAVE); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_SELECTOR,XI_DEFECT_CMD_SAVE )"); stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, 1); HandleResult(stat, "xiSetParam (XI_PRM_IMAGE_CORRECTION_VALUE )"); // Listing defect pixels printf("Listing defect pixels in user list:\n"); stat = ListDefectPixels(xiH); HandleResult(stat, "ListDefectPixels"); Sleep(SLEEP_TIME); printf("Stopping acquisition...\n"); xiStopAcquisition(xiH); finish: xiCloseDevice(xiH); printf("Done\n"); #ifdef WIN32 Sleep(10000); #endif return 0; } XI_RETURN ListDefectPixels(HANDLE xiH) { XI_RETURN stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECT_TYPE); if (stat != XI_OK)return stat; stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, XI_IMAGE_DEFECT_TYPE_PIXEL); if (stat != XI_OK)return stat; int defect_count = 0; stat = xiSetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_SELECTOR, XI_DEFECTS_COUNT_BY_TYPE); if (stat != XI_OK)return stat; stat = xiGetParamInt(xiH, XI_PRM_IMAGE_CORRECTION_VALUE, &defect_count); if (stat != XI_OK)return stat; for (int defect_id = 0; defect_id