Ustawianie parametrów kamery w OpenCV / Python

86

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

Przeprowadzam analizę obrazu w strumieniu wideo i chciałbym mieć możliwość zmiany niektórych parametrów kamery z mojego strumienia wideo. Mylące jest to, że jestem w stanie zmienić niektóre właściwości aparatu, ale nie wszystkie, i nie jestem pewien, co robię źle.

Oto kod wykorzystujący powiązania cv2 w Pythonie i mogę 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 poleceniu cap.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 naświetlania kamery (lub inne parametry kamery) przez Python / OpenCV?

Jeśli nie, jak bym się zabrał do ustawiania tych parametrów?

Uwaga: istnieje kod C ++ dostarczony przez producenta aparatu, który pokazuje, jak to zrobić, ale nie jestem ekspertem (od dłuższego czasu) w C ++ i doceniłbym każde rozwiązanie oparte na Pythonie.

Z góry dziękuję!

Mikrofon
źródło
3
Więc jaka jest 15. opcja, czyli CV_CAP_PROP_EXPOSURE? Czy to nie czas ekspozycji?
Abid Rahman K,
3
To jest. Chodzi mi o to, że próba modyfikacji daje jakikolwiek wymierny rezultat. (to jest tam cap.set(15, x), gdzie żadna wartość nie xpowoduje wymiernej zmiany). Przy okazji, dziękuję za Twojego bloga. Było to dla mnie niezwykle przydatne, aby przyspieszyć pracę z opencv za pośrednictwem Pythona. Dostajesz za to głosowanie za :)
Mike.
4
Zmienił ich numerację. Wszystkie są JEDEN ZA WYSOKIE. Niech ktoś go zredaguje.
Katastic Voyage
1
@KatasticVoyage zrobione, wydaje mi się teraz właściwe :)
linusg
2
W przypadku opencv 4 muszę usunąć przedrostek „CV” z nazw właściwości. A więc cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Odpowiedzi:

54

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 Androidem po kamery USB do profesjonalnych, oferuje inny interfejs do modyfikacji parametrów. W kodzie OpenCV jest wiele gałęzi, które obsługują jak najwięcej z nich, ale oczywiście nie wszystkie możliwości są uwzględnione.

Co możesz zrobić, to zbadać sterownik aparatu, napisać poprawkę dla OpenCV i wysłać ją na code.opencv.org. W ten sposób inni będą czerpać przyjemność z Twojej pracy, tak samo jak Ty lubisz innych ”.

Istnieje również możliwość, że Twój aparat nie obsługuje Twojego żądania - większość kamer USB jest tania i prosta. Może ten parametr po prostu nie jest dostępny do modyfikacji.

Jeśli jesteś pewien, że kamera obsługuje dany parametr (mówisz, że producent kamery dostarcza kod) i nie chcesz zadzierać z OpenCV, możesz opakować ten przykładowy kod w C ++ za pomocą boost :: python, aby był dostępny w Pythonie. Następnie ciesz się używaniem.

Sam
źródło
2
czy istnieje lista robocza obsługiwanych kamer dla Opencv w systemie Mac Linux? Wygląda na to, że w przyszłości zacznę od oprogramowania, a następnie będę pracował nad sprzętem przed zakupem. napisanie sterownika aparatu to dobry cel, ale minie trochę czasu, zanim będę mógł się tego nauczyć.
user391339
@sammy Wysłałem pytanie, jak to zrobić. Czy zechciałbyś to rozwinąć tutaj: stackoverflow.com/questions/27914780/ ...
evan54
27

Miałem ten sam problem z openCV na Raspberry Pi ... nie wiem, czy to rozwiąże twój problem, ale to co mi zadziałało 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órego musisz użyć, może być inny

Lorenzo
źródło
wow, twój kod sprawił, że moja kamera internetowa Logitech C615 działała na moim Macbooku z opencv! „to po prostu działa!” Próbowałem tego od dni. Nie wydaje mi się, żeby to było całkiem HD i nie jestem pewien, czy mogę zmienić parametry ostrości, ale naprawdę dobry początek.
user391339
2
W żadnym wypadku nie jestem ekspertem, a 3, 4 i 15 to dla mnie magiczne liczby. Czy jest zamiennikiem np. CV_CAP_PROP_FRAME_WIDTH?
Allan Nørgaard
5
co oznacza cap.set (15, -8.0)? Próbuję ustawić czas naświetlania w mojej kamerze internetowej firmy Logitech.
user391339
1
@ user391339 czy ustawiłeś czas naświetlania w kamerze Logitech?
Abc
@ AllanNørgaard tak, flagi to tylko liczby całkowite w przebraniu
Kev1n91
26

Aby uniknąć używania wartości całkowitych do identyfikacji VideoCapturewłaściwości, można użyć np. cv2.cv.CV_CAP_PROP_FPSW OpenCV 2.4 i cv2.CAP_PROP_FPSOpenCV 3.0. (Zobacz też komentarz Stefana poniżej.)

Oto funkcja narzędziowa, 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ędzi w następujący sposób:

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')
Ulrich Stern
źródło
2
Spędziłem 10 minut, próbując znaleźć te stałe w Pythonie - dziękuję!
rescdsk
2
masz rację - jeśli używasz wersji takiej jak 2.4.9 (2014-04-25 stabilne pobieranie z opencv.org ), musisz użyć tej cv2.cv.CV_CAP_PROP_XXXXrzeczy - więcej informacji na ten temat znajdziesz na code.opencv.org/issues/3181, jeśli korzystasz z najnowszego oddziału, z którego możesz korzystaćcv2.CAP_PROP_XXXX
Stefan Krüger
Najnowsza lista ogólnych właściwości Video Capture jest dostępna tutaj (OpenCV 4.3)
Mikolasan
8

Nie byłem w stanie rozwiązać problemu z OpenCV, ale obejście video4linux (V4L2) działa z OpenCV podczas korzystania z Linuksa. Przynajmniej działa na moim Raspberry Pi z Rasbianem i moją tanią kamerką internetową. To nie jest tak solidne, lekkie i przenośne, jak byś chciał, ale w niektórych sytuacjach może być jednak bardzo przydatne.

Upewnij się, że masz zainstalowaną aplikację v4l2-ctl, np. Z pakietu Debian v4l-utils. Następnie uruchom (przed uruchomieniem aplikacji w języku Python lub z jej wnętrza) polecenie:

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

Zastępuje czas otwarcia migawki aparatu ustawieniami ręcznymi i zmienia czas otwarcia migawki (w ms?) Ostatnim parametrem na (w tym przykładzie) 10. Im niższa wartość, tym ciemniejszy obraz.

JoepBC
źródło
To zadziałało na moim laptopie z procesorem Toshiba Intel i systemem Ubuntu 14.04. Użyłem v4l2-ctl, aby ustawić dowolną opcję, w tym liczbę klatek na sekundę. Próbowałem tych ustawień z OpenCV, ale otrzymałem te same błędy, co te powyżej.
Derek Simkowiak
4

Jeśli ktoś nadal się zastanawia, jaka CV_CAP_PROP_EXPOSUREmoże być wartość :

Zależy. Do mojej taniej kamerki muszę bezpośrednio wpisać żądaną wartość np. 0,1 dla 1 / 10s. W przypadku mojej drogiej kamery przemysłowej muszę wpisać -5, aby uzyskać czas naświetlania 2 ^ -5s = 1 / 32s.

Zac Diggum
źródło
ustawiona funkcja OpenCV może obsłużyć liczbę całkowitą?
Saeed Masoomi,