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ę!
źródło
cap.set(15, x)
, gdzie żadna wartość niex
powoduje 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 :)cv2.CV_CAP_PROP_FRAME_HEIGHT
->cv2.CAP_PROP_FRAME_HEIGHT
Odpowiedzi:
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.
źródło
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
źródło
Aby uniknąć używania wartości całkowitych do identyfikacji
VideoCapture
właściwości, można użyć np.cv2.cv.CV_CAP_PROP_FPS
W OpenCV 2.4 icv2.CAP_PROP_FPS
OpenCV 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')
źródło
cv2.cv.CV_CAP_PROP_XXXX
rzeczy - 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
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.
źródło
Jeśli ktoś nadal się zastanawia, jaka
CV_CAP_PROP_EXPOSURE
moż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.
źródło