2012-03-10 142 views
1

我目前正在構建一個能夠訪問多個USB網絡攝像頭的應用程序。我很清楚,沒有一種方法可以計算機器上相機設備的數量,但是,每當我試圖訪問索引錯誤的相機時,我都會得到一個黑色圖像。有沒有什麼方法可以用這個圖像來表示一個限制?OpenCV計數相機

例如,我有兩個攝像頭。應用程序從索引爲0的第一臺攝像機和索引爲1的第二臺攝像機獲取幀。當我將索引增加到2時,我所得到的只是一個黑屏(顯然,因爲沒有連接第三臺攝像機)。

到目前爲止,如何解決這個問題的唯一方法是訪問320x240位圖中的每個像素,並檢查它是否是黑色。這不是非常有效,所以也許還有其他方法可以做到這一點,我忽略了。

謝謝你的時間。

回答

2

一個簡單的方法將與openFrameworks,其中有一個叫ofVideoGrabber類中去。使用listDevices()方法,您可以列出所有可用的攝像頭並選擇您想使用的攝像頭。

您需要的下一件事:ofxCv是openFrame的替代OpenCV包裝,您可以使用它將圖像抓取到ofVideoGrabber轉移到OpenCV或其他處理。

所以你可以做這樣的事情:

// Inside Foo.h 
#include "ofxCv.h" 

// import namespaces for OpenCV & ofxCv 
using namespace cv; 
using namespace ofxCv; 

// vars we need 
ofVideoGrabber vidGrabber; 
ofImage inputImg; 
Mat matImg; 

// setup video grabber 
vidGrabber.setVerbose(true); 
vidGrabber.setDeviceID(1); // choose the right one via vidGrabber.listDevices() 
vidGrabber.initGrabber(320,240,false); 
int grabW = vidGrabber.width; 
int grabH = vidGrabber.height 

// grab current frame 
vidGrabber.grabFrame(); 
inputImg.setFromPixels(vidGrabber.getPixels(), 320, 240, OF_IMAGE_COLOR); 

// get cv::Mat 
matImg = toCv(inputImg).clone(); 

... further processing ... 

希望它能幫助!

+0

有什麼用C#編寫的?我使用的是EmguCV而不是OpenCv。 – 2012-03-13 09:31:16

+0

@ swift1691我擔心答案是否定的,但我不寫在C#中的任何應用程序...順便說一句:你的標題是誤導! – dom 2012-03-13 10:31:12