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 ); } }
//============================================================================= // 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; }
//============================================================================= // 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; }