[PYTHON] Changer la résolution de la caméra d'OpenCV

introduction

Le travail à domicile a commencé et le prix des caméras WEB est monté en flèche. J'ai eu du mal à changer la résolution et la fréquence d'images lors de la capture avec openCV avec la caméra Henachoko que j'ai achetée pendant cette période, je vais donc le résumer.

Ce que j'ai fait

Lors de l'utilisation d'openCV dans Jetson, lorsque j'ai essayé de changer le code de la caméra WEB, il a été dit qu'il s'agissait d'une propriété non gérée dans l'ensemble de CAP_PROP_FOURCC, alors entrez v4l2src, utilisez gstreamer pour sortir appsink et utilisez ceci comme chaîne de caractères d'argument de videoCapture. J'ai changé le code et la résolution de la caméra en spécifiant comme.

Changement de fréquence d'images dans OpenCV

Normalement Comme décrit dans [Python] Taille d'image de la caméra Web et paramètres FPS avec OpenCV

Changer la résolution


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) 

Vous pouvez changer la résolution en faisant quelque chose comme ça. A ce moment, la résolution et le FPS de la destination de changement doivent être pris en charge par la caméra, et cette liste peut être obtenue en utilisant la commande v4l2-ctl ou similaire. Ce qui suit est la sortie de la caméra Henachoko cible cette fois.

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$ 

Si vous n'avez pas v4l2-ctl, vous pouvez l'installer avec apt install v4l-utils.

problème

--Problème 1: OpenCV tente d'ouvrir la caméra avec YUYV Dans l'exemple de sortie ci-dessus, OPENCV essaie d'ouvrir à 640x360-30FPS, le premier YUYV (je ne sais pas si c'est le premier). Sauf si vous modifiez ce comportement et basculez l'appareil photo au format MJPG, vous ne pouvez pas définir une résolution autre que 640x360 avec cet appareil photo Henachoko. --Problème 2: Dans VideoCaptureProperties, vous pouvez changer le format avec CAP_PROP_FOURCC Il ne peut pas être changé sur Jetson.

À propos du problème 2

Reportez-vous à Chargement de la caméra OpenCV plus rapide et temps de retard plus court

Changer la résolution


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()

J'ai l'impression que ça marche. Mais pour une raison quelconque, quand je l'essaye, sur 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

Je ne peux pas passer au MJPG. Si vous regardez réellement OpenCV 4.11 git CAP_gstreamer.cpp, CAP_PROP_FORCC est la fonction définie. Ce n'est pas défini et j'ai l'impression que c'est écrit pour tomber dans une propriété non gérée. Cela fonctionne lorsque vous le faites avec MAC, il semble donc que l'implémentation lors de l'ouverture d'un périphérique VIDEO avec videoCapture utilise un autre code, mais l'opération avec Jetson semble être l'opération conçue dans le code.

Solution

J'ai abandonné ce chemin et changé la résolution du codec et le FPS en spécifiant v4l2src et appsink avec gstreamer.

Changer la résolution 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()

~             

De plus, si vous réécrivez la partie d'entrée vidéo de gstreamer, vous pouvez faire diverses choses et cela semble amusant. Documentation de v4l2src Ou, si vous recherchez par les paramètres mis sur gst-launch-1.0, vous trouverez diverses choses.

Recommended Posts

Changer la résolution de la caméra d'OpenCV
Acquisition d'images depuis une caméra avec Python + OpenCV
Capture de caméra Python, OpenCV
Capture de caméra avec Python + OpenCV
Passer de python2.7 à python3.6 (centos7)
Tirez en accéléré à partir d'une caméra PC en utilisant Python, OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
Python pour passer d'une autre langue