如何使用 opencv 和 python 获取 Gstreamer 直播?

How to get Gstreamer live stream using opencv and python?

我正在通过在终端中使用以下代码从 raspberry pi 零流式传输实时 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().

之后总是 return None

我已经分别安装了opencv(cv2.__version__ = 3.4.0)和gstreamer(gst-launch-1.0)

我搜索了很多解决方案,但找不到简单的解决方案。我读过 "you should build opencv with gstreamer support" 之类的东西。我如何检查我的 opencv 是否具有 gstreamer 支持以及如何安全地构建具有 gstreamer 支持的 opencv 考虑到我在计算机上同时安装了 opencv 和 gstreamer(我不介意卸载它们但是因为我的 linux知识不是很好应该给我一步一步的指导:/)

有什么解决方案可以让我在不卸载重建 opencv 的情况下使用 python 和 cv2 库获取该流吗?

如果我需要重建带有 Gstreamer 模块支持的 opencv,我该如何安全地卸载我安装的库并重建 opencv?

非常感谢任何帮助!

如果您安装了支持 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。

我自己也遇到了类似的问题,并且 'good' 调试了它。 是我的亲戚 post。

您的问题没有提供关于您如何安装 cv2 python 模块的具体见解。如果您使用 pip 获取包,则无法为包启用 gstreamer。这是因为 pip 仅部署 cv2 包的预构建二进制文件,其中 none 支持 gstreamer。

您需要做的(确实相当容易)是,按照these instructions从源代码分发构建 OpenCV。

注意不要重蹈我的覆辙。使用 cmake 或 ccmake 配置构建时,请确保仅将 WITH_GSTREAMER 设置为 ON。确保 WITH_GSTREAMER_0_10 设置为关闭。

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

对于 cv2 的 pip 安装,这意味着:

pip unistall opencv-python

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

sudo make uninstall

来自 <opencv-src>/build 文件夹。然后再试一次。