我目前正在构建一个能够访问多个USB网络摄像头的应用程序。我很清楚,没有方法可以计算机器上的摄像机设备数量,但是,每当我尝试访问索引错误的摄像机时,我都会得到一个黑色图像。有没有办法用这个图像来表示限制?
例如,我有两个网络摄像头。应用程序从索引0处的第一个摄像头和索引1处的第二个摄像头检索帧。当我将索引增加到2时,我得到的只是一个黑屏(显然,因为没有连接第三个摄像头)。
到目前为止,解决这个问题的唯一方法是访问320x240位图中的每个像素并检查它是否为黑色。这不是很有效,所以也许还有其他方法可以解决这个问题。
感谢您的时间。
答案 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