Exemplo n.º 1
0
void Libdc1394SequenceGrabber::setupBayer() 
{
	msg(osg::INFO) << "setupBayer" << std::endl;
	
	if( _sourceFormat == DC1394_COLOR_CODING_RAW8 ||
		_sourceFormat == DC1394_COLOR_CODING_MONO8 || 
		_sourceFormat == DC1394_COLOR_CODING_MONO16 || 
		_sourceFormat == DC1394_COLOR_CODING_RAW16 )
	{
		getBayerTile( _camera, &_bayerPattern );
	}
}
Exemplo n.º 2
0
//=============================================================================
// setStereoVideoCapture()
//
// Given that the camera handle is a stereo camera, query the camera for 
// stereo specific information about this camera and populate the 
// PGRStereoCamera_t handle structure
//
// note: currently always allocated maximum framerate
dc1394error_t
setStereoVideoCapture( PGRStereoCamera_t* stereoCamera )
{
   dc1394error_t 	err;
   dc1394color_coding_t	coding;

   switch( stereoCamera->model )
   {
      case BUMBLEBEE:
	 dc1394video_mode_t 	videoMode;
	 dc1394framerate_t 	fps;

	 // note: both B&W and Bayer Bumblebees transmit in mono mode
	 if ( stereoCamera->nCols == 640 )
	 {
	    // lo res 
            printf("capture mode: DC1394_VIDEO_MODE_640x480_MONO16 ");
            printf("capture mode: %d\n", DC1394_VIDEO_MODE_640x480_MONO16);
	    videoMode 	= DC1394_VIDEO_MODE_640x480_MONO16;
	    fps		= DC1394_FRAMERATE_30;
	 }
	 else
	 {
            printf("capture mode: DC1394_VIDEO_MODE_1024x768_MONO16 ");
            printf("capture mode: %d\n", DC1394_VIDEO_MODE_1024x768_MONO16);
	    // assume hi res 
	    videoMode 	= DC1394_VIDEO_MODE_1024x768_MONO16;
	    fps		= DC1394_FRAMERATE_15;
	 }
	 
	 // make the calls to set up the capture mode
	 dc1394_video_set_iso_speed( stereoCamera->camera, DC1394_ISO_SPEED_400 );
	 dc1394_video_set_mode(      stereoCamera->camera, videoMode );
	 dc1394_video_set_framerate( stereoCamera->camera, fps );
	 err = dc1394_capture_setup( stereoCamera->camera, 8, DC1394_CAPTURE_FLAGS_DEFAULT );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't setup Bumblebee capture\n" );
	    return err;
	 }
	 break;

      case BUMBLEBEE2:
	 // Bumblebee2 transmits stereo images in Format 7

	 // load the factory defaults - this is auto-everything
	 err = dc1394_memory_load( stereoCamera->camera, 0 );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't load default memory channel\n" );
	    return err;
	 }

	 // set 16-bit transmission to be PGR-default little endian mode
	 err = setEndian( stereoCamera->camera, false );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't set Bumblebee2 into little-endian mode\n" );
	    return err;
	 }

	 // color cameras transmit in "RAW16", mono cameras in "MONO16"
	 coding	= DC1394_COLOR_CODING_MONO16;
	 if ( stereoCamera->bColor )
	    coding = DC1394_COLOR_CODING_RAW16;
	 
	 dc1394_video_set_iso_speed( stereoCamera->camera, DC1394_ISO_SPEED_400 );
	 dc1394_video_set_mode( stereoCamera->camera, DC1394_VIDEO_MODE_FORMAT7_3 );

	 err = dc1394_format7_set_roi( stereoCamera->camera,
				       DC1394_VIDEO_MODE_FORMAT7_3,
				       coding,
                                       // bytes per packet - sets frame rate
				       DC1394_USE_MAX_AVAIL, 
				       0, 
				       0,
				       stereoCamera->nCols,
				       stereoCamera->nRows );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't setup Bumblebee2 capture\n" );
	    return err;
	 }

	 err = dc1394_capture_setup( stereoCamera->camera, 8, DC1394_CAPTURE_FLAGS_DEFAULT );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't setup Bumblebee capture\n" );
	    return err;
	 }
	 break;

      case BUMBLEBEEXB3:
	 // Bumblebee3 transmits stereo images in Format 7

	 // load the factory defaults - this is auto-everything
	 err = dc1394_memory_load( stereoCamera->camera, 0 );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't load default memory channel\n" );
	    return err;
	 }


	 if ( stereoCamera->nBytesPerPixel == 2 )
	 {
	    // run in 2 camera mode

	    // NOTE: this code will always only set up the wide-baseline pair
	    // To change to the inner baseline pair you need to set the PAN
	    // register to 1.
	    // PAN = 0 is the wide baseline pair which is set by default.
	    // To change to all 3 images being transmitted you need to change
	    // modes to "coding	= DC1394_COLOR_CODING_RGB8;"
	    //

	    // set 16-bit transmission to be PGR-default little endian mode
	    err = setEndian( stereoCamera->camera, false );
	    if ( err != DC1394_SUCCESS ) 
	    {
	       fprintf( stderr, "Can't set Bumblebee2 into little-endian mode\n" );
	       return err;
	    }

	    // color cameras transmit in "RAW16", mono cameras in "MONO16"
	    coding	= DC1394_COLOR_CODING_MONO16;
	    if ( stereoCamera->bColor )
	       coding = DC1394_COLOR_CODING_RAW16;
	 }
	 else
	 {
	    // 3 camera mode transmits in RGB8
	    coding	= DC1394_COLOR_CODING_RGB8;
	 }

	 // assume the XB is plugged into a 1394B network
	 // XB3 can work with a 1394A bus but code changes will be required
	 dc1394_video_set_operation_mode( stereoCamera->camera, DC1394_OPERATION_MODE_1394B );
	 dc1394_video_set_iso_speed( stereoCamera->camera, DC1394_ISO_SPEED_800 );
	 dc1394_video_set_mode( stereoCamera->camera, DC1394_VIDEO_MODE_FORMAT7_3 );
	 err = dc1394_format7_set_roi( stereoCamera->camera,
				       DC1394_VIDEO_MODE_FORMAT7_3,
				       coding,
                                       // bytes per packet - sets frame rate
				       DC1394_USE_MAX_AVAIL, 
				       0, 
				       0,
				       stereoCamera->nCols,
				       stereoCamera->nRows );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't setup Bumblebee XB3 capture\n" );
	    return err;
	 }

	 err = dc1394_capture_setup( stereoCamera->camera, 4, DC1394_CAPTURE_FLAGS_DEFAULT );
	 if ( err != DC1394_SUCCESS ) 
	 {
	    fprintf( stderr, "Can't setup Bumblebee capture\n" );
	    return err;
	 }
	 break;

      default:
	 fprintf( stderr, 
		  "setStereoVideoCapture() - \n"
		  "\tThis camera is not a supported stereo camera!\n" );
	 return DC1394_FAILURE;
   }

   // get the bayer tile info so we will know how to color process
   // this mode
   err = getBayerTile( stereoCamera->camera,
		       &stereoCamera->bayerTile );
   if ( err != DC1394_SUCCESS )
   {
      fprintf( stderr, "Could not query the Bayer Tile Register!\n" );
      return err;
   }

   return DC1394_SUCCESS;
}
Exemplo n.º 3
0
//=============================================================================
// querySteroeCamera()
//
// Given that the camera handle is a stereo camera, query the camera for 
// stereo specific information about this camera and populate the 
// PGRStereoCamera_t handle structure
//
dc1394error_t
queryStereoCamera( dc1394camera_t* 	camera,
		   PGRStereoCamera_t* 	stereoCamera )
{

   // set the camera handle
   stereoCamera->camera = camera;

   // find out what base model camera we have
   stereoCamera->model = getCameraModel( camera );
   if ( stereoCamera->model == UNKNOWN_CAMERA )
      return DC1394_FAILURE;


   dc1394error_t err;
   
   if ( stereoCamera->model != BUMBLEBEE )
   {
      err = getSensorInfo( camera,
			   &stereoCamera->bColor,
			   &stereoCamera->nRows,
			   &stereoCamera->nCols );
      if ( err != DC1394_SUCCESS )
      {
	 fprintf( stderr, "Could not query the Sensor Info Register!\n" );
	 return err;
      }
   }
   else // model == BUMBLEBEE
   {
      // This is a Bumblebee "1".  This camera does not support the
      // sensor board info register so we need to determine if it is color
      // and the resolution the hard way
      //	
      // It will be nice when we don't need to support BB1 anymore as it is
      // not completely DC-compliant

      dc1394video_modes_t 	video_modes;
      err = dc1394_video_get_supported_modes( camera, &video_modes );
      if ( err != DC1394_SUCCESS ) 
      {
	 fprintf( stderr, "Can't get video modes\n" );
	 return err;
      }

      // find the highest res mode that is greyscale (MONO16)
      printf( "Searching for the highest resolution MONO16 mode available...\n" );
      dc1394video_mode_t 	video_mode;
      dc1394color_coding_t 	coding;
      for ( int i = video_modes.num-1; i >= 0; i-- ) 
      {
	 // don't consider FORMAT 7 modes (i.e. "scalable")
	 if ( !dc1394_is_video_mode_scalable( video_modes.modes[i] ) ) 
	 {
	    dc1394_get_color_coding_from_video_mode( camera, video_modes.modes[i], &coding );
	    if ( coding == DC1394_COLOR_CODING_MONO16 ) 
	    {
	       video_mode = video_modes.modes[i];
	       break;
	    }
	 }
      }
      if ( video_mode == DC1394_VIDEO_MODE_640x480_MONO16 )
      {
	 stereoCamera->nRows = 480;
	 stereoCamera->nCols = 640;
      }
      else if ( video_mode == DC1394_VIDEO_MODE_1024x768_MONO16 )
      {
	 stereoCamera->nRows = 768;
	 stereoCamera->nCols = 1024;
      }
      else
      {
	 fprintf( stderr, "Cannot find valid MONO16 video mode!\n" );
	 return DC1394_FAILURE;
      }


      dc1394color_filter_t bayerPattern;
      err = getBayerTile( stereoCamera->camera, &bayerPattern );
      if ( err != DC1394_SUCCESS ) 
      {
	 fprintf( stderr, "Failed to read the Bayer Tile Pattern register\n" );
	 return err;
      }
      // at this point all we need to know is "is it color or mono?"
      if ( bayerPattern == 0 )
	 stereoCamera->bColor = false;
      else
	 stereoCamera->bColor = true;
      
   }
   
   // a hack to figure out how many bytes per pixel are needed.
   // if the camera is a BB3, then it is 3, otherwise 2
   if ( stereoCamera->nRows == 960 )
   {
      //stereoCamera->nBytesPerPixel	= 3;
      // note: for performance reasons we have changed the default behavior
      // of the XB3 for these examples to only use the 2 wide-baseline pair.
      // This makes for faster image transmission.
      // If you change the code to transmit all 3 images, this value will 
      // have to revert to 3.
      stereoCamera->nBytesPerPixel	= 2;
   }
   else
   {
      stereoCamera->nBytesPerPixel	= 2;
   }
   
   return DC1394_SUCCESS;
}