Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
//=============================================================================
// 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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
/**
 * 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;
}
Exemplo n.º 5
0
//=============================================================================
// 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;
}
Exemplo n.º 6
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);
    }

    // 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;
}
Exemplo n.º 7
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;
}