#opencv #camera #gstreamer #video-capture #frame-rate
#opencv #камера #gstreamer #видеозахват #частота кадров
Вопрос:
https://www.amazon.fr/gp/product/B08CGVSRQV/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8amp;psc=1
Моя система:
gopro3 => microHDMI к HDMI => HDMI к USB3 (моя покупка выше) => мой компьютер.
с:
gst-launch-1.0 -v v4l2src! video/x-raw, framerate=30/1 ! xvimagesink
Терминал:
...
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-raw, framerate=(fraction)30/1, format=(string)YUY2, width=(int)720, height=(int)480, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)2:4:5:1, interlace-mode=(string)progressive
...
=> ширина = (int) 720, высота = (int) 480
Мой gopro выдает мне 1920/1080/60, и, просто изменяя захват кадров в секунду, разрешение автоматически адаптируется.
Если, например, я принудительно разрешаю:
gst-launch-1.0 -v v4l2src! video/x-raw, framerate=30/1,width=1920,height=1080! xvimagesink
gst-запуск или opencv всегда выходят из строя:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.
Additional debug info:
gstbasesrc.c(3072): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming stopped, reason not-negotiated (-4)
Execution ended after 0:00:00.000049118
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
за исключением 1920/1080/5 кадров в секунду или 1280/720/10 кадров в секунду или 800/600/20 кадров в секунду или 720/480/30 кадров в секунду, 60 кадров в секунду невозможно. Но мой gopro3 black отправляет мне 1920/1080 / 60 кадров в секунду, есть какие-либо объяснения?? Я действительно не понимаю, что произошло. gopro может это сделать, кабель может это сделать, карта захвата может это сделать, мой компьютер может это сделать…..
Более того, в 1080p задержка составляет около 1 секунды и 5 кадров в секунду, в 720p задержка составляет около 0,5 секунды, для 800/600 задержка в порядке, а задержка 480p составляет около 0,2 секунды (идеально для меня).
Для opencv это работает так же плохо, как и gst-streamer:
cv::VideoCapture video_capture(0, cv::CAP_V4L2);
отображает 480p, очень плавно
и
cv::VideoCapture video_capture(0, cv::CAP_GSTREAMER);
отображает разрешение 1080p с большой задержкой
где я совершаю ошибку? Я не понимаю. Моя карта захвата просто плохая? Являются ли мои параметры в gst-launch-1.0 плохими? (Это точно, что я плохо разбираюсь в gstreamer)
Ответ №1:
Проверьте возможности камеры с помощью:
v4l2-ctl --list-formats-ext -d /dev/video0
Скорее всего, вы можете получить только 1080p / 60 кадров в MJPG
секунду (и вы явно запросили x-raw
, сжатие не выполняется). Если это так, попробуйте:
gst-launch-1.0 -e v4l2src ! image/jpeg,width=1920,height=1080,framerate=30/1 ! jpegdec ! xvimagesink
Ответ №2:
v4l2-ctl —list-formats-ext -d /dev /video0
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1600x1200
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1360x768
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x1024
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 1920x1080
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1600x1200
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1360x768
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 1280x1024
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.125s (8.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
v4l2src ! изображение / jpeg, ширина = 1920, высота = 1080, частота кадров = 30/1 ! jpegdec ! xvimagesink
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
X Error of failed request: BadAlloc (insufficient resources for operation)
Major opcode of failed request: 150 (XVideo)
Minor opcode of failed request: 19 ()
Serial number of failed request: 72
Current serial number in output stream: 73
Ответ №3:
Я нашел это, которое, похоже, работает
gst-launch-1.0 -v v4l2src ! "image/jpeg;video/x-raw" ! decodebin ! glimagesink
и для opencv это этот :
cv::VideoCapture video_capture("v4l2src ! image/jpeg;video/x-raw,framerate=30/1 ! decodebin ! videoconvert ! appsink", cv::CAP_GSTREAMER);