C / Ubuntu / OpenCV: у gopro очень низкий кадр / разрешение

#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);