Opencv 3.4.3 gstreamer 在 Raspberry pi 3 上构建,最后一个 Raspbian 伸展不起作用
Posted
技术标签:
【中文标题】Opencv 3.4.3 gstreamer 在 Raspberry pi 3 上构建,最后一个 Raspbian 伸展不起作用【英文标题】:Opencv 3.4.3 gstreamer build on Raspberry pi 3 last Raspbian stretch not working 【发布时间】:2018-10-18 11:59:27 【问题描述】:我在一个计算机视觉项目上工作了一段时间,在树莓派上使用 opencv,通过 UDP 视频和信息传输到基于桌面 Qt 的应用程序。
最近几天我一直被一个问题困住,我自己无法解决。问题是,我的树莓派 3 上的 opencv 应用程序运行良好,但我需要使用 gstreamer 通过 UDP 将应用程序的输出发送到基于 Qt 的桌面应用程序。
Opencv 通过 videocapture 和 videowriter 接受 gstreamer 管道作为输入和输出,但是为此 opencv 需要在 gstreamer 支持下构建,这就是我面临问题的地方。当我在支持 gstreamer 的树莓派上构建 opencv 3.4.3 时,我不能再使用典型的 Videocapture cap(0) 打开默认摄像头,它就挂在这里。该应用程序不会抛出任何错误或任何东西,它只是不会打开任何东西并保持该状态。我知道问题就在那里,因为我在应用程序上有几条调试消息,并且卡在了这个问题上。除此之外,如果我使用 gstreamer 管道而不是 0(默认相机)作为输入,它可以工作。问题只是默认相机,也许V4l搞砸了我不知道。在终端上单独使用 gstreamer 管道,效果很好。
研究了一下,我意识到我需要的 gst-plugins-bad 使用了一些 opencv 库,我在 nvidia 论坛上看到这正是因为这个而在 jestson 板上造成了一些麻烦,但我没有看到一个明确的解决方案。我不知道 gst-plugins-bad 是否覆盖了我的 opencv 安装,这就是原因(gst-plugins-bad 使用旧版本的 opencv)。无论如何,我尝试在 gst-plugins-bad 之后安装 opencv 3.4.3 也没有运气。就像 V4l 在我的 opencv 3.4.3 版本上无法正常工作。
另一方面,我尝试在我的桌面 ubuntu 18.04 和 gstreamer 1.14.1 上构建 opencv 3.4.3,它可以正常工作,并且可以正常理解 videocapture cap(0),正如预期的那样,我可以毫无问题地运行为树莓派设计的应用程序,甚至在输入和输出中添加 gstreamer 管道,一切正常。我认为 raspberry gstreamer 是 1.10 版。
我即将尝试从源 gstreamer 1.14.1 构建和安装,该源 gstreamer 1.14.1 在我的桌面 Ubuntu 上与我的树莓派上的 opencv 一起工作,但这将是漫长而痛苦的。如果有人能对这里发生的事情有所了解,我将不胜感激。
非常感谢。
【问题讨论】:
【参考方案1】:当我上次检查时(几年前),解决这个问题的最佳方法是构建一个“gstreamer 插件”......这是假设您不是在做专有软件(gstreamer 是 GPL)。
正如您所提到的,gstreamer 代码库中至少有一个 opencv 插件(非常庞大)。当我上次检查时,它位于 gst-plugins-bad 存储库中。
一种方法是提取 gstreamer 源代码,然后自己构建插件。一旦您可以自己构建 opencv 驱动的插件(并使用适当的 gst-launch 管道对其进行测试),您就可以开始根据需要对其进行修改。第一步是将该插件中的 openCV 版本替换为您自己项目中的版本。第二步可能是让所有加速工作(如 TBB、cuda 等,具体取决于您的平台)。
之后,您可以将您的项目推送到插件中。这样做的好处是您可以将项目设置为在一个非常有效的多媒体框架中工作。您还可以在 gstreamer 的 IRC 频道上轻松获得这方面的帮助,这些开发人员“生活”的地方(在 Freenode 上,在#gstreamer 中)。
如果您不将项目作为 gstreamer 插件进行,则唯一的其他选项(我上次检查过的)是使用 gstreamer 的 appsource 和 appsink 插件。如果这些天有支持的话,这些可能是 openCV 在后台使用的。我希望 gstreamer 的版本在这里很重要,因此请查看 openCV 文档他们构建它的 gstreamer 版本。
但是,请考虑将其作为 gstreamer 插件。这是一个非常酷的世界,有许多善良的开发人员可能会在那个 IRC 频道上为你提供很多帮助......再次:这是我上次检查的方式......几年前
【讨论】:
感谢您的回答。最后我明白了这个问题。问题在于,不知何故,在 raspberry pi 上使用 gstreamer 支持编译 opencv 时,opencv 将 gstreamer 建立为相机的默认后端。这就是为什么使用 0 作为参数不起作用的原因,因为 opencv 认为我指的是 gstreamer 管道。 opencv 上的文档说可以使用相机的索引加上后端编号参考来指定相机的后端,在 V4L 的情况下它是 200。因此,使用 200 作为参数(200 加 0,相机 0)解决了这个问题,opencv可以通过V4L打开相机。以上是关于Opencv 3.4.3 gstreamer 在 Raspberry pi 3 上构建,最后一个 Raspbian 伸展不起作用的主要内容,如果未能解决你的问题,请参考以下文章
从 python 中的 opencv 写入 Gstreamer 管道
带有 Gstreamer 流的 OpenCV 具有延迟、缓慢和伪影