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

86

Я использую 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.

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

Майк
источник
3
Итак, что такое 15-й вариант, т.е. CV_CAP_PROP_EXPOSURE? Разве это не время выдержки?
Abid Rahman K
3
Это. Я хотел сказать, что попытки внести какие-либо изменения действительно дают какой-либо измеримый результат. (это то место cap.set(15, x), где никакое значение не xдает измеримых изменений.) Кстати, спасибо за ваш блог. Это было чрезвычайно полезно для меня в освоении opencv через python. Вы получите за это голос :)
Майк,
4
Он неправильно их пронумеровал. Они все ОДИН СЛИШКОМ ВЫСОКИЙ. Кто-нибудь, пожалуйста, отредактируйте это.
Katastic Voyage
1
@KatasticVoyage готово, теперь мне кажется правильным :)
linusg
2
Для opencv 4 мне нужно удалить префикс «CV» из имен свойств. Итак cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Маркус Вебер

Ответы:

54

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

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

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

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

Сэм
источник
2
есть ли рабочий список поддерживаемых камер для opencv в окнах Mac Linux? похоже, что в будущем я начну с программного обеспечения, а затем вернусь к оборудованию перед покупкой. Написание драйвера камеры - хорошая цель, но пройдет некоторое время, прежде чем я смогу научиться этому.
user391339
@sammy Я разместил вопрос о том, как это сделать. Не могли бы вы уточнить здесь: stackoverflow.com/questions/27914780/…
evan54
27

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

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

Лоренцо
источник
вау, ваш код заставил мою веб-камеру logitech c615 работать на моем macbook с opencv! "просто работает!" Я пробовал это несколько дней. Я не думаю, что это совсем HD и не уверен, смогу ли я изменить параметры фокусировки, но действительно хорошее начало.
user391339
2
Я ни в коем случае не эксперт, и числа 3, 4 и 15 для меня магические. Это замена, например, CV_CAP_PROP_FRAME_WIDTH?
Аллан Норгаард
5
что означает cap.set (15, -8.0)? Я пытаюсь установить время экспозиции на своей веб-камере logitech.
user391339
1
@ user391339 вы установили время выдержки на веб-камере Logitech?
Abc
@ AllanNørgaard, да, флаги - это всего лишь замаскированные целые числа
Kev1n91
26

Чтобы избежать использования целочисленных значений для идентификации VideoCaptureсвойств, можно использовать, например, cv2.cv.CV_CAP_PROP_FPSв OpenCV 2.4 и cv2.CAP_PROP_FPSOpenCV 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')
Ульрих Штерн
источник
2
Я потратил 10 минут, пытаясь найти, где эти константы определены в Python - спасибо!
rescdsk 09
2
вы правы - если вы используете такую ​​версию, как 2.4.9 (2014-04-25 стабильная загрузка с opencv.org ), вы должны использовать эту cv2.cv.CV_CAP_PROP_XXXXвещь - для получения дополнительной информации об этом см. code.opencv.org/issues/3181, если вы используете последнюю доступную веткуcv2.CAP_PROP_XXXX
Стефан Крюгер
Последний список общих свойств Video Capture находится здесь (OpenCV 4.3)
Mikolasan,
8

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

JoepBC
источник
Это сработало на моем ноутбуке Toshiba на базе Intel под управлением Ubuntu 14.04. Я использовал v4l2-ctl, чтобы установить любой параметр, который я хотел, включая частоту кадров. Я пробовал эти настройки с OpenCV, но получил те же ошибки, что и выше.
Дерек Симковяк,
4

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

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

Зак Диггам
источник
функция набора OpenCV может обрабатывать целые числа?
Саид Масуми