2013-02-10 114 views
3

我在C++(Visual Studio)開發我的一個程序時遇到了一點問題 - 現在我正在努力與多個網絡攝像頭連接(通過USB線連接),爲每個它們將線程分開以捕獲幀,並分離用於處理圖像的幀。我使用OpenCV來處理幀,但問題是,我沒有得到一個網絡攝像頭的可能性的高峯(它支持25幀,我只得到18)有一些庫,我可以用來獲取幀,比處理它們使用OpenCV可以更快地捕獲幀?從網絡攝像頭獲取幀的最快方法

我正在研究一下,最流行的方法是使用directshow來獲取幀和OpenCV來處理它們。

你同意嗎?或者你有另一種解決方案? 我不會被一些鏈接冒犯:)

回答

3

OpenCV使用DirectShow。直接使用DirectShow(Windows中的主要視頻捕獲API)顯然會使您獲得同等或更好的性能(如果OpenCV設置爲使用Windows視頻,則更有可能)。 USB攝像頭通常會達到USB帶寬,因此會限制幀速率,使用DirectShow以壓縮格式或較少比特/像素的格式進行採集是在相同USB帶寬限制內達到更高幀速率的方法。

導致低幀率的另一個典型問題是延遲捕獲的慢同步處理。您通常通過將平凡的處理放入同一個捕獲循環並與處理啓用的操作相比看到更高的FPS來識別這一點。

+0

非常感謝您提供的信息,我不想挑剔,但是您能否向我提供使用Directshow捕獲幀的示例代碼,而在C++中沒有任何不必要的過濾器? – user2058851 2013-02-12 17:30:02

+0

最簡單的(不是最好的,但仍然是最簡單的!)就是製作一個這樣的鏈:'Capture Filter' - >'Sample Grabber Filter' - >'Null Renderer Filter'。所有這三個都是標準的,並且有很多示例代碼。第一個對應於一個攝像頭,你設置捕獲格式,第二個是你設置你的回調接收單個幀的位置。所有這一切都會讓你的代碼從相機的每一幀中調用。 – 2013-02-12 19:35:21

+0

你可以看看VideoCapture.lib的src,這是opencv在這裏使用的:[https://github.com/ofTheo/videoInput/tree/master/videoInputSrcAndDemos/libs/videoInput] – berak 2013-02-12 19:39:03

5
  1. DirectShow是僅使用,如果您使用 CV_CAP_DSHOW標誌來打開你的捕捉,如:

    VideoCapture capture(CV_CAP_DSHOW + 0); // 0,1,2, your cam id there 
    

    (如果沒有它,則默認爲VFW)

  2. 捕獲已經運行在一個單獨的線程中,用更多的線程來包裝它並不會帶來任何好處。

  3. 有多個攝像頭的另一個障礙是USB的帶寬,所以如果你的背&機器的前面有口,不要所有的攝像頭插入到相同的端口/控制器,否則你只是飽和,它

+0

謝謝你的信息,但我不打算創建不必要的線程,只修改現有的線程,所以我可以得到最快的可能的解決方案。 – user2058851 2013-02-12 17:22:59

+0

但是關於USB帶寬的信息確實非常有用 – user2058851 2013-02-12 17:23:43