如何使用opencv和python获取Gstreamer实时流?

时间:2018-07-06 15:38:45

标签: python opencv ubuntu raspberry-pi gstreamer

我正在使用终端中的以下代码从树莓派0流式传输实时USB摄像机供稿:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! "image/jpeg,width=640, height=480, framerate=30/1" ! rtpjpegpay ! udpsink host=<MyRPiIPHere> port=5000

通过在终端中使用以下代码,我可以从我的计算机(ubuntu 18.4)上获得低延迟高帧率流:

gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, encoding-name=JPEG, payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink

但是,我想使用python和opencv获取该流,以便对图像进行一些操作。

当我尝试使用具有以下代码的cv2库获取图像时:

cap = cv2.VideoCapture('udpsrc port=5000 ! application/x-rtp, encoding-name=JPEG, payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink')

它什么也没捉住。我还尝试过将各种类型的! videoconvert ! video/x-raw, format=(string)BGR ! appsink版本添加到视频捕获参数中。

frame在调用ret, frame = cap.read()后始终返回 None

我分别安装了opencv(cv2 .__ version__ = 3.4.0)和gstreamer(gst-launch-1.0)。

我为该解决方案进行了大量搜索,但找不到简单的解决方案。我读过类似“您应该在gstreamer支持下构建opencv” 之类的内容。如何检查我的opencv是否具有gstreamer支持,以及如何在计算机上同时安装了opencv和gstreamer的情况下安全地使用gstreamer支持构建opencv(我不介意卸载它们,但是由于我的Linux知识不好一个应该给我逐步说明:/)

我有什么解决方案可以通过python和cv2库获得该流,而无需卸载重新构建opencv吗?

如果需要在Gstreamer模块支持下重建opencv,如何安全卸载已安装的库并重建opencv?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我本人也遇到了类似的问题,并且在调试它的时候花了很多时间。 Here是我的相关文章。

您的问题没有提供有关如何安装cv2 python模块的离散见解。如果您使用pip来获取软件包,则无法为该软件包启用gstreamer。这是因为pip仅部署cv2软件包的预构建二进制文件,并且都不支持gstreamer。

您需要做的(确实很容易)是,按照these instructions从源代码发行版本构建OpenCV。

当心不要犯与我相同的错误。使用cmake或ccmake配置内部版本时,请确保仅将WITH_GSTREAMER设置为ON。确保WITH_GSTREAMER_0_10设置为OFF。

此外,从源代码进行安装之前,请确保先鞭打所有现有的二进制文件。

对于cv2的pip安装将意味着:

pip unistall opencv-python

如果您已经从opencv源构建了二进制文件,则必须:

sudo make uninstall

来自<opencv-src>/build文件夹。然后继续进行下去。

答案 1 :(得分:0)

如果您安装了带有gstreamer支持的opencv,我可以回答有关如何查找的问题。

将其粘贴到您的Python脚本中:

print(cv2.getBuildInformation())

您应该找到类似的内容:

    Video I/O:
...
    GStreamer:                   
      base:                      YES (ver 1.8.3)
      video:                     YES (ver 1.8.3)
      app:                       YES (ver 1.8.3)
...

如果不是,则必须在gstreamer支持下重新安装opencv。