Счетные камеры OpenCV - PullRequest
       32

Счетные камеры OpenCV

1 голос
/ 10 марта 2012

В настоящее время я создаю приложение, которое может получить доступ к ряду веб-камер USB. Мне хорошо известно, что не существует метода, который мог бы подсчитать количество устройств камеры на машине, однако всякий раз, когда я пытаюсь получить доступ к камере с неправильным индексом, я получаю черное изображение. Есть ли способ использовать это изображение для обозначения ограничения?

Например, у меня есть две веб-камеры. Приложение извлекает кадры из первой камеры с индексом 0 и со второй камеры с индексом 1. Когда я увеличиваю индекс до 2, все, что я получаю, - это черный экран (очевидно, поскольку не подключена третья камера).

Пока что единственный способ сделать это - получить доступ к каждому пикселю в битовой карте 320x240 и проверить, что он черный. Это не очень эффективно, так что, возможно, есть другой способ сделать это, который я пропускаю.

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Самый простой способ - использовать openFrameworks , класс которого называется ofVideoGrabber. С помощью метода listDevices() вы можете перечислить все доступные камеры и выбрать ту, которую хотите использовать.

Следующее, что вам нужно: ofxCv - это альтернативная оболочка OpenCV для openFrameworks, которую вы можете использовать для передачи изображений, захваченных 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 голосов
/ 10 марта 2012

Да, есть метод подсчета камер.

Вы должны использовать directshow или directshow.net.

IEnumMoniker.

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

...