dc1394error_t writeTriclopsConfigFromCameraToFile( dc1394camera_t* camera, const char* outputFile) { dc1394error_t err; uint32_t ulQuadlet; err = dc1394_get_control_register( camera, REG_CONFIG_LENGTH, &ulQuadlet ); if ( err != DC1394_SUCCESS ) { fprintf(stderr, "dc1394_get_control_register(REG_CONFIG_LENGTH) failed\n"); return err; } // the length of the config file unsigned long ulFileSizeBytes = ulQuadlet; if( ulFileSizeBytes == 0 ) { fprintf( stderr, "File size == 0!\n" ); return DC1394_FAILURE; } FILE* pfile = fopen( outputFile, "w" ); if ( !pfile ) { fprintf( stderr, "Can't open temporary file\n" ); return DC1394_FAILURE; } // Read the config file, and save it to the output file, // while fixing endianness. for( unsigned long offset = 0 ; offset < ulFileSizeBytes; offset += 4 ) { err = dc1394_get_control_register( camera, REG_CONFIG_DATA + offset, &ulQuadlet ); if( err != DC1394_SUCCESS ) { fprintf( stderr, "Can't get control register 0x%x\n", (int) (REG_CONFIG_DATA+offset) ); fclose( pfile ); return err; } for( int i = 24; i >= 0; i -= 8 ) { fputc( ( (ulQuadlet>>i) & 0xFF ), pfile ); } } fclose( pfile ); return DC1394_SUCCESS; }
//============================================================================= // getSensorInfo() // This function queries the SENSOR BOARD INFO register and extracts // the sensor resolution and whether it is color or monochrome from the // register // // This is a PGR camera specific register // For more information check the PGR IEEE-1394 Digital Camera Register // Reference // dc1394error_t getSensorInfo( dc1394camera_t* camera, bool* pbColor, unsigned int* pnRows, unsigned int* pnCols ) { uint32_t value; dc1394error_t err; // This register is an advanced PGR register called SENSOR_BOARD_INFO err = dc1394_get_control_register( camera, SENSOR_BOARD_INFO_REGISTER, &value ); if ( err != DC1394_SUCCESS ) { return err; } unsigned char ucSensorInfo = 0xf & value; switch( ucSensorInfo ) { default: // unknown sensor! printf( "Illegal sensor board info detected!\n" ); return DC1394_FAILURE; case 0xA: // color 640x480 *pbColor = true; *pnRows = 480; *pnCols = 640; break; case 0xB: // mono 640x480 *pbColor = false; *pnRows = 480; *pnCols = 640; break; case 0xC: // color 1024x768 *pbColor = true; *pnRows = 768; *pnCols = 1024; break; case 0xD: // mono 1024x768 *pbColor = false; *pnRows = 768; *pnCols = 1024; break; case 0xE: // color 1280x960 *pbColor = true; *pnRows = 960; *pnCols = 1280; break; case 0xF: // mono 1280x960 *pbColor = false; *pnRows = 960; *pnCols = 1280; break; } return err; }
static uint32_t getControlRegister(dc1394camera_t *camera, uint64_t offset) { uint32_t value = 0; dc1394error_t err = dc1394_get_control_register(camera, offset, &value); assert(err == DC1394_SUCCESS); return err == DC1394_SUCCESS ? value : 0xffffffff; }
/** * Read a register from the MT9V022 sensor. * This writes the MT9V022 register address to 0x1A00 and then reads from 0x1A04 */ dc1394error_t FFMVCCD::readMicronReg(unsigned int offset, unsigned int *val) { dc1394error_t err; err = dc1394_set_control_register(dcam, 0x1A00, offset); if (err != DC1394_SUCCESS) { return err; } err = dc1394_get_control_register(dcam, 0x1A04, val); if (err != DC1394_SUCCESS) { return err; } return DC1394_SUCCESS; }
//============================================================================= // getBayerTile() // Query the PGR specific register that indicates the Bayer tile pattern // color coding for this camera. // // For more information check the PGR IEEE-1394 Digital Camera Register // Reference // dc1394error_t getBayerTile( dc1394camera_t* camera, dc1394color_filter_t* bayerPattern ) { uint32_t value; dc1394error_t err; // query register 0x1040 // This register is an advanced PGR register called BAYER_TILE_MAPPING // For more information check the PGR IEEE-1394 Digital Camera Register Reference err = dc1394_get_control_register( camera, BAYER_TILE_MAPPING_REGISTER, &value ); if ( err != DC1394_SUCCESS ) { return err; } // Ascii R = 52 G = 47 B = 42 Y = 59 switch( value ) { default: case 0x59595959: // YYYY // no bayer *bayerPattern = (dc1394color_filter_t) 0; break; case 0x52474742: // RGGB *bayerPattern = DC1394_COLOR_FILTER_RGGB; break; case 0x47425247: // GBRG *bayerPattern = DC1394_COLOR_FILTER_GBRG; break; case 0x47524247: // GRBG *bayerPattern = DC1394_COLOR_FILTER_GRBG; break; case 0x42474752: // BGGR *bayerPattern = DC1394_COLOR_FILTER_BGGR; break; } return err; }
bool CvCaptureCAM_DC1394_v2_CPP::startCapture() { int i; int code = 0; if (!dcCam) return false; if (isoSpeed > 0) { code = dc1394_video_set_iso_speed(dcCam, isoSpeed <= 100 ? DC1394_ISO_SPEED_100 : isoSpeed <= 200 ? DC1394_ISO_SPEED_200 : isoSpeed <= 400 ? DC1394_ISO_SPEED_400 : isoSpeed <= 800 ? DC1394_ISO_SPEED_800 : isoSpeed == 1600 ? DC1394_ISO_SPEED_1600 : DC1394_ISO_SPEED_3200); } // should a specific mode be used if (userMode >= 0) { dc1394video_mode_t wantedMode; dc1394video_modes_t videoModes; dc1394_video_get_supported_modes(dcCam, &videoModes); //set mode from number, for example the second supported mode, i.e userMode = 1 if (userMode < (int)videoModes.num) { wantedMode = videoModes.modes[userMode]; } //set modes directly from DC134 constants (from dc1394video_mode_t) else if ((userMode >= DC1394_VIDEO_MODE_MIN) && (userMode <= DC1394_VIDEO_MODE_MAX )) { //search for wanted mode, to check if camera supports it int j = 0; while ((j< (int)videoModes.num) && videoModes.modes[j]!=userMode) { j++; } if ((int)videoModes.modes[j]==userMode) { wantedMode = videoModes.modes[j]; } else { userMode = -1; // wanted mode not supported, search for best mode } } else { userMode = -1; // wanted mode not supported, search for best mode } //if userMode is available: set it and update size if (userMode != -1) { code = dc1394_video_set_mode(dcCam, wantedMode); uint32_t width, height; dc1394_get_image_size_from_video_mode(dcCam, wantedMode, &width, &height); frameWidth = (int)width; frameHeight = (int)height; } } if (userMode == -1 && (frameWidth > 0 || frameHeight > 0)) { dc1394video_mode_t bestMode = (dc1394video_mode_t) - 1; dc1394video_modes_t videoModes; dc1394_video_get_supported_modes(dcCam, &videoModes); for (i = 0; i < (int)videoModes.num; i++) { dc1394video_mode_t mode = videoModes.modes[i]; if (mode >= DC1394_VIDEO_MODE_FORMAT7_MIN && mode <= DC1394_VIDEO_MODE_FORMAT7_MAX) continue; int pref = -1; dc1394color_coding_t colorCoding; dc1394_get_color_coding_from_video_mode(dcCam, mode, &colorCoding); uint32_t width, height; dc1394_get_image_size_from_video_mode(dcCam, mode, &width, &height); if ((int)width == frameWidth || (int)height == frameHeight) { if (colorCoding == DC1394_COLOR_CODING_RGB8 || colorCoding == DC1394_COLOR_CODING_RAW8) { bestMode = mode; break; } if (colorCoding == DC1394_COLOR_CODING_YUV411 || colorCoding == DC1394_COLOR_CODING_YUV422 || (colorCoding == DC1394_COLOR_CODING_YUV444 && pref < 1)) { bestMode = mode; pref = 1; break; } if (colorCoding == DC1394_COLOR_CODING_MONO8) { bestMode = mode; pref = 0; } } } if ((int)bestMode >= 0) code = dc1394_video_set_mode(dcCam, bestMode); } if (fps > 0) { dc1394video_mode_t mode; dc1394framerates_t framerates; double minDiff = DBL_MAX; dc1394framerate_t bestFps = (dc1394framerate_t) - 1; dc1394_video_get_mode(dcCam, &mode); dc1394_video_get_supported_framerates(dcCam, mode, &framerates); for (i = 0; i < (int)framerates.num; i++) { dc1394framerate_t ifps = framerates.framerates[i]; double fps1 = (1 << (ifps - DC1394_FRAMERATE_1_875)) * 1.875; double diff = fabs(fps1 - fps); if (diff < minDiff) { minDiff = diff; bestFps = ifps; } } if ((int)bestFps >= 0) code = dc1394_video_set_framerate(dcCam, bestFps); } if (cameraId == VIDERE) { bayerFilter = DC1394_COLOR_FILTER_GBRG; nimages = 2; uint32_t value = 0; dc1394_get_control_register(dcCam, 0x50c, &value); colorStereo = (value & 0x80000000) != 0; } code = dc1394_capture_setup(dcCam, nDMABufs, DC1394_CAPTURE_FLAGS_DEFAULT); if (code >= 0) { FD_SET(dc1394_capture_get_fileno(dcCam), &dc1394.camFds); dc1394_video_set_transmission(dcCam, DC1394_ON); if (cameraId == VIDERE) { enum { PROC_MODE_OFF, PROC_MODE_NONE, PROC_MODE_TEST, PROC_MODE_RECTIFIED, PROC_MODE_DISPARITY, PROC_MODE_DISPARITY_RAW }; int procMode = PROC_MODE_RECTIFIED; usleep(100000); uint32_t qval1 = 0x08000000 | (0x90 << 16) | ((procMode & 0x7) << 16); uint32_t qval2 = 0x08000000 | (0x9C << 16); dc1394_set_control_register(dcCam, 0xFF000, qval1); dc1394_set_control_register(dcCam, 0xFF000, qval2); } started = true; } return code >= 0; }
bool CvCaptureCAM_DC1394_v2_CPP::startCapture() { int i; int code = 0; if (!dcCam) return false; if (isoSpeed > 0) { code = dc1394_video_set_iso_speed(dcCam, isoSpeed <= 100 ? DC1394_ISO_SPEED_100 : isoSpeed <= 200 ? DC1394_ISO_SPEED_200 : isoSpeed <= 400 ? DC1394_ISO_SPEED_400 : isoSpeed <= 800 ? DC1394_ISO_SPEED_800 : isoSpeed == 1600 ? DC1394_ISO_SPEED_1600 : DC1394_ISO_SPEED_3200); } if (frameWidth > 0 || frameHeight > 0) { dc1394video_mode_t bestMode = (dc1394video_mode_t) - 1; dc1394video_modes_t videoModes; dc1394_video_get_supported_modes(dcCam, &videoModes); for (i = 0; i < (int)videoModes.num; i++) { dc1394video_mode_t mode = videoModes.modes[i]; if (mode >= DC1394_VIDEO_MODE_FORMAT7_MIN && mode <= DC1394_VIDEO_MODE_FORMAT7_MAX) continue; int pref = -1; dc1394color_coding_t colorCoding; dc1394_get_color_coding_from_video_mode(dcCam, mode, &colorCoding); uint32_t width, height; dc1394_get_image_size_from_video_mode(dcCam, mode, &width, &height); if ((int)width == frameWidth || (int)height == frameHeight) { if (colorCoding == DC1394_COLOR_CODING_RGB8 || colorCoding == DC1394_COLOR_CODING_RGB16 || colorCoding == DC1394_COLOR_CODING_RAW8 || colorCoding == DC1394_COLOR_CODING_RAW16) { bestMode = mode; break; } if (colorCoding == DC1394_COLOR_CODING_YUV411 || colorCoding == DC1394_COLOR_CODING_YUV422 || (colorCoding == DC1394_COLOR_CODING_YUV444 && pref < 1)) { bestMode = mode; pref = 1; } if (colorCoding == DC1394_COLOR_CODING_MONO8 || (colorCoding == DC1394_COLOR_CODING_MONO16 && pref < 0)) { bestMode = mode; pref = 0; } } } if ((int)bestMode >= 0) code = dc1394_video_set_mode(dcCam, bestMode); } if (fps > 0) { dc1394video_mode_t mode; dc1394framerates_t framerates; double minDiff = DBL_MAX; dc1394framerate_t bestFps = (dc1394framerate_t) - 1; dc1394_video_get_mode(dcCam, &mode); dc1394_video_get_supported_framerates(dcCam, mode, &framerates); for (i = 0; i < (int)framerates.num; i++) { dc1394framerate_t ifps = framerates.framerates[i]; double fps1 = (1 << (ifps - DC1394_FRAMERATE_1_875)) * 1.875; double diff = fabs(fps1 - fps); if (diff < minDiff) { minDiff = diff; bestFps = ifps; } } if ((int)bestFps >= 0) code = dc1394_video_set_framerate(dcCam, bestFps); } if (cameraId == VIDERE) { bayerFilter = DC1394_COLOR_FILTER_GBRG; nimages = 2; uint32_t value = 0; dc1394_get_control_register(dcCam, 0x50c, &value); colorStereo = (value & 0x80000000) != 0; } code = dc1394_capture_setup(dcCam, nDMABufs, DC1394_CAPTURE_FLAGS_DEFAULT); if (code >= 0) { FD_SET(dc1394_capture_get_fileno(dcCam), &dc1394.camFds); dc1394_video_set_transmission(dcCam, DC1394_ON); if (cameraId == VIDERE) { enum { PROC_MODE_OFF, PROC_MODE_NONE, PROC_MODE_TEST, PROC_MODE_RECTIFIED, PROC_MODE_DISPARITY, PROC_MODE_DISPARITY_RAW }; int procMode = PROC_MODE_RECTIFIED; usleep(100000); uint32_t qval1 = 0x08000000 | (0x90 << 16) | ((procMode & 0x7) << 16); uint32_t qval2 = 0x08000000 | (0x9C << 16); dc1394_set_control_register(dcCam, 0xFF000, qval1); dc1394_set_control_register(dcCam, 0xFF000, qval2); } started = true; } return code >= 0; }