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.
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.
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 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.
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.
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