OpenCV计数相机

时间:2012-03-10 10:45:15

标签: c# opencv camera emgucv

我目前正在构建一个能够访问多个USB网络摄像头的应用程序。我很清楚,没有方法可以计算机器上的摄像机设备数量,但是,每当我尝试访问索引错误的摄像机时,我都会得到一个黑色图像。有没有办法用这个图像来表示限制?

例如,我有两个网络摄像头。应用程序从索引0处的第一个摄像头和索引1处的第二个摄像头检索帧。当我将索引增加到2时,我得到的只是一个黑屏(显然,因为没有连接第三个摄像头)。

到目前为止,解决这个问题的唯一方法是访问320x240位图中的每个像素并检查它是否为黑色。这不是很有效,所以也许还有其他方法可以解决这个问题。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

openFrameworks就是一种简单的方法,它有一个名为ofVideoGrabber的类。使用listDevices()方法,您可以列出所有可用的凸轮,并选择您要使用的凸轮。

您需要的下一件事:ofxCv是openFrameworks的替代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 ...

希望它有所帮助!

答案 1 :(得分:0)

是的,有方法可以计算相机。

你必须使用directshow或directshow.net。

IEnumMoniker。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms692852%28v=vs.85%29.aspx