2014-05-06 104 views
2

我需要在openCV代碼內部調用Gstremaer(本質上是打開攝像機)。 當我瀏覽源代碼時,modules/highgui/src/cap_gstreamer.cpp似乎是我正在尋找的文件。在openCV中調用Gstreamer

我用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相關的功能(例如cvCreateCapture_GStreamer這裏面cap_gstreamer.cpp定義) cap_gstreamer.cpp成功建成OpenCV的安裝日誌提示:

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

cvCreateCapture_GStreamer是也出現在/usr/local/lib/libopencv_highgui.so.3.0.0裏面後建立openCV (發現使用grep

我用#include <opencv/highgui.h>但調用cvCreateCapture_GStreamer失敗(-lopencv_highgui標誌設置Makefile裏):

error: ‘cvCapture_GStreamer’ was not declared in this scope 

任何建議將是有益的,不勝感激。

謝謝!

+0

cvCapture_GStreamer不是公共(客戶端)API的一部分。它在highgui模塊內部使用。 – berak

回答

1

實際上,您不能通過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,您將調用與高級函數相同的函數(如cvCaptureFromCam),但在較低級別上,它將調用實現對GStreamer API的調用的函數,如cvCreateCapture_GStreamer。但這並不意味着你可以稱自己爲那些低級函數(因此「未在此範圍內聲明」錯誤)。

希望它有幫助!

編輯: 看看在opencv源文件cap.cpp。注意CvCreateCameraCapture_XXX的不同選項。這讓我覺得你應該可以在沒有某些依賴的情況下打開你的相機(通過使用其他人)。

+0

這是一個很好的解釋,謝謝!因此,默認情況下(例如,編譯OpenCV時不支持GStreamer),它(打開相機)是如何工作的? 我問的原因是我有一個自定義板,它使用其他驅動程序而不是v4l/v4l2,我可以使用gstreamer打開相機,但顯然沒有嘗試使用OpenCV。有沒有辦法改變低級別的OpenCV函數來使用其他驅動程序? – Mahyar

+0

我編輯了我的答案,但我沒有深入瞭解highgui依賴關係如何在較低級別上工作。您可能會問另一個問題,如「安裝OpenCV 」或進一步搜索OpenCV文檔.. –