Как я могу изменить свойства веб-камеры, которые не поддерживает OpenCV, но API v4l2 поддерживает?

Я использую 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: Экспозиция свойства (15) не поддерживается устройством". Я уверен, что веб-камера поддерживает изменение этого свойства, поскольку это можно сделать с помощью v4l2, тогда я предполагаю, что проблема в обертке OpenCV.

Я также попытался использовать подпроцесс lib для отправки терминальной команды и изменения свойства с помощью v4l2. Команда subprocess.call('v4l2-ctl --device=/dev/video0 --set-ctrl exposure_absolute=20', shell=True),

Результатом является то, что jection_absolute изменяется, но оно не применяется к моему текущему захвату видео. На рисунке 1 показан результат после установки свойства с помощью скрипта. На рисунке 2 показан результат после установки того же свойства через терминал с тем же активным захватом видео.

Настройка параметра выдержка_абсолюта с помощью скрипта (изображение 1)

Настройка параметра выдержка_абсолюта через терминал (изображение 2)

Изображение 2 было получено сразу после изображения 1, выделенная линия такая же, как на изображении 1.

Что-то не так с вызовом подпроцесса? Или как я могу изменить это свойство с помощью скрипта?

Кроме того, почему cv2.VideoCapture(id) сбрасывает свойства камеры, бесполезно менять их перед запуском скрипта, и можно ли это остановить?

__________________________________________________

Изменить: я, возможно, нашел решение этой проблемы. Вызов подпроцесса действительно правильный, я просто должен был использовать cv2.read() один раз перед изменением свойств, видимо первый cv2.read() где свойства камеры сбрасываются. Я до сих пор не знаю, как остановить автоматический сброс свойств веб-камеры.

1 ответ

Если вы собираете opencv с поддержкой GStreamer (флаг: -D WITH_GSTREAMER=ON), вы можете открыть VideoCapture с помощью конвейера GStreamer, где вы можете указать все виды параметров для v4l2:

std::string cameraPipeline;
cameraPipeline ="v4l2src device=/dev/video0 extra-controls=\"c,exposure_auto=1,exposure_absolute=500\" ! ";
cameraPipeline+="video/x-raw, format=BGR, framerate=30/1, width=(int)1280,height=(int)720 ! ";
cameraPipeline+="appsink";

VideoCapture cap;
cap.open(cameraPipeline);

Это работает в C++ и Python. Вы можете получить полный список элементов управления, набрав это в терминале: v4l2-ctl --list-ctrls-menus

Другие вопросы по тегам