Ustawianie parametrów kamery w OpenCV / Python

Używam OpenCV (2.4) i Pythona (2.7.3) z kamerą USB firmy Thorlabs (DC1545M).

Przeprowadzam analizę obrazu w strumieniu wideo i chciałbym móc zmienić niektóre parametry kamery z Mojego strumienia wideo. Mylące jest to, że jestem w stanie zmienić niektóre właściwości aparatu, ale nie wszystkie z nich i nie jestem pewien, co robię źle.

Oto kod, używając wiązań cv2 w Pythonie i mogę potwierdzić, że to przebieg:

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()

Dla odniesienia, pierwszy argument w WPR.polecenie set () odnosi się do wyliczenia właściwości kamery, wymienionych poniżej:

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)
Moje pytania to:

Czy Można ustawić czas ekspozycji kamery (lub inne parametry kamery) za pomocą Pythona / opencv?

Jeśli nie, to jak mam ustawić te parametry?

Uwaga: jest kod C++ dostarczony przez producenta aparatu pokazujący jak to zrobić, ale Nie jestem ekspertem (na dłuższą metę) w C++ i byłbym wdzięczny za każde rozwiązanie oparte na Pythonie.

Z góry dzięki!
Author: linusg, 2012-07-10

5 answers

Nie wszystkie parametry są obsługiwane przez wszystkie kamery - w rzeczywistości są one jedną z najbardziej kłopotliwych części biblioteki OpenCV. Każdy typ Kamery-od kamer z systemem android przez Kamery USB po profesjonalne oferują inny interfejs, aby ustawić swoje parametry. W kodzie OpenCV jest wiele gałęzi, które obsługują tak wiele z nich, ale oczywiście nie wszystkie możliwości są uwzględnione.

Możesz sprawdzić sterownik kamery, zrobić łatkę do OpenCV i wysłać ją do code.opencv.org. w ten sposób inni będą cieszyć się Twoją pracą, tak samo jak ty lubisz pracę innych.

Istnieje również możliwość, że Twoja kamera nie obsługuje twojego żądania-większość kamer USB jest tania i prosta. Może ten parametr jest po prostu niedostępny dla modyfikacji.

Jeśli jesteś pewien, że kamera obsługuje dany param (mówisz, że producent kamery dostarcza jakiś kod) i nie chcesz zadzierać z OpenCV, możesz owinąć ten przykładowy kod w C++ za pomocą boost:: python, aby to zrobić dostępny w języku Python. Następnie korzystaj z niego.

 32
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 13:29:36

Aby uniknąć używania wartości całkowitych do identyfikacji właściwości VideoCapture, można użyć np. cv2.cv.CV_CAP_PROP_FPS w OpenCV 2.4 i cv2.CAP_PROP_FPS w OpenCV 3.0. (Patrz także komentarz Stefana poniżej.)

Tutaj funkcja użytkowa, która działa zarówno dla OpenCV 2.4, jak i 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 jest ustawiony wcześniej w moim kodzie narzędziowym Tak:

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')
 20
Author: Ulrich Stern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 22:39:03

Miałem ten sam problem z openCV na Raspberry Pi... Nie wiem, czy to może rozwiązać twój problem, ale to, co działało dla mnie, to

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

Czas, który musisz wykorzystać może być inny

 17
Author: Lorenzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 21:16:02

Nie byłem w stanie naprawić problemu OpenCV, ale obejście obejścia video4linux (V4L2) działa z OpenCV podczas korzystania z Linuksa. Przynajmniej na moim Raspberry Pi z Rasbian i moją tanią kamerą internetową. Nie jest to tak solidne, lekkie i przenośne, jak chcesz, ale w niektórych sytuacjach może być bardzo przydatne.

Upewnij się, że masz zainstalowaną aplikację v4l2-CTL, np. z pakietu Debian V4L-utils. Niż uruchomić (przed uruchomieniem aplikacji Pythona lub od wewnątrz) polecenie:

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

Nadpisuje czas migawki aparatu do ustawień ręcznych i zmienia czas migawki (w ms?) z ostatnim parametrem do (w tym przykładzie) 10. Im niższa wartość, tym ciemniejszy obraz.

 6
Author: JoepBC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 19:18:52

Jeśli ktoś jeszcze się zastanawia jaka może być wartość w CV_CAP_PROP_EXPOSURE:

Zależy. Dla mojej taniej kamery internetowej muszę wprowadzić żądaną wartość bezpośrednio, np. 0.1 dla 1/10s. dla mojej drogiej kamery przemysłowej muszę wprowadzić -5, aby uzyskać czas ekspozycji 2^-5s = 1 / 32S.
 1
Author: Zac Diggum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-29 23:12:23