Установка параметров камеры в OpenCV/Python

Я использую OpenCV (2.4) и Python (2.7.3) с USB-камерой от Thorlabs (DC1545M).

Я делаю некоторый анализ изображения в видеопотоке, и я хотел бы иметь возможность изменить некоторые параметры камеры из моего видеопотока. Смущает то, что я могу изменить некоторые свойства камеры, но не все, и я не уверен в том, что я делаю неправильно.

Вот код, использующий привязки cv2 в Python, и я могу подтвердить, что он работает:

import cv2


#capture from camera at location 0
cap = cv2.VideoCapture(0)
#set the width and height, and UNSUCCESSFULLY set the exposure time
cap.set(3,1280)
cap.set(4,1024)
cap.set(15, 0.1)

while True:
    ret, img = cap.read()
    cv2.imshow("input", img)
    #cv2.imshow("thresholded", imgray*thresh2)

    key = cv2.waitKey(10)
    if key == 27:
        break


cv2.destroyAllWindows() 
cv2.VideoCapture(0).release()

Для справки, первый аргумент в команде cap.set() относится к перечислению свойств камеры, перечисленных ниже:

0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
2. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file
3. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
4. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
5. CV_CAP_PROP_FPS Frame rate.
6. CV_CAP_PROP_FOURCC 4-character code of codec.
7. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
8. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
9. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
10. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
11. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
12. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
13. CV_CAP_PROP_HUE Hue of the image (only for cameras).
14. CV_CAP_PROP_GAIN Gain of the image (only for cameras).
15. CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
16. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
17. CV_CAP_PROP_WHITE_BALANCE Currently unsupported
18. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)

Мои вопросы:

Можно ли установить время экспозиции камеры (или другие параметры камеры) через python/opencv?

Если нет, как бы я настроить эти параметры?

Примечание: есть код C++, предоставленный производителем камеры, показывающий, как это сделать, но я не эксперт (по большому счету) в C++ и был бы признателен за любое решение на основе Python.

Заранее спасибо!

5 ответов

Решение

Не все параметры поддерживаются всеми камерами - на самом деле они являются одной из наиболее проблемных частей библиотеки OpenCV. Каждый тип камеры - от андроид-камер до USB-камер и профессиональных - предлагает свой интерфейс для настройки своих параметров. И в коде OpenCV есть много веток, поддерживающих столько же, но, конечно, не все возможности охвачены.

Что вы можете сделать, это изучить драйвер вашей камеры, сделать патч для OpenCV и отправить его на code.opencv.org. Таким образом, другие будут получать удовольствие от вашей работы, так же, как вы наслаждаетесь работой других.

Существует также вероятность того, что ваша камера не поддерживает ваш запрос - большинство USB-камер дешевы и просты. Возможно, этот параметр просто недоступен для изменений.

Если вы уверены, что камера поддерживает данный параметр (вы говорите, что производитель камеры предоставляет некоторый код) и не хотите связываться с OpenCV, вы можете обернуть этот пример кода в C++ с помощью boost::python, чтобы сделать его доступным в Python. Тогда наслаждайтесь этим.

У меня была такая же проблема с openCV на Raspberry Pi... не знаю, может ли это решить вашу проблему, но то, что мне помогло, было

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

время, которое вы должны использовать, может отличаться

Чтобы не использовать целочисленные значения для идентификации VideoCapture свойства, которые можно использовать, например, cv2.cv.CV_CAP_PROP_FPS в OpenCV 2.4 и cv2.CAP_PROP_FPS в OpenCV 3.0. (См. Также комментарий Стефана ниже.)

Вот полезная функция, которая работает как для OpenCV 2.4, так и для 3.0:

# returns OpenCV VideoCapture property id given, e.g., "FPS"
def capPropId(prop):
  return getattr(cv2 if OPCV3 else cv2.cv,
    ("" if OPCV3 else "CV_") + "CAP_PROP_" + prop)

OPCV3 установлен ранее в моем коде утилит, как это:

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')

Я также не смог решить проблему OpenCV, но обходной путь video4linux (V4L2) работает с OpenCV при использовании Linux. По крайней мере, на моем Raspberry Pi с Rasbian и моей дешевой веб-камерой. Это не так прочно, легко и портативно, как хотелось бы, но в некоторых ситуациях это может быть очень полезно.

Убедитесь, что у вас установлено приложение v4l2-ctl, например, из пакета Debian v4l-utils. Затем выполните (до запуска приложения Python или изнутри) команду:

v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10

Он перезаписывает время затвора камеры на ручные настройки и изменяет время затвора (в мс?) С последним параметром на (в этом примере) 10. Чем ниже это значение, тем темнее изображение.

Если кому-то все еще интересно, какое значение в CV_CAP_PROP_EXPOSURE возможно:

Зависит. Для моей дешевой веб-камеры я должен ввести желаемое значение напрямую, например, 0,1 в течение 1/10 с. Для моей дорогой промышленной камеры я должен ввести -5, чтобы получить время экспозиции 2^-5 с = 1/32 с.

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