Einstellen der Kameraparameter in OpenCV / Python

86

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!

Mike
quelle
3
Was ist also die 15. Option, dh CV_CAP_PROP_EXPOSURE? Ist es nicht Belichtungszeit?
Abid Rahman K
3
Es ist. Der Punkt, den ich angesprochen habe, ist, dass der Versuch, Änderungen vorzunehmen, zu messbaren Ergebnissen führt. (Das ist der Punkt cap.set(15, x), an dem kein Wert xeine 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 :)
Mike
4
Er hat sie falsch nummeriert. Sie sind alle EIN ZU HOCH. Jemand bitte bearbeiten Sie es.
Katastic Voyage
1
@ KatasticVoyage fertig, scheint mir jetzt richtig :)
Linusg
2
Für opencv 4 muss ich das Präfix "CV" aus den Eigenschaftsnamen entfernen. Also cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Antworten:

54

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.

Sam
quelle
2
Gibt es eine Arbeitsliste der unterstützten Kameras für OpenCV unter Mac Linux Windows? Es hört sich so an, als würde ich in Zukunft mit der Software beginnen und dann vor dem Kauf wieder an der Hardware arbeiten. Einen Kameratreiber zu schreiben ist ein gutes Ziel, aber es wird eine Weile dauern, bis ich lernen kann, das zu tun.
Benutzer391339
@sammy Ich habe eine Frage dazu gepostet. Möchten Sie hier näher darauf
eingehen
27

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

Lorenzo
quelle
Wow, dein Code hat meine logitech c615 Webcam dazu gebracht, mit opencv auf meinem Macbook zu funktionieren! "es funktioniert einfach!" Ich hatte das seit Tagen versucht. Ich denke nicht, dass es ziemlich HD ist und nicht sicher, ob ich die Fokusparameter ändern kann, aber ein wirklich guter Start.
Benutzer391339
2
Ich bin kein Experte, und 3, 4 und 15 sind für mich magische Zahlen. Ist es ein Ersatz für zB CV_CAP_PROP_FRAME_WIDTH?
Allan Nørgaard
5
Was bedeutet cap.set (15, -8.0)? Ich versuche, die Belichtungszeit auf meiner Logitech-Webcam einzustellen.
user391339
1
@ user391339 Haben Sie die Belichtungszeit für die Logitech-Webcam eingestellt?
Abc
@ AllanNørgaard ja, die Flaggen sind nur ganze Zahlen in Verkleidung
Kev1n91
26

Um zu vermeiden, dass zur Identifizierung der VideoCaptureEigenschaften ganzzahlige Werte verwendet werden, können z. B. cv2.cv.CV_CAP_PROP_FPSOpenCV 2.4 und cv2.CAP_PROP_FPSOpenCV 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')
Ulrich Stern
quelle
2
Ich habe 10 Minuten lang versucht herauszufinden, wo diese Konstanten in Python definiert wurden - danke!
Rescdsk
2
Sie haben Recht - wenn Sie eine Version wie 2.4.9 (2014-04-25, den stabilen Download von opencv.org ) verwenden, müssen Sie das cv2.cv.CV_CAP_PROP_XXXXDing 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
Stefan Krüger
Die neueste Liste der allgemeinen Eigenschaften von Video Capture finden Sie hier (OpenCV 4.3)
Mikolasan
8

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.

JoepBC
quelle
Dies funktionierte auf meinem Toshiba Intel-basierten Laptop mit Ubuntu 14.04. Ich habe v4l2-ctl verwendet, um jede gewünschte Option festzulegen, einschließlich der Bildrate. Ich habe diese Einstellungen mit OpenCV versucht, aber die gleichen Fehler wie oben erhalten.
Derek Simkowiak
4

Wenn sich noch jemand fragt, wie hoch der Wert sein CV_CAP_PROP_EXPOSUREkö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.

Zac Diggum
quelle
Kann die Set-Funktion von OpenCV eine Ganzzahl verarbeiten?
Saeed Masoomi