Я использую OpenCV 3.1 и Python 2.7 для захвата видеокадров с моей веб-камеры Logitech C270. Я также использую video4linux2 (v4l2) для настройки свойств моей камеры, но это привело к нескольким проблемам. Моя ОС - Ubuntu 15.04.
Я пытаюсь изменить свойство absolute_exposure.
Я могу изменить его вручную, используя API v4l2 через терминал, с помощью команды v4l2-ctl --set-ctrl exposure_absolute=40
, и он работает нормально, но мне нужно написать сценарий для этой задачи.
Использование OpenCV set(cv2.CAP_PROP_EXPOSURE, 20)
приводит к «ОШИБКА ВИДЕО: V4L: Property Exposure (15) не поддерживается устройством». Я уверен, что веб-камера поддерживает изменение этого свойства, поскольку это можно сделать с помощью v4l2, тогда я предполагаю, что проблема связана с оболочкой OpenCV.
Я также попытался использовать subprocess lib для отправки команды терминала и изменения свойства с помощью v4l2. Команда subprocess.call('v4l2-ctl --device=/dev/video0 --set-ctrl exposure_absolute=20', shell=True)
.
Результатом является то, что extension_absolute изменяется, но не применяется к моему текущему захвату видео. На изображении 1 показан результат после установки свойства с помощью скрипта. На изображении 2 показан результат после установки того же свойства через терминал с тем же активным захватом видео.
Установка абсолютного_экспозиции с помощью скрипта (изображение 1)
Установка абсолютного_экспозиции через терминал (изображение 2)
Изображение 2 было снято сразу после изображения 1, выделенная линия такая же, как и на изображении 1.
Я что-то делаю не так с вызовом подпроцесса? Или как я могу изменить это свойство с помощью скрипта?
Кроме того, почему cv2.VideoCapture(id)
сбрасывает свойства камеры, нет смысла изменять их перед запуском скрипта, и можно ли это остановить?
__________________________________________________
Изменить: я, возможно, нашел способ решения этой проблемы. Вызов подпроцесса действительно правильный, мне просто пришлось использовать cv2.read()
один раз перед изменением свойств, по-видимому, первый cv2.read()
- это то место, где свойства камеры сбрасываются. Я до сих пор не знаю, как остановить автоматический сброс свойств веб-камеры.
modules\highgui\src\cap_libv4l.cpp
(особенно на функциюicvSetControl
), может показаться, что вы должны иметь возможность передавать управляющий код V4L вместо кодов CV2. Итак, найдите числовое значениеV4L2_CID_EXPOSURE_ABSOLUTE
(возможно 0x902?) И вызовите с ней функциюset
-set(0x902, 20)
. - person Dan Mašek   schedule 04.04.2016