将一些OpenCV处理添加到gstreamer视频流中

8

我正在尝试让OpenCV在gstreamer管道的中间处理一帧。

我有一个gstreamer管道生成流,将其发送到appsink以供OpenCV代码接收:

v4l2src ! ffmpegcolorspace ! jpegenc ! appsink name=sink

另一个管道从appsrc获取数据(由OpenCV发送数据),并将其输出到屏幕上:

appsrc name=src ! jpegdec ! xvimagesink

我在Python中使用OpenCV,通过对接收器发出拉取缓冲区请求并处理它,然后在来源处使用推送缓冲区。但由于某种原因,这似乎不起作用(分段错误)。

但我并不真的想修复它;它非常低效。我只是想知道有没有更好的方法让OpenCV在帧到达输出接收器之前处理它?


2
既然您需要的功能超出了gst-opencv所能提供的范围,如果您不介意使用C(或C ++)编写自己的逻辑,也许您应该尝试将其编写为gst的插件?您可以以gst-opencv插件源代码为起点。 - sinelaw
1
另外一件事 - 你的例子似乎只是从v4l2中获取,而我认为opencv的HighGui API已经支持了这一点(或者至少是没有'2'的v4l)。如果你不真正需要gstreamer,那将是最简单的解决方案。 - sinelaw
  1. 很好的建议,我可能会这样做。
  2. 你说得对,在这种情况下我可以使用HighGUI,但是v4l2src仅作为示例使用。在实际应用中,我打算从tcp源获取视频流,所以我无法完全在OpenCV中实现整个过程。
- SMiLE
2个回答

3
你尝试过使用 gst-opencv 吗?它提供了几个 OpenCV 原语作为 GStreamer 插件。 编辑: 看起来已经被合并到 gst-plugins-bad 中,上面的链接已经过时。

谢谢你的回答。我考虑过使用gst-opencv,但最终决定不用它,因为我想要自由地按照自己的方式处理视频帧(例如,应用特定领域的机器学习算法),而gst-opencv提供的选项非常通用。 - SMiLE

1
我知道您最初的问题已经过去了几年,但只是为了记录,OpenCv可以直接打开Gstreamer管道。请参考通过GStreamer在OpenCV中使用自定义相机中的(自我)答案作为示例。
顺便提一下,OpenCv 3.0(主分支)实际上集成了gstreamer 1.0支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接