How to programmatically disable the auto-focus of a webcam?
I am trying to do computer vision using a webcam (the model is Hercules Dualpix). I know it is not the ideal camera to use, but I have no choice here.
The problem is the auto-focus makes it hard/impossible to calibrate the camera. Anyone knows a way to disable the auto-focus feature.开发者_高级运维 Or, if someone has an idea to deal with it and calibrate the camera with the auto-focus.
The Hercules cameras are UVC compliant, so they should work with the DirectShow Interface IAMCameraControl. You can set the focus to a specific value, and use the flags to set that you do not want it to be automatic. You can use IAMCameraControl::Get
to poll the current state, because not all cameras do support turning off the focus.
IAMCameraControl *pCameraControl;
HRESULT hr;
hr = pFilter->QueryInterface(IID_IAMCameraControl, (void **)&pCameraControl);
if (hr == S_OK) {
long defaultFocusValue;
hr = pCameraControl->GetRange(CameraControl_Focus,
NULL, // min
NULL, // max
NULL, // minstep
&defaultFocusValue, // default
NULL); // capflags
hr = pCameraControl->Set(CameraControl_Focus, // property
defaultFocusValue, // value
CameraControl_Flags_Manual);
}
Focus has a range which is defined by each camera separately, so you should query it as shown to find the default value and the min, max if you want.
In this example the pFilter
is a pointer to the input filter that you have from DirectShow. You can get it by enumerating the devices and finding the one you want.
Try using uvcdynctrl where -l flag shall list you the features and -s can be used to set any feature http://manpages.ubuntu.com/manpages/natty/man1/uvcdynctrl.1.html
With the a little help of OpenCV and Python you can do this very easy:
cap = cv2.VideoCapture(1) # my webcam
cap.set(3, 1280) # set the resolution
cap.set(4, 720)
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # turn the autofocus off
I use OpenCV 3.1.0-dev, Python 2.7.5 and the Logitech HD Pro Webcam C920
精彩评论