diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index 999643d241..a574232f27 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -485,6 +485,16 @@ enum { CAP_PROP_XI_DOWNSAMPLING = 400, //!< Chan //! @} XIMEA +/** @name XIMEA Camera API +* @{ +*/ + +//! Properties of cameras available through ARAVIS backend +enum { CAP_PROP_ARAVIS_AUTOTRIGGER = 600 //!< Automatically trigger frame capture if camera is configured with software trigger +}; + +//! @} ARAVIS + /** @name AVFoundation framework for iOS OS X Lion will have the same API @{ diff --git a/modules/videoio/src/cap_aravis.cpp b/modules/videoio/src/cap_aravis.cpp index 85ac38121e..0d7acee0b0 100644 --- a/modules/videoio/src/cap_aravis.cpp +++ b/modules/videoio/src/cap_aravis.cpp @@ -148,6 +148,8 @@ protected: double exposureCompensation; bool autoGain; double targetGrey; // Target grey value (mid grey)) + bool softwareTriggered; // Flag if the camera is software triggered + bool allowAutoTrigger; // Flag that user allowed to trigger software triggered cameras automatically gint64 *pixelFormats; guint pixelFormatsCnt; @@ -189,6 +191,7 @@ CvCaptureCAM_Aravis::CvCaptureCAM_Aravis() exposureCompensation = 0; targetGrey = 0; frameID = prevFrameID = 0; + allowAutoTrigger = false; num_buffers = 10; frame = NULL; @@ -275,6 +278,7 @@ bool CvCaptureCAM_Aravis::open( int index ) exposure = exposureAvailable ? arv_camera_get_exposure_time(camera) : 0; gain = gainAvailable ? arv_camera_get_gain(camera) : 0; fps = arv_camera_get_frame_rate(camera); + softwareTriggered = (strcmp(arv_camera_get_trigger_source(camera), "Software") == 0); return startCapture(); } @@ -290,6 +294,9 @@ bool CvCaptureCAM_Aravis::grabFrame() ArvBuffer *arv_buffer = NULL; int max_tries = 10; int tries = 0; + if (softwareTriggered && allowAutoTrigger) { + arv_camera_software_trigger (camera); + } for(; tries < max_tries; tries ++) { arv_buffer = arv_stream_timeout_pop_buffer (stream, 200000); if (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS) { @@ -494,6 +501,12 @@ double CvCaptureCAM_Aravis::getProperty( int property_id ) const return out; } break; + + case CAP_PROP_ARAVIS_AUTOTRIGGER: + { + return allowAutoTrigger ? 1. : 0.; + } + break; } return -1.0; } @@ -578,6 +591,11 @@ bool CvCaptureCAM_Aravis::setProperty( int property_id, double value ) } break; + case CAP_PROP_ARAVIS_AUTOTRIGGER: + { + allowAutoTrigger = (bool) value; + } + break; default: return false;