Для веб-камер USB, совместимых с UVC (как и большинство), есть реальная возможность использовать автофокусировку камеры и затем заблокировать ее. Чтобы выяснить, позволяет ли камера делать это через UVC, в Linux можно использовать v4l2-ctl
, который находится в пакете v4l-utils
. v4l2-ctl -l
перечисляет все доступные элементы управления, v4l2-ctl -c
устанавливает значение для элемента управления, а v4l2-ctl -C
получает значение.
Например, следующие команды сделали трюк для Microsoft LifeCam Cinema на коробке Ubuntu 16.04, в которой была запущена простая программа Python OpenCV для отображения текущего кадра:
> v4l2-ctl -d 0 -c focus_auto=1
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 12
После перемещения объекта ближе к камере фокус изменился, и я получил другое значение для focus_absolute
: (Таким образом, UVC дает доступ к тому, какое значение выбрал автофокус).
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 17
Затем я переключился на ручную фокусировку, и это заблокировало значение, которое выбрал автофокус:
> v4l2-ctl -d 0 -c focus_auto=0
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 17
Таким образом, для LifeCam Cinema единственное, что нужно сделать коду, - это сначала изменить focus_auto
элемент управления на автоматический (1
), а затем на ручной после блокировки фокуса.
Из Python я обычно запускаю v4l2-ctl
просто используя subprocess.check_output()
. Я помню, что видел библиотеки Windows для UVC, но никогда не играл с ними.