[PYTHON] Schalten Sie die Kameraauflösung von OpenCV aus um

Einführung

Die Arbeit von zu Hause aus hat begonnen, und der Preis für WEB-Kameras ist in die Höhe geschossen. Es fiel mir schwer, die Auflösung und Bildrate zu ändern, als ich mit openCV mit der Henachoko-Kamera aufnahm, die ich in dieser Zeit gekauft hatte. Deshalb werde ich es zusammenfassen.

Was ich getan habe

Bei der Verwendung von openCV in Jetson, als ich versuchte, den Code der WEB-Kamera zu ändern, wurde gesagt, dass es sich um eine nicht behandelte Eigenschaft in der Menge von CAP_PROP_FOURCC handelt. Geben Sie also v4l2src ein, verwenden Sie gstreamer, um Appsink auszugeben, und verwenden Sie dies als Argumentzeichenfolge von videoCapture. Ich habe den Code und die Auflösung der Kamera geändert, indem ich als angegeben habe.

Änderung der Bildrate in OpenCV

Normalerweise Wie in [[Python] Webkamera-Rahmengröße und FPS-Einstellungen mit OpenCV] gezeigt (https://qiita.com/Kazuhito/items/cc6b8a0bd75cf9689bf9)

Auflösung ändern


cap=videoCapture(0)
video_input.set(cv2.CAP_PROP_FPS, 30) 
video_input.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
video_input.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) 

Sie können die Auflösung ändern, indem Sie so etwas tun. Zu diesem Zeitpunkt müssen die Auflösung und die FPS des Änderungsziels von der Kamera unterstützt werden. Diese Liste kann mit dem Befehl v4l2-ctl oder dergleichen abgerufen werden. Das Folgende ist die Ausgabe der Henachoko-Zielkamera dieses Mal.

XavierNX:~/docker/darknet/work$ v4l2-ctl -d /dev/video1 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Index       : 0
	Type        : Video Capture
	Pixel Format: 'MJPG' (compressed)
	Name        : Motion-JPEG
		Size: Discrete 1920x1080
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 320x180
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.033s (30.000 fps)

	Index       : 1
	Type        : Video Capture
	Pixel Format: 'YUYV'
	Name        : YUYV 4:2:2
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)

XavierNX:~/docker/darknet/work$ 

Wenn Sie nicht über v4l2-ctl verfügen, können Sie es mit apt install v4l-utils installieren.

Problem

--Problem 1: OpenCV versucht, die Kamera mit YUYV zu öffnen Im obigen Ausgabebeispiel versucht OPENCV, das erste YUYV mit 640 x 360-30 FPS zu öffnen (ich bin mir nicht sicher, ob es das erste ist). Sofern Sie dieses Verhalten nicht ändern und die Kamera auf das MJPG-Format umschalten, können Sie mit dieser Henachoko-Kamera nur andere Auflösungen als 640 x 360 einstellen. --Problem 2: In VideoCaptureProperties können Sie das Format mit CAP_PROPFOUR ändern Es kann auf Jetson nicht geändert werden.

Über Problem 2

Siehe OpenCV-Kamera wird schneller geladen und Verzögerungszeit kürzer

Auflösung ändern


import cv2

cap=cv2.VideoCapture(1)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'));
video_input.set(cv2.CAP_PROP_FPS, 30) 
video_input.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
video_input.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) 

while True:
    ret, frame_read = cap.read()
    cv2.imshow('Read',frame_read )
    cv2.waitKey(30)
cap.release()

Ich fühle mich wie es funktioniert. Aber aus irgendeinem Grund, wenn ich es versuche, auf JETSON

[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (1184) setProperty OpenCV | GStreamer warning: GStreamer: unhandled property

Ich kann nicht zu MJPG wechseln. Wenn Sie sich tatsächlich [OpenCV 4.11 git CAP_gstreamer.cpp] ansehen (https://github.com/opencv/opencv/blob/4.1.1/modules/videoio/src/cap_gstreamer.cpp), ist CAP_PROP_FORCC die eingestellte Funktion. Es ist nicht definiert und ich habe das Gefühl, dass es geschrieben wurde, um in eine nicht behandelte Eigenschaft zu fallen. Da es mit MAC funktioniert, scheint die Implementierung beim Öffnen eines VIDEO-Geräts mit videoCapture einen anderen Code zu verwenden, aber die Operation mit Jetson scheint die im Code vorgesehene Operation zu sein.

Lösung

Ich habe diesen Pfad aufgegeben und die Codec-Auflösung und die FPS geändert, indem ich v4l2src und appsink mit gstreamer angegeben habe.

Ändern Sie die Auflösung v4l2src


import cv2

src = 'v4l2src device=/dev/video1 ! image/jpeg,width=1280, height=720, framerate=(fraction)30/1 !jpegdec !videoconvert ! appsink'

cap=cv2.VideoCapture(src)
while(cap.isOpened()):
    ret, frame_read = cap.read()

    cv2.imshow('Read',frame_read )
    cv2.waitKey(30)
cap.release()

~             

Außerdem können Sie, wenn Sie den Videoeingangsteil von gstreamer neu schreiben, verschiedene Dinge tun, und es scheint Spaß zu machen. Dokumentation von v4l2src Wenn Sie nach den Parametern von gst-launch-1.0 suchen, werden Sie verschiedene Dinge finden.

Recommended Posts

Schalten Sie die Kameraauflösung von OpenCV aus um
Bildaufnahme von der Kamera mit Python + OpenCV
Python, OpenCV-Kameraerfassung
Kameraerfassung mit Python + OpenCV
Wechseln Sie von Python2.7 zu Python3.6 (centos7)
Nehmen Sie Zeitraffer von einer PC-Kamera mit Python, OpenCV auf
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Python, um von einer anderen Sprache zu wechseln