更改 GStreamer 视频设备分辨率

Change GStreamer Video Device Resolution

我正在尝试将 USB 3 采集卡与 GStreamer 一起使用,但是采集卡上唯一暴露的分辨率似乎是 1080p60,这似乎是我的 Coral 开发板无法处理、转换和处理的数据量通过及时的对象检测。

我使用了 480p30 的 USB 2 卡,它可以工作,但想要更高一点的。我已经尝试了两张 USB 3 卡,一张 Elgato game capture hd60 s+ 和一张 pengo 1080p grabber,两者似乎都有同样的问题。

当我使用我的 USB 2 卡时,它在 windows 上的 OBS 中和在 Linux 上列出可用格式时,它都会显示具有不同帧率的多种不同分辨率,但是,两个 USB3 卡只显示1080p60.

我在 1080p60 下的推理非常缓慢、滞后,程序在使用任何其他参数(包括 1080p30、720p60 和 720p30)时崩溃。我认为 720p30 比较理想,但我不确定如何实现。

我一直在使用 this 脚本在 4GB 的珊瑚开发板上进行 运行 推理。如果可能的话,我想坚持python。

使用 1080p60 时的警告,以及缓慢和滞后:

Warning: gst-core-error-quark: A lot of buffers are being dropped. (13): gstbasesink.c(2902): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/glsvgoverlaysink+GlSvgOverlaySink:overlaysink/GstGLImageSinkBin:glimagesinkbin0/GstGLImageSink:sink:

There may be a timestamping problem, or this computer is too slow

gstreamer 代码:

v4l2src device=/dev/video1 ! video/x-raw,width=1920,height=1080,framerate=60/1 ! decodebin ! glupload ! tee name=t

t. ! queue ! glfilterbin filter=glbox name=glbox ! video/x-raw,format=RGB,width=300,height=300 ! appsink name=appsink emit-signals=true max-buffers=1 drop=true

t. ! queue ! glsvgoverlaysink name=overlaysink````

您可以使用 cv2 (pip install opencv-python) 访问 USB 摄像头。

这里有一个小例子,说明如何从相机获取图像并将其显示在单独的 Window

# import the opencv library
import cv2
  
  
# define a video capture object
vid = cv2.VideoCapture(0)
  
while(True):
      
    # Capture the video frame
    # by frame
    ret, frame = vid.read()
  
    # Display the resulting frame
    cv2.imshow('frame', frame)
      
    # the 'q' button is set as the
    # quitting button you may use any
    # desired button of your choice
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
  
# After the loop release the cap object
vid.release()
# Destroy all the windows
cv2.destroyAllWindows()

您的 gstreamer 管道似乎编写效率低下。

我建议尽早使用 videoscale 和 capsfilter,除非你真的想使用 1080p 流。

例如,

v4l2src device=/dev/video1 ! videoconvert ! videoscale ! videorate ! video/x-raw,format=RGB,width=1080,height=720,framerate=30/1 ! # this will ensure you get 720@30 even if this camera doesn't support it.
# decodebin ! YOU DO NOT NEED decodebin for video/x-raw
glupload ! tee name=t

t. ! queue ! glfilterbin filter=glbox name=glbox ! video/x-raw,format=RGB,width=300,height=300 ! appsink name=appsink emit-signals=true max-buffers=1 drop=true

t. ! queue ! glsvgoverlaysink name=overlaysink````

通常,此类 GStreamer off-the-shelf 过滤器比 python-cv(甚至 C++-CV)更快、更高效(内存更少)。

此外,对于具有 high-latency 过滤器的此类队列,请考虑限制队列大小并使它们泄漏(我使用 leaky=2 进行 real-time 推断)。

另一个建议:如果你做的是 运行 tensorflow-lite 具有 edge-tpu 的模型,你可以使用 nnstreamer 而不是 cv 过滤器,除非 CV 接口提供比调用 [=27= 更高的效率]代表团。