示例#1
0
bool DeinterlaceDriver::Capture( hal::CameraMsg& vImages )
{
    m_Message.Clear();
    m_Input->Capture( m_Message );

    if( m_Message.mutable_image(0)->type() != hal::PB_UNSIGNED_SHORT ) {
      std::cerr << "HAL: Error! Expecting image with depth of 16 bits." << std::endl;
      return false;
    }

    vImages.set_device_time( m_Message.device_time() );

    dc1394_deinterlace_stereo((uint8_t*)m_Message.mutable_image(0)->data().data(),
                              (uint8_t*)m_Buffer, m_nImgWidth*2, m_nImgHeight);

    const unsigned int nImgSize = m_nImgWidth * m_nImgHeight;

    hal::ImageMsg* pbImg = vImages.add_image();
    pbImg->set_width( m_nImgWidth );
    pbImg->set_height( m_nImgHeight );
    pbImg->set_data( m_Buffer, nImgSize );
    pbImg->set_type( hal::PB_UNSIGNED_BYTE );
    pbImg->set_format( m_Message.mutable_image(0)->format() );

    pbImg = vImages.add_image();
    pbImg->set_width( m_nImgWidth );
    pbImg->set_height( m_nImgHeight );
    pbImg->set_data( m_Buffer+nImgSize, nImgSize);
    pbImg->set_type( hal::PB_UNSIGNED_BYTE );
    pbImg->set_format( m_Message.mutable_image(0)->format() );

    return true;
}
示例#2
0
static dc1394error_t dc1394_deinterlace_stereo_frames_fixed(dc1394video_frame_t *in,
    dc1394video_frame_t *out, dc1394stereo_method_t method)
{
    if((in->color_coding == DC1394_COLOR_CODING_RAW16) ||
       (in->color_coding == DC1394_COLOR_CODING_MONO16) ||
       (in->color_coding == DC1394_COLOR_CODING_YUV422))
    {
        switch (method)
        {

        case DC1394_STEREO_METHOD_INTERLACED:
            adaptBufferStereoLocal(in, out);
//FIXED by AB:
//          dc1394_deinterlace_stereo(in->image, out->image, in->size[0], in->size[1]);
            dc1394_deinterlace_stereo(in->image, out->image, out->size[0], out->size[1]);
            break;

        case DC1394_STEREO_METHOD_FIELD:
            adaptBufferStereoLocal(in, out);
            memcpy(out->image, in->image, out->image_bytes);
            break;
        }

        return DC1394_INVALID_STEREO_METHOD;
    }
    else
        return DC1394_FUNCTION_NOT_SUPPORTED;
}
示例#3
0
bool DeinterlaceVideo::GrabNewest( unsigned char* image, bool wait )
{
    if(videoin->GrabNewest(buffer, wait)) {
        return ( dc1394_deinterlace_stereo(buffer,image, videoin->Streams()[0].Width(), 2*videoin->Streams()[0].Height() ) == DC1394_SUCCESS );
    }
    return false;
}
示例#4
0
//=============================================================================
// extractImagesMono()
//
// De-interleave the stereo images into single images
// Construct a TriclopsInput for stereo processing from these images.
//
void
extractImagesMono( PGRStereoCamera_t* 	stereoCamera, 
		   unsigned char* 	pucDeInterleaved,
		   unsigned char** 	ppucRightMono8,
		   unsigned char** 	ppucLeftMono8,
		   unsigned char** 	ppucCenterMono8) 
{

   dc1394error_t err;
   // RC7
   dc1394video_frame_t* frame;
   err = dc1394_capture_dequeue( stereoCamera->camera,
				 DC1394_CAPTURE_POLICY_WAIT,
				 &frame );
   if ( err != DC1394_SUCCESS )
   {
      fprintf( stderr, "extractImagesColor - cannot dequeue image!\n" );
      return;
   }

   unsigned char* pucGrabBuffer = frame->image;

   unsigned char* right;
   unsigned char* left;
   unsigned char* center;
   if ( stereoCamera->nBytesPerPixel == 2 )
   {
      // de-interlace the 16 bit data into 2 mono images
      dc1394_deinterlace_stereo( pucGrabBuffer,
				 pucDeInterleaved,
				 stereoCamera->nCols,
				 2*stereoCamera->nRows );
      right = pucDeInterleaved;
      left  = pucDeInterleaved + stereoCamera->nRows * stereoCamera->nCols;
      center= left;
   }
   else
   {
      dc1394_deinterlace_rgb( pucGrabBuffer,
			      pucDeInterleaved,
			      stereoCamera->nCols,
			      3*stereoCamera->nRows );

      // NOTE: this code needs to be double checked.
      // Currently 3-bytes-per-pixel is not activatable in this example
      right 	= pucDeInterleaved;
      center  	= pucDeInterleaved + stereoCamera->nRows * stereoCamera->nCols;
      left	= pucDeInterleaved + 2 * stereoCamera->nRows * stereoCamera->nCols;
   }
      
   *ppucRightMono8 	= right;
   *ppucLeftMono8 	= left;
   *ppucCenterMono8 	= center;

   // return buffer for use
   dc1394_capture_enqueue( stereoCamera->camera, frame );

   return;
}
示例#5
0
//=============================================================================
// extractImagesColor()
//
// De-interleave the stereo images into single bayer patterns.
// De-bayer those images into color images.
// Construct a TriclopsInput for stereo processing from these images.
//
void
extractImagesColor( PGRStereoCamera_t* 	 stereoCamera, 
		    dc1394bayer_method_t bayerMethod,
		    unsigned char* 	 pucDeInterleaved,
		    unsigned char* 	 pucRGB,
		    unsigned char* 	 pucGreen,
		    unsigned char** 	 ppucRightRGB,
		    unsigned char** 	 ppucLeftRGB,
		    unsigned char** 	 ppucCenterRGB) 
{

   dc1394error_t err;
   dc1394video_frame_t* frame;
   err = dc1394_capture_dequeue( stereoCamera->camera,
				 DC1394_CAPTURE_POLICY_WAIT,
				 &frame );
   if ( err != DC1394_SUCCESS )
   {
      fprintf( stderr, "extractImagesColor - cannot dequeue image!\n" );
      return;
   }

   unsigned char* pucGrabBuffer = frame->image;

   if ( stereoCamera->nBytesPerPixel == 2 )
   {
      // de-interlace the 16 bit data into 2 bayer tile pattern images
      dc1394_deinterlace_stereo( pucGrabBuffer,
				 pucDeInterleaved,
				 stereoCamera->nCols,
				 2*stereoCamera->nRows );
      // extract color from the bayer tile image
      // note: this will alias colors on the top and bottom rows
      dc1394_bayer_decoding_8bit( pucDeInterleaved,
				  pucRGB,
				  stereoCamera->nCols,
				  2*stereoCamera->nRows,
				  stereoCamera->bayerTile,
				  bayerMethod );
      // now deinterlace the RGB Buffer to extract the green channel
      // The green channel is a quick and dirty approximation to the mono
      // equivalent of the image and can be used for stereo processing
      dc1394_deinterlace_green( pucRGB,
				pucGreen,
				stereoCamera->nCols,
				6*stereoCamera->nRows );
      *ppucRightRGB 	= pucRGB;
      *ppucLeftRGB 	= pucRGB + 3 * stereoCamera->nRows * stereoCamera->nCols;
      *ppucCenterRGB	= *ppucLeftRGB;
   }
   else
   {
      dc1394_deinterlace_rgb( pucGrabBuffer,
			      pucDeInterleaved,
			      stereoCamera->nCols,
			      3*stereoCamera->nRows );
      // extract color from the bayer tile image
      // note: this will alias colors on the top and bottom rows
      dc1394_bayer_decoding_8bit( pucDeInterleaved,
				  pucRGB,
				  stereoCamera->nCols,
				  3*stereoCamera->nRows,
				  stereoCamera->bayerTile,
				  bayerMethod );
      // now deinterlace the RGB Buffer
      dc1394_deinterlace_green( pucRGB,
				pucGreen,
				stereoCamera->nCols,
				9*stereoCamera->nRows );
      // NOTE: this code needs to be double checked.
      // Currently 3-bytes-per-pixel is not activatable in this example
      *ppucRightRGB 	= pucRGB;
      *ppucCenterRGB 	= pucRGB + 3 * stereoCamera->nRows * stereoCamera->nCols;
      *ppucLeftRGB 	= pucRGB + 6 * stereoCamera->nRows * stereoCamera->nCols;
   }
      
   // return buffer for use
   dc1394_capture_enqueue( stereoCamera->camera, frame );
   return;
}