diff --git a/modules/videoio/src/cap_dshow.cpp b/modules/videoio/src/cap_dshow.cpp index f29eb98cc33a402cd419eae7a1f7e66063c8412a..3a92a81d49ac69e3e651f967d07789a404a09b73 100644 --- a/modules/videoio/src/cap_dshow.cpp +++ b/modules/videoio/src/cap_dshow.cpp @@ -3220,6 +3220,11 @@ double VideoCapture_DShow::getProperty(int propIdx) const return g_VI.getFourcc(m_index); case CV_CAP_PROP_FPS: return g_VI.getFPS(m_index); + case CV_CAP_PROP_AUTOFOCUS: + // Flags indicate whether or not autofocus is enabled + if (g_VI.getVideoSettingCamera(m_index, CameraControl_Focus, min_value, max_value, stepping_delta, current_value, flags, defaultValue)) + return (double)flags; + return -1; // video filter properties case CV_CAP_PROP_BRIGHTNESS: @@ -3284,6 +3289,7 @@ bool VideoCapture_DShow::setProperty(int propIdx, double propVal) break; case CV_CAP_PROP_FPS: + { int fps = cvRound(propVal); if (fps != g_VI.getFPS(m_index)) { @@ -3297,6 +3303,19 @@ bool VideoCapture_DShow::setProperty(int propIdx, double propVal) return g_VI.isDeviceSetup(m_index); } + case CV_CAP_PROP_AUTOFOCUS: + { + // Flags are required to toggle autofocus or not, but the setProperty interface does not support multiple parameters + bool enabled = cvRound(propVal) == 1; + long minFocus, maxFocus, delta, currentFocus, flags, defaultValue; + if (!g_VI.getVideoSettingCamera(m_index, CameraControl_Focus, minFocus, maxFocus, delta, currentFocus, flags, defaultValue)) + { + return false; + } + return g_VI.setVideoSettingCamera(m_index, CameraControl_Focus, currentFocus, enabled ? CameraControl_Flags_Auto | CameraControl_Flags_Manual : CameraControl_Flags_Manual, enabled ? true : false); + } + } + if (handled) { // a stream setting