2012-07-10 11 views
46

Używam OpenCV (2.4) i Python (2.7.3) z kamerą USB od Thorlabs (DC1545M).Ustawianie parametrów kamery w OpenCV/Python

Robię trochę analizy 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 kamery, ale nie wszystkie, i nie jestem pewien, co robię źle.

Oto kod, za pomocą wiązania CV2 Pythona, można potwierdzić, że działa:

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 porównania, pierwszy argument w cap.set() polecenie odnosi się do wyliczenie właściwości kamery, wymienione 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. 
3. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file 
4. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. 
5. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. 
6. CV_CAP_PROP_FPS Frame rate. 
7. CV_CAP_PROP_FOURCC 4-character code of codec. 
8. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. 
9. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . 
10. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. 
11. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). 
12. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). 
13. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). 
14. CV_CAP_PROP_HUE Hue of the image (only for cameras). 
15. CV_CAP_PROP_GAIN Gain of the image (only for cameras). 
16. CV_CAP_PROP_EXPOSURE Exposure (only for cameras). 
17. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. 
18. CV_CAP_PROP_WHITE_BALANCE Currently unsupported 
19. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently) 

moje pytania są następujące:

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

Jeśli nie, w jaki sposób mogę ustawić te parametry?

Uwaga: Istnieje kod C++ dostarczony przez producenta aparatu pokazujący, jak to zrobić, ale nie jestem ekspertem (przez długie ujęcie) w C++ i byłby wdzięczny za każde rozwiązanie oparte na pythonie.

Z góry dziękuję!

+2

Więc jaka jest 15 opcja, np. CV_CAP_PROP_EXPOSURE? Czy to nie czas ekspozycji? –

+3

To jest. Chodziło mi o to, że próba modyfikacji powoduje uzyskanie jakiegokolwiek mierzalnego wyniku. (to jest 'cap.set (15, x)', gdzie żadna wartość 'x' nie daje wymiernej zmiany.) Przy okazji, dziękuję za twój blog. Bardzo mi się to przydaje, gdy zaczynam działać z opencv przez pythona. Otrzymujesz awans do tego :) – Mike

+0

ostatnia linia: cv2.VideoCapture (0) .release() może po prostu być cap.release() :) – otterb

Odpowiedz

29

Nie wszystkie parametry są obsługiwane przez wszystkie kamery - w rzeczywistości są jedną z najbardziej kłopotliwych części biblioteki OpenCV. Każdy typ kamery - od kamer z systemem Android do kamer usb do profesjonalnych - oferuje inny interfejs do ustawiania parametrów. A w kodzie OpenCV jest wiele gałęzi obsługujących tak wiele z nich, ale oczywiście nie wszystkie możliwości są objęte.

Co możesz zrobić, to sprawdzić sterownik kamery, zrób patch do OpenCV i wyślij go na code.opencv.org. W ten sposób inni będą cieszyć się twoją pracą, tak samo jak inni.

Istnieje również możliwość, że aparat nie obsługuje żądań użytkownika - większość kamer USB jest tanich i prostych. Może ten parametr nie jest dostępny dla modyfikacji.

Jeśli jesteś pewny, że kamera obsługuje dany parametr (mówisz, że producent kamery dostarcza trochę kodu) i nie chcesz zadzierać z OpenCV, możesz zawinąć ten przykładowy kod w C++ za pomocą :: :: python, aby zrobić dostępne w python. Następnie korzystaj z niego.

+2

czy istnieje działająca lista obsługiwanych kamer dla opencv na Mac OS X? Wydaje się, że w przyszłości zacznę od oprogramowania, a następnie wracam do sprzętu przed zakupem. pisanie sterownika kamery to dobry cel, ale minie trochę czasu, zanim będę mógł się tego nauczyć. – user391339

+0

@sammy Wysłałem pytanie o tym, jak to zrobić. Czy chciałbyś rozwinąć tutaj: http://stackoverflow.com/questions/27914780/why-does-the-frame-width-height-not-always-get-set-using-opencv – evan54

14

miałem ten sam problem z OpenCV na Raspberry Pi ... nie wiem, czy to może rozwiązać problem, ale co pracował dla mnie było

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 trzeba korzystać mogą być różne

+0

wow, twój kod zrobił moją logitech Kamera c615 działa na moim macbooku z opencv! "to po prostu działa!" Próbowałem tego od wielu dni. nie sądzę, że jest to dość HD i nie jestem pewien, czy mogę zmienić parametry ostrości, ale naprawdę dobry początek. – user391339

+0

Nie jestem żadnym ekspertem, a 3, 4 i 15 to dla mnie magiczne liczby. Czy jest zamiennikiem dla np. CV_CAP_PROP_FRAME_WIDTH? –

+3

co oznacza cap.set (15, -8.0)? Próbuję ustawić czas ekspozycji na mojej logitowej kamerce internetowej. – user391339

20

aby unikać liczby całkowite w celu określenia właściwości VideoCapture, można użyć, na przykład cv2.cv.CV_CAP_PROP_FPS w OpenCV 2,4 i cv2.CAP_PROP_FPS w OpenCV 3.0. (Zobacz także komentarz Stefana poniżej.)

Oto funkcja narzędzia, która działa zarówno dla OpenCV 2.4 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 kodu utilities tak:

from pkg_resources import parse_version 
OPCV3 = parse_version(cv2.__version__) >= parse_version('3') 
+1

Spędziłem 10 minut próbując ustalić, gdzie te stałe zostały zdefiniowane w Pythonie - dziękuję! – rescdsk

+2

masz rację - jeśli używasz wersji takiej jak 2.4.9 (2014-04-25 stabilne pobieranie z http://opencv.org/) musisz użyć rzeczy 'cv2.cv.CV_CAP_PROP_XXXX' - więcej informacji o tym zobacz http://code.opencv.org/issues/3181 jeśli używasz najnowszego oddziału możesz użyć 'cv2.CAP_PROP_XXXX' –

6

I nie był w stanie rozwiązać ten problem albo OpenCV, ale video4linux (V4L2) obejście działa z OpenCV podczas korzystania z systemu Linux. Przynajmniej na moim Raspberry Pi z Rasbian i moją tanią kamerą internetową. To nie jest tak solidne, lekkie i przenośne, jak byś tego chciał, 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ż biegu (przed uruchomieniem aplikacji Pythona, lub od wewnątrz) poleceniem:

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 otwarcia migawki (? W ms) z ostatnim parametr (w tym przykład) 10. Im niższa wartość, tym ciemniejszy obraz.

+0

To działało na moim laptopie opartym na intelowskim laptopie Toshiba z systemem Ubuntu 14.04. Użyłem v4l2-ctl, aby ustawić dowolną wybraną opcję, w tym liczbę klatek na sekundę. Próbowałem tych ustawień z OpenCV, ale otrzymałem te same błędy, co powyżej. –

0

Jeśli ktoś wciąż zastanawiasz się, co może być wartość w CV_CAP_PROP_EXPOSURE:

Zależy. W przypadku mojej taniej kamery internetowej muszę wprowadzić żądaną wartość bezpośrednio, np. 0,1 za 1/10s. Dla mojej drogiej kamery przemysłowej muszę wprowadzić -5, aby uzyskać czas ekspozycji 2^-5s = 1/32s.

+0

ustawiona funkcja OpenCV może obsługiwać liczbę całkowitą? –