@ -60,6 +60,7 @@
# ifdef WIN32
# include <io.h>
# else
# include <time.h>
# include <unistd.h>
# endif
@ -106,18 +107,14 @@ protected:
} tCamera ;
IplImage * frame ;
IplImage * grayframe ;
tCamera Camera ;
tPvErr Errcode ;
bool monocrome ;
} ;
CvCaptureCAM_PvAPI : : CvCaptureCAM_PvAPI ( )
{
monocrome = false ;
frame = NULL ;
grayframe = NULL ;
memset ( & this - > Camera , 0 , sizeof ( this - > Camera ) ) ;
}
@ -190,13 +187,6 @@ bool CvCaptureCAM_PvAPI::open( int index )
tPvUint32 frameWidth , frameHeight ;
unsigned long maxSize ;
// By Default, try to set the pixel format to Mono8. This can be changed later
// via calls to setProperty. Some colour cameras (i.e. the Manta line) have a default
// image mode of Bayer8, which is currently unsupported, so Mono8 is a safe bet for
// startup.
monocrome = ( PvAttrEnumSet ( Camera . Handle , " PixelFormat " , " Mono8 " ) = = ePvErrSuccess ) ;
PvAttrUint32Get ( Camera . Handle , " Width " , & frameWidth ) ;
PvAttrUint32Get ( Camera . Handle , " Height " , & frameHeight ) ;
@ -229,15 +219,9 @@ bool CvCaptureCAM_PvAPI::grabFrame()
IplImage * CvCaptureCAM_PvAPI : : retrieveFrame ( int )
{
if ( PvCaptureWaitForFrameDone ( Camera . Handle , & ( Camera . Frame ) , 1000 ) = = ePvErrSuccess )
{
if ( ! monocrome )
{
cvMerge ( grayframe , grayframe , grayframe , NULL , frame ) ;
return frame ;
}
return grayframe ;
return frame ;
}
else return NULL ;
}
@ -254,11 +238,6 @@ double CvCaptureCAM_PvAPI::getProperty( int property_id ) const
case CV_CAP_PROP_FRAME_HEIGHT :
PvAttrUint32Get ( Camera . Handle , " Height " , & nTemp ) ;
return ( double ) nTemp ;
case CV_CAP_PROP_MONOCROME :
if ( monocrome )
return 1 ;
else
return 0 ;
case CV_CAP_PROP_EXPOSURE :
PvAttrUint32Get ( Camera . Handle , " ExposureValue " , & nTemp ) ;
return ( double ) nTemp ;
@ -312,6 +291,25 @@ double CvCaptureCAM_PvAPI::getProperty( int property_id ) const
case CV_CAP_PROP_PVAPI_BINNINGY :
PvAttrUint32Get ( Camera . Handle , " BinningY " , & nTemp ) ;
return ( double ) nTemp ;
case CV_CAP_PROP_PVAPI_PIXELFORMAT :
char pixelFormat [ 256 ] ;
PvAttrEnumGet ( Camera . Handle , " PixelFormat " , pixelFormat , 256 , NULL ) ;
if ( strcmp ( pixelFormat , " Mono8 " ) = = 0 )
return 1.0 ;
else if ( strcmp ( pixelFormat , " Mono16 " ) = = 0 )
return 2.0 ;
else if ( strcmp ( pixelFormat , " Bayer8 " ) = = 0 )
return 3.0 ;
else if ( strcmp ( pixelFormat , " Bayer16 " ) = = 0 )
return 4.0 ;
else if ( strcmp ( pixelFormat , " Rgb24 " ) = = 0 )
return 5.0 ;
else if ( strcmp ( pixelFormat , " Bgr24 " ) = = 0 )
return 6.0 ;
else if ( strcmp ( pixelFormat , " Rgba32 " ) = = 0 )
return 7.0 ;
else if ( strcmp ( pixelFormat , " Bgra32 " ) = = 0 )
return 8.0 ;
}
return - 1.0 ;
}
@ -359,21 +357,6 @@ bool CvCaptureCAM_PvAPI::setProperty( int property_id, double value )
break ;
}
case CV_CAP_PROP_MONOCROME :
if ( value = = 1 )
{
char pixelFormat [ 256 ] ;
PvAttrEnumGet ( Camera . Handle , " PixelFormat " , pixelFormat , 256 , NULL ) ;
if ( ( strcmp ( pixelFormat , " Mono8 " ) = = 0 ) | | strcmp ( pixelFormat , " Mono16 " ) = = 0 )
{
monocrome = true ;
}
else
return false ;
}
else
monocrome = false ;
break ;
case CV_CAP_PROP_EXPOSURE :
if ( ( PvAttrUint32Set ( Camera . Handle , " ExposureValue " , ( tPvUint32 ) value ) = = ePvErrSuccess ) )
break ;
@ -449,6 +432,51 @@ bool CvCaptureCAM_PvAPI::setProperty( int property_id, double value )
break ;
else
return false ;
case CV_CAP_PROP_PVAPI_PIXELFORMAT :
{
cv : : String pixelFormat ;
if ( value = = 1 )
pixelFormat = " Mono8 " ;
else if ( value = = 2 )
pixelFormat = " Mono16 " ;
else if ( value = = 3 )
pixelFormat = " Bayer8 " ;
else if ( value = = 4 )
pixelFormat = " Bayer16 " ;
else if ( value = = 5 )
pixelFormat = " Rgb24 " ;
else if ( value = = 6 )
pixelFormat = " Bgr24 " ;
else if ( value = = 7 )
pixelFormat = " Rgba32 " ;
else if ( value = = 8 )
pixelFormat = " Bgra32 " ;
else
return false ;
if ( ( PvAttrEnumSet ( Camera . Handle , " PixelFormat " , pixelFormat . c_str ( ) ) = = ePvErrSuccess ) )
{
tPvUint32 currWidth ;
tPvUint32 currHeight ;
PvAttrUint32Get ( Camera . Handle , " Width " , & currWidth ) ;
PvAttrUint32Get ( Camera . Handle , " Height " , & currHeight ) ;
stopCapture ( ) ;
// Reallocate Frames
if ( ! resizeCaptureFrame ( currWidth , currHeight ) )
{
startCapture ( ) ;
return false ;
}
startCapture ( ) ;
return true ;
}
else
return false ;
}
default :
return false ;
}
@ -495,13 +523,6 @@ bool CvCaptureCAM_PvAPI::resizeCaptureFrame (int frameWidth, int frameHeight)
tPvUint32 sensorHeight ;
tPvUint32 sensorWidth ;
if ( grayframe )
{
cvReleaseImage ( & grayframe ) ;
grayframe = NULL ;
}
if ( frame )
{
cvReleaseImage ( & frame ) ;
@ -544,31 +565,34 @@ bool CvCaptureCAM_PvAPI::resizeCaptureFrame (int frameWidth, int frameHeight)
PvAttrUint32Get ( Camera . Handle , " TotalBytesPerFrame " , & frameSize ) ;
if ( strcmp ( pixelFormat , " Mono8 " ) = = 0 )
if ( ( strcmp ( pixelFormat , " Mono8 " ) = = 0 ) | | ( strcmp ( pixelFormat , " Bayer8 " ) = = 0 ) )
{
grayframe = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_8U , 1 ) ;
grayframe - > widthStep = ( int ) frameWidth ;
frame = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_8U , 3 ) ;
frame - > widthStep = ( int ) frameWidth * 3 ;
frame = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_8U , 1 ) ;
frame - > widthStep = ( int ) frameWidth ;
Camera . Frame . ImageBufferSize = frameSize ;
Camera . Frame . ImageBuffer = gray frame- > imageData ;
Camera . Frame . ImageBuffer = frame - > imageData ;
}
else if ( strcmp ( pixelFormat , " Mono16 " ) = = 0 )
else if ( ( strcmp ( pixelFormat , " Mono16 " ) = = 0 ) | | ( strcmp ( pixelFormat , " Bayer16 " ) = = 0 ) )
{
grayframe = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_16U , 1 ) ;
grayframe - > widthStep = ( int ) frameWidth ;
frame = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_16U , 3 ) ;
frame - > widthStep = ( int ) frameWidth * 3 ;
frame = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_16U , 1 ) ;
frame - > widthStep = ( int ) frameWidth * 2 ;
Camera . Frame . ImageBufferSize = frameSize ;
Camera . Frame . ImageBuffer = gray frame- > imageData ;
Camera . Frame . ImageBuffer = frame - > imageData ;
}
else if ( strcmp ( pixelFormat , " Bgr24 " ) = = 0 )
else if ( ( strcmp ( pixelFormat , " Rgb24 " ) = = 0 ) | | ( strcmp ( pixelFormat , " Bgr24 " ) = = 0 ) )
{
frame = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_8U , 3 ) ;
frame - > widthStep = ( int ) frameWidth * 3 ;
Camera . Frame . ImageBufferSize = frameSize ;
Camera . Frame . ImageBuffer = frame - > imageData ;
}
else if ( ( strcmp ( pixelFormat , " Rgba32 " ) = = 0 ) | | ( strcmp ( pixelFormat , " Bgra32 " ) = = 0 ) )
{
frame = cvCreateImage ( cvSize ( ( int ) frameWidth , ( int ) frameHeight ) , IPL_DEPTH_8U , 4 ) ;
frame - > widthStep = ( int ) frameWidth * 4 ;
Camera . Frame . ImageBufferSize = frameSize ;
Camera . Frame . ImageBuffer = frame - > imageData ;
}
else
return false ;