Встановлення параметрів камери в 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? Чи не час витримки?
Абід Рахман К

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. Кожен тип камер - від андроїд-камер до USB-камер до професійних, пропонує інший інтерфейс для зміни параметрів. У коді OpenCV є багато гілок, які підтримують стільки ж, але, звичайно, не всі можливості охоплені.

Що ви можете зробити, це дослідити драйвер вашої камери, написати патч для OpenCV і надіслати його на code.opencv.org. Таким чином інші будуть насолоджуватися вашою роботою, так само, як і ви іншими.

Також існує ймовірність того, що ваша камера не підтримує ваш запит - більшість USB-камер дешеві та прості. Можливо, цей параметр просто недоступний для модифікацій.

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


2
чи існує робочий список підтримуваних камер для opencv у mac linux windows? здається, в майбутньому я почну з програмного забезпечення, а потім повернусь до апаратного забезпечення перед покупкою. написання драйвера камери - хороша мета, але пройде деякий час, перш ніж я зможу навчитися це робити.
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

2
Ви маєте рацію - якщо ви використовуєте таку версію, як 2.4.9 (2014-04-25, стабільне завантаження з opencv.org ), вам доведеться скористатися цією cv2.cv.CV_CAP_PROP_XXXXштукою - докладніше про це див. у code.opencv.org/issues/3181, якщо ви використовуєте найновішу гілку, яку ви можете використовуватиcv2.CAP_PROP_XXXX
Stefan Krüger

Останній список загальних властивостей Video Capture тут (OpenCV 4.3)
Міколасан,

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. Чим нижче це значення, тим темніше зображення.


Це працювало на моєму ноутбуці Toshiba Intel на базі Ubuntu 14.04. Я використовував v4l2-ctl, щоб встановити будь-який параметр, який я хотів, включаючи частоту кадрів. Я спробував ці налаштування з OpenCV, але отримав ті самі помилки, що і вище.
Дерек Сімковяк,

4

Якщо хтось все ще цікавиться, якою CV_CAP_PROP_EXPOSUREможе бути цінність :

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


функція встановлення OpenCV може обробляти ціле число?
Saeed Masoomi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.