示例#1
0
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; 
}
示例#2
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;
}