2014-07-17 130 views
0

我試圖從連接到USB集線器的幾個USB攝像頭捕獲單幀。我已經寫了一些東西,我相信應該工作,但它不會:(。最終的結果產生基於參數圖像的正確數目,但所有除最後是「空白」。從多個USB攝像頭捕獲幀 - OpenCV,C++

#include <opencv2/highgui/highgui.hpp> 

#include <stdio.h> 
#include <iostream> 
using namespace cv; 


int main(int argc, char** argv){ 

    int numberOfCameras = atoi(argv[1]); 
    std::vector<Mat> frames (numberOfCameras-1); 

    for(int i=0; i<numberOfCameras; i++){ 
    VideoCapture cap(i); 
    cap.set(CV_CAP_PROP_FRAME_WIDTH,320); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,240); 
    Mat frame; cap >> frame; 

    frames.push_back(frame); 
    } 

    for(int i=0; i<numberOfCameras; i++){ 
    string fileName = std::to_string(i) + ".jpg"; 
    std::cout << fileName << std::endl; 
    imwrite(fileName, frames[i]); 
    } 
} 

這裏是怎麼回事?我對C++和類型語言有點陌生,我誤解了矢量的使用方法嗎?以上是完成我的任務的最佳方法嗎?

我將連接多個相機(總共50個),並且對於在存儲器中存儲50幀的影響感到好奇,我可以打開很多相機上的通話捕獲嗎?

回答

4

來自網絡攝像頭的幀是特殊的,因爲它們指向視頻捕捉/驅動器內的(靜態)存儲器。

,因爲你創建和銷燬VideoCapture在循環,存儲在您的載體框架將是無效的(他們指向內存中消失了)

,使你的計劃工作,你需要克隆( )將其存儲(因此它保留自己的像素的複印件)之前的幀

frames.push_back(frame.clone()); 
+0

這似乎沒有工作,我仍然收到相同的結果。還有其他建議嗎? –

2

這很可能是因爲您受硬件限制。 USB攝像頭傾向於從USB總線獲得儘可能多的帶寬,因此使用USB集線器連接多個帶寬可能不是一個好主意。

嘗試僅連接兩臺攝像機,並立即將集線器從您的設置中取出。如果幸運的話,您的系統有兩條獨立的USB總線,您可以通過嘗試以各種方式連接相機電纜來找到它們。檢查您的主板/筆記本電腦手冊,看它是否有單獨的總線。您還可以找到適用於您的操作系統的教程,以瞭解如何查看它們是否存在於系統中。

如果您有兩條巴士,但仍然無法從兩個攝像頭獲取圖像,則問題可能出在您的代碼中。您可以在此閱讀更多SO post

+0

我不太明白相機(或四個)如何在480p60上飽和usb 3.0甚至3.1的帶寬! –

+0

這篇文章是關於USB 2.0的 –

2

在我正在做的一個項目中,我試圖同時使用四個USB攝像頭,但沒有奏效。

我只設法同時連接兩臺攝像機。

你基本上有兩種選擇:

1至玩弄相機,即抓住一個攝像頭,讀一幀,然後釋放並移動到下一個攝像機....

2-按照(1)中的規定,隨時抓住一臺攝像機(最重要的一臺攝像機)並調整其餘的攝像機。

儘管您可以嘗試將外部電源連接到USB集線器,這可能會幫助您同時捕獲三個攝像頭,但是我非常懷疑,無論使用OpenCV,您都可以捕獲四個以上的攝像頭什麼。

我試圖用不同的相機,不同的(獨立)USB端口和不同的USB集線器。我能得到的最大數量是四個不同的攝像頭,每個攝像頭都連接到不同的USB端口,並且它並不總是工作。

注意事項:功耗,帶寬和OpenCV自身的限制。

順便說一句:我在具有4GB RAM的Intel i5筆記本電腦上使用OpenCV 2.4.8和Windows 7 64位。