Exemplo n.º 1
0
void grab_frame(void) {
  int errnum;
  CamContext *cc;
  static int next_device_number=0;
  int data_ok = 0;

#ifdef USE_COPY
    cc = cc_all[next_device_number];

    CamContext_grab_next_frame_blocking(cc,raw_pixels,-1); // block forever
    errnum = cam_iface_have_error();
    if (errnum == CAM_IFACE_FRAME_TIMEOUT) {
      cam_iface_clear_error();
      return; // wait again
    }
    if (errnum == CAM_IFACE_FRAME_DATA_MISSING_ERROR) {
      cam_iface_clear_error();
      fprintf(stdout,"M");
      fflush(stdout);
    } else if (errnum == CAM_IFACE_FRAME_INTERRUPTED_SYSCALL) {
      cam_iface_clear_error();
      fprintf(stdout,"I");
      fflush(stdout);
    } else if (errnum == CAM_IFACE_FRAME_DATA_CORRUPT_ERROR) {
      cam_iface_clear_error();
      fprintf(stdout,"C");
      fflush(stdout);
    } else {
      _check_error();
      data_ok = 1;
    }

    next_device_number++;
    next_device_number = next_device_number % ncams;
    if (data_ok) {
      upload_image_data_to_opengl(raw_pixels,cc->coding,next_device_number);
    }

#else
    CamContext_point_next_frame_blocking(cc,&raw_pixels,-1.0f);
    _check_error();

    upload_image_data_to_opengl(raw_pixels,cc->coding,next_device_number);

    CamContext_unpoint_frame(cc);
    _check_error();
#endif

    glutPostRedisplay(); /* trigger display redraw */

}
Exemplo n.º 2
0
int main(int argc, char** argv) {
  CamContext *cc;
  unsigned char *pixels;

  int device_number,ncams,num_buffers;

  double last_fps_print, now, t_diff;
  double fps;
  int n_frames;
  int buffer_size;
  int num_modes, num_props, num_trigger_modes;
  char mode_string[255];
  int i,mode_number;
  CameraPropertyInfo cam_props;
  long prop_value;
  int prop_auto;
  int errnum;
  int left, top;
  int width, height;
  fmf_v3_header_part1 hstart;
  fmf_v3_header_part2 hstop;
  CameraPixelCoding coding;
  char * format_str;
  int bpp;
  cam_iface_constructor_func_t new_CamContext;
  Camwire_id cam_info_struct;
  FILE* fd;
  char * filename;

  cam_iface_startup_with_version_check();
  _check_error();

  for (i=0;i<argc;i++) {
    printf("%d: %s\n",i,argv[i]);
  }
  printf("using driver %s\n",cam_iface_get_driver_name());

  ncams = cam_iface_get_num_cameras();
  _check_error();

  if (ncams<1) {

    printf("no cameras found, will now exit\n");

    cam_iface_shutdown();
    _check_error();

    exit(1);
  }
  _check_error();

  printf("%d camera(s) found.\n",ncams);
  for (i=0; i<ncams; i++) {
    cam_iface_get_camera_info(i, &cam_info_struct);
    printf("  camera %d:\n",i);
    printf("    vendor: %s\n",cam_info_struct.vendor);
    printf("    model: %s\n",cam_info_struct.model);
    printf("    chip: %s\n",cam_info_struct.chip);
  }

  device_number = ncams-1;

  printf("choosing camera %d\n",device_number);

  cam_iface_get_num_modes(device_number, &num_modes);
  _check_error();

  printf("%d mode(s) available:\n",num_modes);

  mode_number = 0;

  for (i=0; i<num_modes; i++) {
    cam_iface_get_mode_string(device_number,i,mode_string,255);
    if (strstr(mode_string,"FORMAT7_0")!=NULL) {
      if (strstr(mode_string,"MONO8")!=NULL) {
        // pick this mode
        mode_number = i;
      }
    }
    printf("  %d: %s\n",i,mode_string);
  }

  printf("Choosing mode %d\n",mode_number);

  num_buffers = 5;

  new_CamContext = cam_iface_get_constructor_func(device_number);
  cc = new_CamContext(device_number,num_buffers,mode_number);
  _check_error();

  CamContext_get_frame_roi(cc, &left, &top, &width, &height);
  _check_error();

  CamContext_get_num_framebuffers(cc,&num_buffers);
  printf("allocated %d buffers\n",num_buffers);

  CamContext_get_num_camera_properties(cc,&num_props);
  _check_error();

  for (i=0; i<num_props; i++) {
    CamContext_get_camera_property_info(cc,i,&cam_props);
    _check_error();

    if (strcmp(cam_props.name,"white balance")==0) {
      fprintf(stderr,"WARNING: ignoring white balance property\n");
      continue;
    }

    if (cam_props.is_present) {
      CamContext_get_camera_property(cc,i,&prop_value,&prop_auto);
      _check_error();
      printf("  %s: %ld\n",cam_props.name,prop_value);
    } else {
      printf("  %s: not present\n",cam_props.name);
    }
  }

  CamContext_get_buffer_size(cc,&buffer_size);
  _check_error();

  if (buffer_size == 0) {
    fprintf(stderr,"buffer size was 0 in %s, line %d\n",__FILE__,__LINE__);
    exit(1);
  }

#define USE_COPY
#ifdef USE_COPY
  pixels = (unsigned char *)malloc( buffer_size );
  if (pixels==NULL) {
    fprintf(stderr,"couldn't allocate memory in %s, line %d\n",__FILE__,__LINE__);
    exit(1);
  }
#endif

  CamContext_start_camera(cc);
  _check_error();

  last_fps_print = my_floattime();
  n_frames = 0;

  CamContext_get_num_trigger_modes( cc, &num_trigger_modes );
  _check_error();

  printf("trigger modes:\n");
  for (i =0; i<num_trigger_modes; i++) {
    CamContext_get_trigger_mode_string( cc, i, mode_string, 255 );
    printf("  %d: %s\n",i,mode_string);
  }
  printf("\n");

  coding = cc->coding;
  bpp = 8;

  switch (coding) {
  case CAM_IFACE_MONO8_BAYER_BGGR:
    format_str = "MONO8:BGGR";
    break;
  case CAM_IFACE_MONO8_BAYER_RGGB:
    format_str = "MONO8:RGGB";
    break;
  case CAM_IFACE_MONO8_BAYER_GRBG:
    format_str = "MONO8:GRBG";
    break;
  case CAM_IFACE_MONO8_BAYER_GBRG:
    format_str = "MONO8:GBRG";
    break;
  case CAM_IFACE_MONO8:
    format_str = "MONO8";
    break;
  case CAM_IFACE_YUV422:
    format_str = "YUV422";
    bpp = 16;
    break;
  default:
    fprintf(stderr,"do not know how to save sample image for this format\n");
    exit(1);
  }

  hstart.version = 3;
  hstart.len_format = strlen(format_str);

  hstop.rows = height;
  hstop.cols = width;
  hstop.bytes_per_chunk = sizeof(double) + height*width*bpp/8; /* timestamp, image */
  hstop.n_frames = 0;
  hstop.bpp = bpp;

  filename = "movie.fmf";
  fd = fopen(filename,"w");

  /* write the FMF v3 header */
  fwrite(&hstart,sizeof(fmf_v3_header_part1),1,fd);
  fwrite(format_str,hstart.len_format,1,fd);
  fwrite(&hstop,sizeof(fmf_v3_header_part2),1,fd);

  /* grab frames forever */
  printf("Press Ctrl-C to quit. Will now save .fmf movie.\n");
  while (1) {
#ifdef USE_COPY
    //CamContext_grab_next_frame_blocking(cc,pixels,0.2); // timeout after 200 msec
    CamContext_grab_next_frame_blocking(cc,pixels,-1.0f); // never timeout
    errnum = cam_iface_have_error();
    if (errnum == CAM_IFACE_FRAME_TIMEOUT) {
      cam_iface_clear_error();
      fprintf(stdout,"T");
      fflush(stdout);
      continue; // wait again
    }
    if (errnum == CAM_IFACE_FRAME_DATA_MISSING_ERROR) {
      cam_iface_clear_error();
      fprintf(stdout,"M");
      fflush(stdout);
    } else if (errnum == CAM_IFACE_FRAME_INTERRUPTED_SYSCALL) {
      cam_iface_clear_error();
      fprintf(stdout,"I");
      fflush(stdout);
    } else if (errnum == CAM_IFACE_FRAME_DATA_CORRUPT_ERROR) {
      cam_iface_clear_error();
      fprintf(stdout,"C");
      fflush(stdout);
    } else {
      _check_error();
      fprintf(stdout,".");
      fflush(stdout);
    }
    now = my_floattime();
    n_frames += 1;
#else
    CamContext_point_next_frame_blocking(cc,&pixels,-1.0f);
    now = my_floattime();
    n_frames += 1;
    _check_error();
    fprintf(stdout,".");
    fflush(stdout);
    CamContext_unpoint_frame(cc);
    _check_error();
#endif

    fwrite(&now,sizeof(double),1,fd);
    fwrite(pixels,height*width*bpp/8,1,fd);


    t_diff = now-last_fps_print;
    if (t_diff > 5.0) {
      fps = n_frames/t_diff;
      fprintf(stdout,"%.1f fps\n",fps);
      last_fps_print = now;
      n_frames = 0;
    }
  }


  printf("\n");
  delete_CamContext(cc);
  _check_error();

  cam_iface_shutdown();
  _check_error();

#ifdef USE_COPY
  free(pixels);
#endif

  return 0;
}