@ -64,6 +64,7 @@
// read/write
// CAP_PROP_AUTO_EXPOSURE(0|1)
// CAP_PROP_EXPOSURE(t), t in seconds
// CAP_PROP_BRIGHTNESS (ev), exposure compensation in EV for auto exposure algorithm
// CAP_PROP_GAIN(g), g >=0 or -1 for automatic control if CAP_PROP_AUTO_EXPOSURE is true
// CAP_PROP_FPS(f)
// CAP_PROP_FOURCC(type)
@ -77,11 +78,13 @@
// video/x-raw, fourcc:'GREY' -> 8bit, 1 channel
// video/x-raw, fourcc:'Y800' -> 8bit, 1 channel
// video/x-raw, fourcc:'Y12 ' -> 12bit, 1 channel
// video/x-raw, fourcc:'Y16 ' -> 16bit, 1 channel
//
# define MODE_GREY CV_FOURCC_MACRO('G','R','E','Y')
# define MODE_Y800 CV_FOURCC_MACRO('Y','8','0','0')
# define MODE_Y12 CV_FOURCC_MACRO('Y','1','2',' ')
# define MODE_Y16 CV_FOURCC_MACRO('Y','1','6',' ')
# define CLIP(a,b,c) (cv::max(cv::min((a),(c)),(b)))
@ -139,6 +142,7 @@ protected:
double exposureMax ; // Camera's maximum exposure time.
bool controlExposure ; // Flag if automatic exposure shall be done by this SW
double exposureCompensation ;
bool autoGain ;
double targetGrey ; // Target grey value (mid grey))
@ -179,10 +183,11 @@ CvCaptureCAM_Aravis::CvCaptureCAM_Aravis()
xoffset = yoffset = width = height = 0 ;
fpsMin = fpsMax = gainMin = gainMax = exposureMin = exposureMax = 0 ;
controlExposure = false ;
exposureCompensation = 0 ;
targetGrey = 0 ;
frameID = prevFrameID = 0 ;
num_buffers = 5 0;
num_buffers = 1 0;
frame = NULL ;
}
@ -314,6 +319,7 @@ IplImage* CvCaptureCAM_Aravis::retrieveFrame(int)
channels = 1 ;
break ;
case ARV_PIXEL_FORMAT_MONO_12 :
case ARV_PIXEL_FORMAT_MONO_16 :
depth = IPL_DEPTH_16U ;
channels = 1 ;
break ;
@ -334,8 +340,8 @@ IplImage* CvCaptureCAM_Aravis::retrieveFrame(int)
}
cvCopy ( & src , frame ) ;
if ( controlExposure & & ( ( frameID - prevFrameID ) > 1 ) ) {
// control exposure every secon d frame
if ( controlExposure & & ( ( frameID - prevFrameID ) > = 3 ) ) {
// control exposure every thir d frame
// i.e. skip frame taken with previous exposure setup
autoExposureControl ( frame ) ;
}
@ -372,15 +378,15 @@ void CvCaptureCAM_Aravis::autoExposureControl(IplImage* image)
midGrey = brightness ;
double maxe = 1e6 / fps ;
double ne = CLIP ( ( exposure * d ) / dmid , exposureMin , maxe ) ;
double ne = CLIP ( ( exposure * d ) / ( dmid * pow ( sqrt ( 2 ) , - 2 * exposureCompensation ) ) , exposureMin , maxe ) ;
// if change of value requires intervention
if ( fabs ( d - dmid ) > 5 ) {
if ( std : : fabs ( d - dmid ) > 5 ) {
double ev , ng = 0 ;
if ( gainAvailable & & autoGain ) {
ev = log ( d / dmid ) / log ( 2 ) ;
ng = CLIP ( gain + ev , gainMin , gainMax ) ;
ng = CLIP ( gain + ev + exposureCompensation , gainMin , gainMax ) ;
if ( ng < gain ) {
// piority 1 - reduce gain
@ -390,8 +396,9 @@ void CvCaptureCAM_Aravis::autoExposureControl(IplImage* image)
}
if ( exposureAvailable ) {
if ( abs ( exposure - ne ) > 2 ) {
// priority 2 - control of exposure time
if ( std : : fabs ( exposure - ne ) > 2 ) {
// we have not yet reach the max-e level
arv_camera_set_exposure_time ( camera , ( exposure = ne ) ) ;
return ;
}
@ -436,6 +443,9 @@ double CvCaptureCAM_Aravis::getProperty( int property_id ) const
case CV_CAP_PROP_AUTO_EXPOSURE :
return ( controlExposure ? 1 : 0 ) ;
case CV_CAP_PROP_BRIGHTNESS :
return exposureCompensation ;
case CV_CAP_PROP_EXPOSURE :
if ( exposureAvailable ) {
/* exposure time in seconds, like 1/100 s */
@ -463,6 +473,8 @@ double CvCaptureCAM_Aravis::getProperty( int property_id ) const
return MODE_Y800 ;
case ARV_PIXEL_FORMAT_MONO_12 :
return MODE_Y12 ;
case ARV_PIXEL_FORMAT_MONO_16 :
return MODE_Y16 ;
}
}
break ;
@ -490,6 +502,9 @@ bool CvCaptureCAM_Aravis::setProperty( int property_id, double value )
}
}
break ;
case CV_CAP_PROP_BRIGHTNESS :
exposureCompensation = CLIP ( value , - 3. , 3. ) ;
break ;
case CV_CAP_PROP_EXPOSURE :
if ( exposureAvailable ) {
@ -528,6 +543,10 @@ bool CvCaptureCAM_Aravis::setProperty( int property_id, double value )
newFormat = ARV_PIXEL_FORMAT_MONO_12 ;
targetGrey = 2048 ;
break ;
case MODE_Y16 :
newFormat = ARV_PIXEL_FORMAT_MONO_16 ;
targetGrey = 32768 ;
break ;
}
if ( newFormat ! = pixelFormat ) {
stopCapture ( ) ;
@ -570,7 +589,6 @@ bool CvCaptureCAM_Aravis::startCapture()
{
if ( init_buffers ( ) ) {
arv_camera_set_acquisition_mode ( camera , ARV_ACQUISITION_MODE_CONTINUOUS ) ;
arv_device_set_string_feature_value ( arv_camera_get_device ( camera ) , " TriggerMode " , " Off " ) ;
arv_camera_start_acquisition ( camera ) ;
return true ;