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

Я использую 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() - это то место, где свойства камеры сбрасываются. Я до сих пор не знаю, как остановить автоматический сброс свойств веб-камеры.


person Hélder Lima da Rocha    schedule 30.03.2016    source источник
comment
Глядя на исходный код в 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


Ответы (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

person Ali Douiyek    schedule 05.05.2016