Я использую 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.
Заранее спасибо!
источник
cap.set(15, x)
, где никакое значение неx
дает измеримых изменений.) Кстати, спасибо за ваш блог. Это было чрезвычайно полезно для меня в освоении opencv через python. Вы получите за это голос :)cv2.CV_CAP_PROP_FRAME_HEIGHT
->cv2.CAP_PROP_FRAME_HEIGHT
Ответы:
Не все параметры поддерживаются всеми камерами - на самом деле, это одна из самых проблемных частей библиотеки OpenCV. Каждый тип камеры - от камер Android до 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')
источник
cv2.cv.CV_CAP_PROP_XXXX
вещь - для получения дополнительной информации об этом см. code.opencv.org/issues/3181, если вы используете последнюю доступную веткуcv2.CAP_PROP_XXXX
Я также не смог решить проблему 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 с.
источник