2009-11-11 4 views
12

Я пытаюсь сделать компьютерное зрение с помощью веб-камеры (модель Hercules Dualpix). Я знаю, что это не идеальная камера, но у меня нет выбора.Как программно отключить автофокус веб-камеры?

Проблема заключается в автоматической фокусировке, что затрудняет или невозможно откалибровать камеру. Любой знает, как отключить функцию автофокуса. Или, если у кого-то есть идея справиться с этим и откалибровать камеру с автофокусом.

ответ

10

Камеры Hercules соответствуют требованиям UVC, поэтому они должны работать с интерфейсом DirectShow IAMCameraControl. Вы можете установить фокус на определенное значение и использовать флажки, чтобы установить, что вы не хотите, чтобы он был автоматическим. Вы можете использовать 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. Вы можете получить его на enumerating the devices и найти тот, который вы хотите.

+0

Спасибо. Именно то, что я хотел! Сначала это не сработало, но я обновил драйвер камеры и прошивку, и все работает. – jslap

+0

Как это сделать для нескольких веб-камер? – user1651460

+1

все его окна, были ли опции для Linux? – 2013-05-13 13:02:54

2

Попробуйте использовать uvcdynctrl где -l флаг перечислит вам функцию и -s может быть использован для установки любой функции http://manpages.ubuntu.com/manpages/natty/man1/uvcdynctrl.1.html

+1

Моя цель состояла в том, чтобы сделать это программно. – jslap

+0

Вы можете использовать что-то вроде системы («uvcdynctrl -s Backlight \ Compensation 0»); –

0

С небольшой помощью OpenCV и Python вы можете сделать это очень легко:

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

Я использую OpenCV 3.1.0-DEV, Python 2.7.5 и Logitech HD Pro Webcam C920

+0

Но это не работает для захвата изображений с несколькими экспозициями. – Abc