Ich verwende OpenCV (2.4) und Python (2.7.3) mit einer USB-Kamera von Thorlabs (DC1545M).
Ich mache eine Bildanalyse für einen Videostream und möchte einige der Kameraparameter aus meinem Videostream ändern können. Das Verwirrende ist, dass ich einige der Kameraeigenschaften ändern kann, aber nicht alle, und ich bin mir nicht sicher, was ich falsch mache.
Hier ist der Code, der die cv2-Bindungen in Python verwendet, und ich kann bestätigen, dass er ausgeführt wird:
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()
Als Referenz bezieht sich das erste Argument im Befehl cap.set () auf die Aufzählung der unten aufgeführten Kameraeigenschaften:
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)
Meine Fragen sind:
Ist es möglich, die Belichtungszeit der Kamera (oder die anderen Kameraparameter) über Python / OpenCV einzustellen?
Wenn nicht, wie würde ich diese Parameter einstellen?
Hinweis: Der Kamerahersteller stellt C ++ - Code zur Verfügung, der zeigt, wie das geht, aber ich bin kein Experte (bei weitem) in C ++ und würde mich über eine Python-basierte Lösung freuen.
Danke im Voraus!
quelle
cap.set(15, x)
, an dem kein Wertx
eine messbare Veränderung bewirkt.) Übrigens, danke für Ihren Blog. Es war äußerst nützlich für mich, OpenCV über Python auf den neuesten Stand zu bringen. Sie bekommen eine Gegenstimme dafür :)cv2.CV_CAP_PROP_FRAME_HEIGHT
->cv2.CAP_PROP_FRAME_HEIGHT
Antworten:
Nicht alle Parameter werden von allen Kameras unterstützt - tatsächlich sind sie einer der problematischsten Teile der OpenCV-Bibliothek. Jeder Kameratyp - von Android-Kameras über USB-Kameras bis hin zu professionellen - bietet eine andere Schnittstelle zum Ändern der Parameter. Es gibt viele Zweige im OpenCV-Code, die so viele unterstützen, aber natürlich werden nicht alle Möglichkeiten abgedeckt.
Sie können Ihren Kameratreiber untersuchen, einen Patch für OpenCV schreiben und an code.opencv.org senden. Auf diese Weise werden andere Ihre Arbeit genießen, genauso wie Sie die anderer genießen.
Es besteht auch die Möglichkeit, dass Ihre Kamera Ihre Anfrage nicht unterstützt - die meisten USB-Kameras sind billig und einfach. Möglicherweise steht dieser Parameter für Änderungen einfach nicht zur Verfügung.
Wenn Sie sicher sind, dass die Kamera einen bestimmten Parameter unterstützt (Sie sagen, der Kamerahersteller stellt Code bereit) und sich nicht mit OpenCV herumschlagen möchten, können Sie diesen Beispielcode in C ++ mit boost :: python umschließen, um ihn in Python verfügbar zu machen. Dann genießen Sie es.
quelle
Ich hatte das gleiche Problem mit openCV auf Raspberry Pi ... Ich weiß nicht, ob dies Ihr Problem lösen kann, aber was für mich funktioniert hat, war
import time import cv2 cap = cv2.VideoCapture(0) cap.set(3,1280) cap.set(4,1024) time.sleep(2) cap.set(15, -8.0)
Die Zeit, die Sie verwenden müssen, kann unterschiedlich sein
quelle
Um zu vermeiden, dass zur Identifizierung der
VideoCapture
Eigenschaften ganzzahlige Werte verwendet werden, können z. B.cv2.cv.CV_CAP_PROP_FPS
OpenCV 2.4 undcv2.CAP_PROP_FPS
OpenCV 3.0 verwendet werden. (Siehe auch Stefans Kommentar unten.)Hier eine Dienstprogrammfunktion, die sowohl für OpenCV 2.4 als auch für 3.0 funktioniert:
# 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
ist früher in meinem Dienstprogrammcode wie folgt eingestellt:from pkg_resources import parse_version OPCV3 = parse_version(cv2.__version__) >= parse_version('3')
quelle
cv2.cv.CV_CAP_PROP_XXXX
Ding verwenden - weitere Informationen hierzu finden Sie unter code.opencv.org/issues/3181 if Sie verwenden den neuesten Zweig, den Sie verwenden könnencv2.CAP_PROP_XXXX
Ich konnte das Problem OpenCV auch nicht beheben, aber eine Video4linux (V4L2) -Umgehung funktioniert mit OpenCV unter Linux. Zumindest auf meinem Raspberry Pi mit Rasbian und meiner billigen Webcam. Dies ist nicht so solide, leicht und tragbar, wie Sie es gerne hätten, aber in einigen Situationen kann es dennoch sehr nützlich sein.
Stellen Sie sicher, dass Sie die Anwendung v4l2-ctl installiert haben, z. B. aus dem Debian v4l-utils-Paket. Führen Sie dann den folgenden Befehl aus (vor dem Ausführen der Python-Anwendung oder von innen):
v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10
Es überschreibt die Verschlusszeit Ihrer Kamera auf manuelle Einstellungen und ändert die Verschlusszeit (in ms?) Mit dem letzten Parameter auf (in diesem Beispiel) 10. Je niedriger dieser Wert, desto dunkler das Bild.
quelle
Wenn sich noch jemand fragt, wie hoch der Wert sein
CV_CAP_PROP_EXPOSURE
könnte:Hängt davon ab. Für meine billige Webcam muss ich den gewünschten Wert direkt eingeben, zB 0,1 für 1 / 10s. Für meine teure Industriekamera muss ich -5 eingeben, um eine Belichtungszeit von 2 ^ -5s = 1 / 32s zu erhalten.
quelle