64
64
// read/write
65
65
// CAP_PROP_AUTO_EXPOSURE(0|1)
66
66
// CAP_PROP_EXPOSURE(t), t in seconds
67
+ // CAP_PROP_BRIGHTNESS (ev), exposure compensation in EV for auto exposure algorithm
67
68
// CAP_PROP_GAIN(g), g >=0 or -1 for automatic control if CAP_PROP_AUTO_EXPOSURE is true
68
69
// CAP_PROP_FPS(f)
69
70
// CAP_PROP_FOURCC(type)
77
78
// video/x-raw, fourcc:'GREY' -> 8bit, 1 channel
78
79
// video/x-raw, fourcc:'Y800' -> 8bit, 1 channel
79
80
// video/x-raw, fourcc:'Y12 ' -> 12bit, 1 channel
81
+ // video/x-raw, fourcc:'Y16 ' -> 16bit, 1 channel
80
82
//
81
83
82
84
#define MODE_GREY CV_FOURCC_MACRO (' G' ,' R' ,' E' ,' Y' )
83
85
#define MODE_Y800 CV_FOURCC_MACRO (' Y' ,' 8' ,' 0' ,' 0' )
84
86
#define MODE_Y12 CV_FOURCC_MACRO (' Y' ,' 1' ,' 2' ,' ' )
87
+ #define MODE_Y16 CV_FOURCC_MACRO (' Y' ,' 1' ,' 6' ,' ' )
85
88
86
89
#define CLIP (a,b,c ) (cv::max(cv::min((a),(c)),(b)))
87
90
@@ -139,6 +142,7 @@ class CvCaptureCAM_Aravis : public CvCapture
139
142
double exposureMax; // Camera's maximum exposure time.
140
143
141
144
bool controlExposure; // Flag if automatic exposure shall be done by this SW
145
+ double exposureCompensation;
142
146
bool autoGain;
143
147
double targetGrey; // Target grey value (mid grey))
144
148
@@ -179,10 +183,11 @@ CvCaptureCAM_Aravis::CvCaptureCAM_Aravis()
179
183
xoffset = yoffset = width = height = 0 ;
180
184
fpsMin = fpsMax = gainMin = gainMax = exposureMin = exposureMax = 0 ;
181
185
controlExposure = false ;
186
+ exposureCompensation = 0 ;
182
187
targetGrey = 0 ;
183
188
frameID = prevFrameID = 0 ;
184
189
185
- num_buffers = 50 ;
190
+ num_buffers = 10 ;
186
191
frame = NULL ;
187
192
}
188
193
@@ -314,6 +319,7 @@ IplImage* CvCaptureCAM_Aravis::retrieveFrame(int)
314
319
channels = 1 ;
315
320
break ;
316
321
case ARV_PIXEL_FORMAT_MONO_12:
322
+ case ARV_PIXEL_FORMAT_MONO_16:
317
323
depth = IPL_DEPTH_16U;
318
324
channels = 1 ;
319
325
break ;
@@ -334,8 +340,8 @@ IplImage* CvCaptureCAM_Aravis::retrieveFrame(int)
334
340
}
335
341
cvCopy (&src, frame);
336
342
337
- if (controlExposure && ((frameID - prevFrameID) > 1 )) {
338
- // control exposure every second frame
343
+ if (controlExposure && ((frameID - prevFrameID) >= 3 )) {
344
+ // control exposure every third frame
339
345
// i.e. skip frame taken with previous exposure setup
340
346
autoExposureControl (frame);
341
347
}
@@ -372,15 +378,15 @@ void CvCaptureCAM_Aravis::autoExposureControl(IplImage* image)
372
378
midGrey = brightness;
373
379
374
380
double maxe = 1e6 / fps;
375
- double ne = CLIP ( ( exposure * d ) / dmid, exposureMin, maxe);
381
+ double ne = CLIP ( ( exposure * d ) / ( dmid * pow ( sqrt ( 2 ), - 2 * exposureCompensation) ) , exposureMin, maxe);
376
382
377
383
// if change of value requires intervention
378
- if (fabs (d-dmid) > 5 ) {
384
+ if (std:: fabs (d-dmid) > 5 ) {
379
385
double ev, ng = 0 ;
380
386
381
387
if (gainAvailable && autoGain) {
382
388
ev = log ( d / dmid ) / log (2 );
383
- ng = CLIP ( gain + ev, gainMin, gainMax);
389
+ ng = CLIP ( gain + ev + exposureCompensation , gainMin, gainMax);
384
390
385
391
if ( ng < gain ) {
386
392
// piority 1 - reduce gain
@@ -390,8 +396,9 @@ void CvCaptureCAM_Aravis::autoExposureControl(IplImage* image)
390
396
}
391
397
392
398
if (exposureAvailable) {
393
- if (abs (exposure - ne) > 2 ) {
394
- // priority 2 - control of exposure time
399
+ // priority 2 - control of exposure time
400
+ if (std::fabs (exposure - ne) > 2 ) {
401
+ // we have not yet reach the max-e level
395
402
arv_camera_set_exposure_time (camera, (exposure = ne) );
396
403
return ;
397
404
}
@@ -436,6 +443,9 @@ double CvCaptureCAM_Aravis::getProperty( int property_id ) const
436
443
case CV_CAP_PROP_AUTO_EXPOSURE:
437
444
return (controlExposure ? 1 : 0 );
438
445
446
+ case CV_CAP_PROP_BRIGHTNESS:
447
+ return exposureCompensation;
448
+
439
449
case CV_CAP_PROP_EXPOSURE:
440
450
if (exposureAvailable) {
441
451
/* exposure time in seconds, like 1/100 s */
@@ -463,6 +473,8 @@ double CvCaptureCAM_Aravis::getProperty( int property_id ) const
463
473
return MODE_Y800;
464
474
case ARV_PIXEL_FORMAT_MONO_12:
465
475
return MODE_Y12;
476
+ case ARV_PIXEL_FORMAT_MONO_16:
477
+ return MODE_Y16;
466
478
}
467
479
}
468
480
break ;
@@ -490,6 +502,9 @@ bool CvCaptureCAM_Aravis::setProperty( int property_id, double value )
490
502
}
491
503
}
492
504
break ;
505
+ case CV_CAP_PROP_BRIGHTNESS:
506
+ exposureCompensation = CLIP (value, -3 ., 3 .);
507
+ break ;
493
508
494
509
case CV_CAP_PROP_EXPOSURE:
495
510
if (exposureAvailable) {
@@ -528,6 +543,10 @@ bool CvCaptureCAM_Aravis::setProperty( int property_id, double value )
528
543
newFormat = ARV_PIXEL_FORMAT_MONO_12;
529
544
targetGrey = 2048 ;
530
545
break ;
546
+ case MODE_Y16:
547
+ newFormat = ARV_PIXEL_FORMAT_MONO_16;
548
+ targetGrey = 32768 ;
549
+ break ;
531
550
}
532
551
if (newFormat != pixelFormat) {
533
552
stopCapture ();
@@ -570,7 +589,6 @@ bool CvCaptureCAM_Aravis::startCapture()
570
589
{
571
590
if (init_buffers () ) {
572
591
arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_CONTINUOUS);
573
- arv_device_set_string_feature_value (arv_camera_get_device (camera), " TriggerMode" , " Off" );
574
592
arv_camera_start_acquisition (camera);
575
593
576
594
return true ;
0 commit comments