int main(int argc, char** argv){ int numPics = 100; fc2VideoMode mode1 = FC2_VIDEOMODE_640x480Y8; char *mode1_str = "FC2_VIDEOMODE_640x480Y8"; //fc2FrameRate rate1 = FC2_FRAMERATE_30; //char *rate1_str = "FC2_FRAMERATE_30"; fc2VideoMode mode2 = FC2_VIDEOMODE_1280x960Y8; char *mode2_str = "FC2_VIDEOMODE_1280x960Y8"; fc2FrameRate rate = FC2_FRAMERATE_15; char *rate_str = "FC2_FRAMERATE_15"; fc2VideoMode mode; char *mode_str; //fc2FrameRate rate; //char *rate_str; //int prog_mode; int camOffset = 0; PrintBuildInfo(); /* if (argc != 2) */ /* { */ /* printf("Error: Must chose mode\n"); */ /* printf("Usage: %s {1, 2, 3, 4, 5, 6} \n",argv[0]); */ /* printf("Modes: 1 = first camera at 1280x960Y8\n" */ /* " 2 = second camera at 1280x960Y8\n" */ /* " 3 = both cameras at 1280x960Y8\n" */ /* " 4 = first camera at 640x480Y8\n" */ /* " 5 = second camera at 640x480Y8\n" */ /* " 6 = both cameras at 640x480Y8\n"); */ /* return -1; */ /* } */ /* prog_mode = atoi(argv[1]); */ /* if ((prog_mode > 6) || (prog_mode < 1)) */ /* { */ /* printf("Must chose valid mode, 1 through 6\n"); */ /* } */ if (CheckSaving(OUTPUT_DIR) != 0) { printf("Cannot save to %s, please check permissions\n",OUTPUT_DIR); return -1; } //have correct number of arguments and can save fc2Context tempContext; check_point_grey(fc2CreateContext(&tempContext)); unsigned int numCams; check_point_grey(fc2GetNumOfCameras(tempContext, &numCams)); check_point_grey(fc2DestroyContext(tempContext)); if (numCams == 0) { //no cameras printf("No cameras found, exiting.\n"); return -1; } //if we get here, we know we have at least 1 camera connected /* if (prog_mode < 4) */ /* { */ /* mode = FC2_VIDEOMODE_1280x960Y8; */ /* mode_str = "FC2_VIDEOMODE_1280x960Y8"; */ /* rate = FC2_FRAMERATE_15; */ /* rate_str = "FC2_FRAMERATE_15"; */ /* } */ // printf("Using resolution %s and frame rate %s\n",mode_str,rate_str); /* if ((prog_mode == 1) || (prog_mode == 4)) */ /* { // run only the first camera */ /* numCams = 1; */ /* } */ /* if ((prog_mode == 2) || (prog_mode == 5)) */ /* { // run only the second camera */ /* camOffset = 1; */ /* } */ printf("Taking %i pictures per camera with %i camera(s).\n",numPics, (numCams - camOffset)); struct point_grey *pg_ptr[numCams - camOffset]; for (int i = 0; i < (numCams - camOffset); i++) //initialization loop { if (i == 0) { mode = mode2; mode_str = mode2_str; //rate = rate2; //rate_str = rate2_str; } else { mode = mode1; mode_str = mode1_str; //rate = rate1; //rate_str = rate1_str; } pg_ptr[i] = (struct point_grey *)point_grey_malloc(sizeof(struct point_grey)); check_point_grey(fc2CreateContext(&pg_ptr[i]->context)); check_point_grey(fc2GetCameraFromIndex(pg_ptr[i]->context, (i + camOffset), &pg_ptr[i]->guid)); check_point_grey(fc2Connect(pg_ptr[i]->context, &pg_ptr[i]->guid)); check_point_grey(fc2SetDefaultColorProcessing(FC2_NEAREST_NEIGHBOR_FAST)); check_point_grey(fc2SetVideoModeAndFrameRate(pg_ptr[i]->context, mode, rate)); AssignName(pg_ptr[i]->context, pg_ptr[i]->name); check_point_grey(fc2CreateImage(&pg_ptr[i]->raw_image)); check_point_grey(fc2CreateImage(&pg_ptr[i]->converted_image)); PrintCameraInfo(pg_ptr[i]->context); printf("Using resolution %s and frame rate %s\n",mode_str,rate_str); //**CALLING THIS HERE WILL WORK WITH 2 CAMERAS AT 640X480 BUT NOT AT //1280X960** check_point_grey(fc2StartCapture(pg_ptr[i]->context)) printf("completed initialization loop iteration %d, %s\n",i,pg_ptr[i]->name); } // initialization loop Imlib_Image temp_image; double start = current_time(); for (int j = 0; j < numPics; j++) //loop through numPics { for (int i = 0; i < (numCams - camOffset); i++) //picture taking loop { check_point_grey(fc2RetrieveBuffer(pg_ptr[i]->context, &pg_ptr[i]->raw_image)); check_point_grey(fc2ConvertImageTo(FC2_PIXEL_FORMAT_BGRU, &pg_ptr[i]->raw_image, &pg_ptr[i]->converted_image)); temp_image = imlib_create_image_using_copied_data(pg_ptr[i]->converted_image.cols, pg_ptr[i]->converted_image.rows, (unsigned int *) pg_ptr[i]->converted_image.pData); printf("%simage_%d\n",pg_ptr[i]->name,j); if (j == (numPics - 1)) {//save the final image from each camera SaveImlibImage(temp_image, pg_ptr[i]->name, mode_str); } else { imlib_context_set_image(temp_image); //this is where we would do something else with the image imlib_free_image_and_decache(); } } //picture taking loop } //numPics loop double stop = current_time(); //check elapsed time double elapsed = stop - start; double images_per_sec = (double)numPics / elapsed; printf("%d images per camera taken in %f seconds (%f images/sec/cam)\n", numPics, elapsed, images_per_sec); for (int i = 0; i < (numCams - camOffset); i++) //cleanup loop { //**CALLING THIS HERE WILL WORK WITH 2 CAMERAS AT 640X480 BUT NOT AT //1280X960** check_point_grey(fc2StopCapture(pg_ptr[i]->context)); check_point_grey(fc2DestroyContext(pg_ptr[i]->context)); check_point_grey(fc2DestroyImage(&pg_ptr[i]->raw_image)); check_point_grey(fc2DestroyImage(&pg_ptr[i]->converted_image)); free(pg_ptr[i]); printf("completed cleanup loop iteration %d\n",i); } //cleanup loop printf("Program complete!\n"); return 0; }
// functions called from Scheme (must have extern "C" to prevent mangling) extern "C" int rover_server_setup(void) { //setup for displaying images (grab threads) framecount = 1; FrontCam = (struct CamGrab_t*) malloc(sizeof(struct CamGrab_t)); PanoCam = (struct CamGrab_t*) malloc(sizeof(struct CamGrab_t)); pthread_mutex_init(&FrontCam->MostRecentLock, NULL); pthread_mutex_init(&PanoCam->MostRecentLock, NULL); FrontCam->MostRecent = -1; PanoCam->MostRecent = -1; FrontCam->LastDisplayed = -1; PanoCam->LastDisplayed = -1; FrontCam->PortNumber = (char*) malloc(sizeof(char) * 10); strcpy(FrontCam->PortNumber, k_FrontCamPort); FrontCam->CdrPortNumber = (char*) malloc(sizeof(char) * 10); strcpy(FrontCam->CdrPortNumber, k_CdrFrontCamPort); PanoCam->PortNumber = (char*) malloc(sizeof(char) * 10); strcpy(PanoCam->PortNumber, k_PanoCamPort); PanoCam->CdrPortNumber = (char*) malloc(sizeof(char) * 10); strcpy(PanoCam->CdrPortNumber, k_CdrPanoCamPort); for (int i = 0; i < k_ImgBufSize; i++) { pthread_mutex_init(&FrontCam->ImgArrayLock[i], NULL); pthread_mutex_init(&PanoCam->ImgArrayLock[i], NULL); FrontCam->ImgArray[i] = (Imlib_Image *) malloc(sizeof(Imlib_Image)); PanoCam->ImgArray[i] = (Imlib_Image *) malloc(sizeof(Imlib_Image)); FrontCam->Set[i] = FALSE; PanoCam->Set[i] = FALSE; } grab_threads_should_die = FALSE; char windowname[] = "driver-viewer"; display_pane = FindWindow(windowname); //setup for logging data (log thread) log_thread_should_die = FALSE; if (CheckSaving(k_LogDir) != 0) { printf("rover_server_setup() failed due to inability to log data\n"); return -1; } //create log DIRECTORY with GMT as name char tempName[k_LogBufSize]; time_t now; now = time(NULL); if (now != -1) strftime(tempName, k_LogBufSize, "%F-%T", gmtime(&now)); else { printf("error getting time\n"); return -1; } char logDirName[k_LogBufSize]; logDirName[0] = '\0'; sprintf(logDirName, "%s%s", k_LogDir, tempName); struct stat sb; if (!(stat(logDirName, &sb) == 0 && S_ISDIR(sb.st_mode))) { if (mkdir(logDirName, S_IRWXU | S_IRGRP | S_IROTH | S_IXGRP | S_IXOTH) != 0) { printf("Error creating directory %s\n",logDirName); return -1; } } //create log file char logFileName[k_LogBufSize]; logFileName[0] = '\0'; sprintf(logFileName, "%s%s/log.txt", k_LogDir, tempName); log_file = fopen(logFileName, "w+"); if (log_file == NULL) { printf("Failed to create file %s. Please check permissions.\n", logFileName); return -1; } //create log file for IMU data logFileName[0] = '\0'; sprintf(logFileName, "%s%s/imu-log.txt", k_LogDir, tempName); imu_log_file = fopen(logFileName, "w+"); if (imu_log_file == NULL) { printf("Failed to create file %s. Please check permissions.\n", logFileName); return -1; } //create timestamp logs for front and pano cams logFileName[0] = '\0'; sprintf(logFileName, "%s%s/camera_front.txt", k_LogDir, tempName); FrontCam->file_ptr = fopen(logFileName, "w+"); if (FrontCam->file_ptr == NULL) { printf("Failed to create file %s. Please check permissions.\n", logFileName); return -1; } logFileName[0] = '\0'; sprintf(logFileName, "%s%s/camera_pano.txt", k_LogDir, tempName); PanoCam->file_ptr = fopen(logFileName, "w+"); if (PanoCam->file_ptr == NULL) { printf("Failed to create file %s. Please check permissions.\n", logFileName); return -1; } //create file names for video files FrontCam->video_file_name = (char*) malloc(sizeof(char) * 100); sprintf(FrontCam->video_file_name, "%s%s/video_front.avi", k_LogDir, tempName); PanoCam->video_file_name = (char*) malloc(sizeof(char) * 100); sprintf(PanoCam->video_file_name, "%s%s/video_pano.avi", k_LogDir, tempName); //create cv::VideoWriter output_video objects cv::Size vid_size = cv::Size(640,480); //**HARDCODED** for 640x480 video int codec = CV_FOURCC('M','J','P','G'); FrontCam->output_video = new cv::VideoWriter(FrontCam->video_file_name, codec, 10.5, vid_size, true); PanoCam->output_video = new cv::VideoWriter(PanoCam->video_file_name, codec, 10.5, vid_size, true); //set first lines for log file and timestamp log files memset(tempName, 0, sizeof(tempName)); strftime(tempName, k_LogBufSize, "Log file created at %F-%T GMT", gmtime(&now)); fprintf(log_file, "%s\n", tempName); fprintf(imu_log_file, "%s\n", tempName); fprintf(FrontCam->file_ptr, "%s\n", tempName); fprintf(PanoCam->file_ptr, "%s\n", tempName); //open socket for log data from vader-rover log_sockfd = StartServer(k_LogPort); printf("server: waiting for data logging connection on port %s...\n", k_LogPort); //open socket for imu log data log_imu_sockfd = StartServer(k_imuLogPort); printf("server: waiting for IMU logging connection on port %s...\n", k_imuLogPort); //success if we get here printf("rover_server_setup() succeeded\n"); return 0; }