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