2012-03-10 139 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