Opencv 3.4.3 gstreamer 在 Raspberry pi 3 上构建,最后一个 Raspbian 拉伸(stretch)不起作用

标签 opencv raspberry-pi gstreamer opencv3.0

我已经在一个计算机视觉项目上工作了一段时间,在树莓派上使用 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 管道添加到输入和输出,一切都很好。我认为覆盆子 gstreamer 是 1.10 版。

我将尝试从源 gstreamer 1.14.1 构建和安装,该源 gstreamer 1.14.1 在我的桌面 Ubuntu 上与我的树莓派上的 opencv 一起工作,但这将是漫长而痛苦的。如果有人能对这里发生的事情有所了解,我将非常感激。

非常感谢你。

最佳答案

上次我检查时(几年前),解决这个问题的最好方法是构建一个“gstreamer 插件”......这是假设你没有做专有软件(gstreamer 是 GPL)。

正如您所提到的,gstreamer 代码库中至少有一个 opencv 插件(非常庞大)。当我上次检查时,它位于 gst-plugins-bad 存储库中。

一种前进的方式是提取 gstreamer 源代码,并自己构建插件。一旦您可以自己构建 opencv 驱动的插件(并使用适当的 gst-launch 管道对其进行测试),您就可以开始根据需要对其进行修改。第一步是将该插件中的 openCV 版本替换为您自己项目中的版本。第二步可能是让所有加速工作(如 TBB、cuda 等,具体取决于您的平台)。

之后,您可以将您的项目推送到插件中。这样做的好处是您可以将项目设置为在一个非常有效的多媒体框架中工作。您还可以在 gstreamer 的 IRC channel 上轻松获得有关此方面的帮助,这些开发人员“居住”的地方(在 Freenode 上,在 #gstreamer 中)。

如果您不将项目作为 gstreamer 插件进行,则唯一的其他选项(我上次检查过的)是使用 appsourceappsink gstreamer 的插件。如果这些天有支持的话,这些可能是 openCV 在后台使用的。我希望 gstreamer 的版本在这里很重要,因此请查看 openCV 文档他们构建它的 gstreamer 版本。

但是,请考虑将其作为 gstreamer 插件。这是一个非常酷的世界,有很多善良的开发人员可能会在那个 IRC channel 上为你提供很多帮助......再次:这就是我上次检查的方式......几年前

关于Opencv 3.4.3 gstreamer 在 Raspberry pi 3 上构建,最后一个 Raspbian 拉伸(stretch)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52873490/

相关文章:

networking - Raspberry Pi 上使用 batman-adv 协议(protocol)的无线网状网络

python - 如何在 Python 中终止我的子进程

video - 如何使用 rm/rmvb 支持编译 ffmpeg?

audio - gstreamer-从网站播放音频..缓冲问题

gstreamer - 如何形成 gstreamer 管道来从 tiff 文件编码 mp4 视频?

c++ - 带加速度的卡尔曼滤波器

java - 具有特定边框颜色和特定背景颜色的裁剪矩形 JAVA

linux - 是否有通过 SSH 获取文件的 Raspberry Pi 命令?

java - 从 org.bytedeco.javacv.Frame 转换为 matlab 图像

c++ - 如何将这个用于 OpenCV 的 MatExpr 的 C 包装器的指针输出转换回 MatExpr