// xiSample.cpp : program that captures 10 images and finish // #include "stdafx.h" #ifdef WIN32 #include "xiApi.h" // Windows #else #include // Linux, OSX #include #endif #include #define HandleResult(res,place) if (res!=XI_OK) {printf("Error after %s (%d)\n",place,res);goto finish;} #define SUPPORT_FOR_2_CAMERAS 1 int _tmain(int argc, _TCHAR* argv[]) { // image1 buffer XI_IMG image1; memset(&image1,0,sizeof(image1)); image1.size = sizeof(XI_IMG); HANDLE xiH1 = NULL; // image2 buffer XI_IMG image2; memset(&image2,0,sizeof(image2)); image2.size = sizeof(XI_IMG); HANDLE xiH2 = NULL; XI_RETURN stat = XI_OK; char serial_number1[100]=""; char serial_number2[100]=""; int retry = 3; // Get number of camera devices DWORD dwNumberOfDevices = 0; stat = xiGetNumberDevices(&dwNumberOfDevices); HandleResult(stat,"xiGetNumberDevices (no camera found)"); // open cameras printf("Opening camera 1\n"); stat = xiOpenDevice(0, &xiH1); HandleResult(stat,"xiOpenDevice1"); xiGetParamString(xiH1, XI_PRM_DEVICE_SN, serial_number1, sizeof(serial_number1)); printf("Camera 1 - SN:%s\n",serial_number1); if (SUPPORT_FOR_2_CAMERAS) { if (dwNumberOfDevices != 2) { printf("At least 2 cameras expected. Found %d\n",dwNumberOfDevices); goto finish; } printf("Opening camera 2\n"); stat = xiOpenDevice(1, &xiH2); HandleResult(stat,"xiOpenDevice2"); xiGetParamString(xiH2, XI_PRM_DEVICE_SN, serial_number2, sizeof(serial_number2)); printf("Camera 2 - SN:%s\n",serial_number2); } //SUPPORT_FOR_2_CAMERAS // set trigger mode on camera1 - as master printf("Setting parameters for camera 1\n"); stat = xiSetParamInt(xiH1, XI_PRM_TRG_SOURCE, XI_TRG_SOFTWARE); HandleResult(stat,"XI_PRM_TRG_SOURCE 1"); stat = xiSetParamInt(xiH1, XI_PRM_GPO_SELECTOR, 2); HandleResult(stat,"XI_PRM_GPO_SELECTOR 1"); stat = xiSetParamInt(xiH1, XI_PRM_GPO_MODE, XI_GPO_FRAME_ACTIVE_NEG); HandleResult(stat,"XI_PRM_GPO_MODE 1"); // Setting "exposure" parameter stat = xiSetParamInt(xiH1, XI_PRM_EXPOSURE, 500000); HandleResult(stat,"xiSetParam (exposure set)"); stat = xiStartAcquisition(xiH1); HandleResult(stat,"xiStartAcquisition1"); if (SUPPORT_FOR_2_CAMERAS) { // set trigger mode on camera2 - as slave printf("Setting parameters for camera 2\n"); stat = xiSetParamInt(xiH2, XI_PRM_TRG_SOURCE, XI_TRG_EDGE_RISING); HandleResult(stat,"XI_PRM_TRG_SOURCE 2"); stat = xiSetParamInt(xiH2, XI_PRM_GPI_SELECTOR, 2); HandleResult(stat,"XI_PRM_GPI_SELECTOR 2"); stat = xiSetParamInt(xiH2, XI_PRM_GPI_MODE, XI_GPI_TRIGGER); HandleResult(stat,"XI_PRM_GPI_MODE 2"); stat = xiStartAcquisition(xiH2); HandleResult(stat,"xiStartAcquisition2"); } //SUPPORT_FOR_2_CAMERAS printf("Wait for right moment\n"); #ifdef WIN32 Sleep(1234); // wait for right moment to trigger the exposure #else usleep(1234000); #endif // trigger acquisition on Master camera while (retry--) { printf("Triggering acquisition on master camera\n"); xiSetParamInt(xiH1, XI_PRM_TRG_SOFTWARE, 0); // get image from both cameras #define TIMEOUT_WAIT_FOR_IMAGE_MS 1000 printf("Getting the images\n"); stat = xiGetImage(xiH1, TIMEOUT_WAIT_FOR_IMAGE_MS, &image1); if (stat!=XI_OK) printf("Error after xiGetImage1 (%d)\n",stat); else printf("Received image from camera1 (%dx%d)\n",(int)image1.width,(int)image1.height); if (SUPPORT_FOR_2_CAMERAS) { stat = xiGetImage(xiH2, TIMEOUT_WAIT_FOR_IMAGE_MS, &image2); if (stat!=XI_OK) printf("Error after xiGetImage2 (%d)\n",stat); else printf("Received image from camera2 (%dx%d)\n",(int)image2.width,(int)image2.height); } //SUPPORT_FOR_2_CAMERAS // process images here #ifdef WIN32 Sleep(2000); #endif } finish: printf("Done\n"); if (xiH1) xiCloseDevice(xiH1); if (SUPPORT_FOR_2_CAMERAS) { if (xiH2) xiCloseDevice(xiH2); } // SUPPORT_FOR_2_CAMERAS #ifdef WIN32 Sleep(2000); #endif return 0; }