Подтвердить что ты не робот

Настройка параметров камеры в 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.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Чтобы избежать использования целочисленных значений для идентификации свойств 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')

Ответ 3

У меня была такая же проблема с openCV на малине 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)

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

Ответ 4

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

Убедитесь, что установлено приложение 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. Чем ниже это значение, тем темнее изображение.

Ответ 5

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

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