在OpenCV中调用Gstreamer

3

我需要在一个openCV代码中调用Gstremaer(本质上是打开视频相机)。 通过查看源代码,modules/highgui/src/cap_gstreamer.cpp 似乎是我要找的文件。

我使用了带有Gstreamer标志的OpenCV进行编译。

 GStreamer:
--       base:                      YES (ver 1.2.3)
--       video:                     YES (ver 1.2.3)
--       app:                       YES (ver 1.2.3)
--       riff:                      YES (ver 1.2.3)
--       pbutils:                   YES (ver 1.2.3)

但我无法调用与Gstreamer相关的函数(例如在cap_gstreamer.cpp中定义的cvCreateCapture_GStreamer)。 根据OpenCV安装日志的建议,cap_gstreamer.cpp已成功构建:

[ 17%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/cap_gstreamer.cpp.o

cvCreateCapture_GStreamer是在构建openCV后的/usr/local/lib/libopencv_highgui.so.3.0.0中存在的(使用grep查找)。

我使用#include <opencv/highgui.h>,但调用cvCreateCapture_GStreamer失败了(Makefile中设置了-lopencv_highgui标志):

error: ‘cvCapture_GStreamer’ was not declared in this scope

任何建议都将有所帮助,感激不尽。

谢谢!


cvCapture_GStreamer不是公共(客户端)API的一部分。它在highgui模块内部使用。 - berak
1个回答

2

实际上,你不能通过OpenCV使用GStreamer API。OpenCV拥有一系列的包装函数(例如cvCaptureFromCam),它们通过外部多媒体库来实现其功能。除了GStreamer之外,OpenCV可能会使用其他库,如ffmpeg、v4l等。事实上,如果你查看与不同外部库进行多媒体捕获相关的完整文件列表,你会发现:

(in opencv/modules/highgui/src)
cap_cmu.cpp    
cap_dc1394.cpp    
cap_ffmpeg.cpp    
cap_gstreamer.cpp
...

因此,如果您使用GStreamer支持编译OpenCV,则将调用相同的highgui函数(如cvCaptureFromCam),但在低级别上,它将调用实现对GStreamer API的调用的函数,例如cvCreateCapture_GStreamer。但这并不意味着您可以自己调用这些低级别函数(因此出现“未在此范围内声明”的错误)。
希望这有所帮助!
编辑: 请查看opencv源文件中的cap.cpp文件。注意CvCreateCameraCapture_XXX的不同选项。这使我想到,您应该能够使用其他选项打开摄像头而无需某些依赖项。

1
这是一个很好的解释,谢谢!那么,默认情况下(例如编译不支持GStreamer的OpenCV),它(打开相机)是如何工作的? 我问这个问题的原因是我有一个使用v4l/v4l2以外的其他驱动程序的自定义板,我可以使用gstreamer打开相机,但显然无法尝试使用OpenCV。是否有任何方法可以更改低级别的OpenCV函数以使用其他驱动程序? - Mahyar
我编辑了我的答案,虽然我对高级 GUI 依赖项在更低层次上的工作原理没有更深入的了解。您可以提出另一个问题,比如“在<yourBoard>中安装OpenCV”,或在OpenCV文档中进一步搜索。 - Яois

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