C++ 如何以编程方式禁用网络摄像头的自动对焦?

C++ 如何以编程方式禁用网络摄像头的自动对焦?,c++,directx,webcam,computer-vision,C++,Directx,Webcam,Computer Vision,我正在尝试使用网络摄像头(型号是Hercules Dualpix)进行计算机视觉。我知道这不是一个理想的相机使用,但我在这里没有选择 问题是自动对焦使摄像机难以/不可能校准。任何人都知道禁用自动对焦功能的方法。或者,如果有人有办法解决这个问题,并用自动对焦校准相机。大力士相机符合UVC标准,因此应该使用DirectShow界面。您可以将焦点设置为特定值,并使用标志设置您不希望它是自动的。您可以使用IAMCameraControl::Get轮询当前状态,因为并非所有相机都支持关闭焦距 IAMCam

我正在尝试使用网络摄像头(型号是Hercules Dualpix)进行计算机视觉。我知道这不是一个理想的相机使用,但我在这里没有选择


问题是自动对焦使摄像机难以/不可能校准。任何人都知道禁用自动对焦功能的方法。或者,如果有人有办法解决这个问题,并用自动对焦校准相机。

大力士相机符合UVC标准,因此应该使用DirectShow界面。您可以将焦点设置为特定值,并使用标志设置您不希望它是自动的。您可以使用
IAMCameraControl::Get
轮询当前状态,因为并非所有相机都支持关闭焦距

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); 
} 
焦距有一个范围,该范围由每个摄影机分别定义,因此您应该按所示进行查询,以查找默认值以及最小值和最大值(如果需要)。
在本例中,
pFilter
是指向您从DirectShow获得的输入筛选器的指针。你可以通过找到你想要的来获得它。

尝试使用uvcdynctrl 其中-l标志应列出特性 和-s可用于设置任何功能

借助于OpenCV和Python,您可以非常轻松地完成这项工作:

cap=cv2.VideoCapture(1)#我的网络摄像头
第3章,第1280条#制定决议
第二套(4720)
cap.set(cv2.cap_PROP_AUTOFOCUS,0)#关闭自动对焦


我使用OpenCV 3.1.0-dev、Python 2.7.5和Logitech HD Pro网络摄像头C920

谢谢。正是我想要的!首先,它不起作用,但我升级了摄像头驱动程序和固件,一切正常。如何为几个网络摄像头做到这一点?它都是windows,是Linux的选项吗?我的目标是通过编程实现。你可以使用类似系统的东西(“uvcdynctrl-s Backlight\0”);但这不适用于拍摄多次曝光的图像。