2016-03-30 5 views
3

Ich verwende OpenCV 3.1 und Python 2.7 Videobilder von meiner Webcam, Logitech C270 zu erfassen. Ich benutze auch video4linux2 (v4l2), um die Eigenschaften meiner Kamera einzustellen, aber dies führte zu ein paar Problemen. Mein Betriebssystem ist Ubuntu 15.04. Die spezifische Eigenschaft, die ich ändern möchte, ist absolute_exposure.Wie kann ich Webcam-Eigenschaften ändern, die OpenCV nicht unterstützt, aber die v4l2-API?

Ich kann es manuell ändern, indem v4l2 API über das Terminal mit dem Befehl v4l2-ctl --set-ctrl exposure_absolute=40, und es funktioniert gut, aber ich brauche ein Skript für diese Aufgabe zu schreiben.

Die Verwendung von OpenCV set(cv2.CAP_PROP_EXPOSURE, 20) führt zu "VIDEOIO FEHLER: V4L: Property Exposure (15) nicht vom Gerät unterstützt". Ich bin sicher, dass die Webcam die Änderung dieser Eigenschaft unterstützt, da es möglich ist, dies mit v4l2 zu tun, dann nehme ich an, dass das Problem mit dem Wrapper von OpenCV ist.

Ich habe auch versucht subprocess lib zu verwenden, um einen Terminal-Befehl zu senden und die Eigenschaft v4l2 mit ändern. Der Befehl lautet subprocess.call('v4l2-ctl --device=/dev/video0 --set-ctrl exposure_absolute=20', shell=True).

Das Ergebnis ist, dass sich exposure_absolute ändert, aber es wird nicht auf meine aktuelle Videoaufnahme angewendet. Bild 1 zeigt das Ergebnis nach dem Festlegen der Eigenschaft per Skript. Bild 2 zeigt das Ergebnis nach dem Einstellen der gleichen Eigenschaft über Terminal, mit der gleichen Videoaufnahme aktiv.

Setting exposure_absolute via script (Bild 1)

Setting exposure_absolute via terminal (Bild 2)

Bild 2 rechts nach 1 Bild aufgenommen wurde, die markierte Linie ist das gleiche von Bild 1.

Mache ich etwas falsch auf dem Unterprozessaufruf? Oder wie kann ich die Änderung dieser Eigenschaft mithilfe eines Skripts vornehmen?

Auch warum cv2.VideoCapture(id) setzt die Kamera Eigenschaften, es ist nicht sinnvoll, sie vor dem Ausführen des Skripts zu ändern, und ist es möglich, das zu stoppen?

__________________________________________________

Edit: Ich fand vielleicht eine Abhilfe für dieses Problem. Der Subprozess-Aufruf ist in der Tat richtig, ich musste nur cv2.read() einmal vor dem Ändern der Eigenschaften verwenden, anscheinend ist der erste cv2.read(), wo die Kameraeigenschaften zurückgesetzt werden. Ich weiß immer noch nicht, wie ich verhindern kann, dass die Webcam-Eigenschaften automatisch zurückgesetzt werden.

+0

Blick auf den Quellcode in 'modules \ highgui \ src \ cap_libv4l.cpp' (speziell bei der 'icvSetControl'-Funktion), scheint es, dass Sie in der Lage sein sollten, einen V4L-Steuercode anstelle der CV2-Codes zu übergeben. Suchen Sie also den numerischen Wert von 'V4L2_CID_EXPOSURE_ABSOLUTE' ([vielleicht 0x902] (http://lxr.free-electronics.com/source/include/uapi/linux/v4l2-controls.h#L88)?) Und rufen Sie' set 'Funktion mit dem -' set (0x902, 20) '. –

Antwort

1

Wenn Sie opencv mit GStreamer Unterstützung bauen (Flag: -D WITH_GSTREAMER = ON) können Sie eine Videocapture öffnen Sie eine GStreamer-Pipeline, wo Sie alle Arten von Parametern für v4l2 angeben:

std::string cameraPipeline; 
cameraPipeline ="v4l2src device=/dev/video0 extra-controls=\"c,exposure_auto=1,exposure_absolute=500\" ! "; 
cameraPipeline+="video/x-raw, format=BGR, framerate=30/1, width=(int)1280,height=(int)720 ! "; 
cameraPipeline+="appsink"; 

VideoCapture cap; 
cap.open(cameraPipeline); 

Dies ist Werke in C++ und Python.Sie können die vollständige Liste der Steuerelemente erhalten, indem Sie dies in einem Terminal eingeben: v4l2-ctl --list-ctrls-menus

Verwandte Themen