Cámaras de conteo OpenCV

Actualmente estoy creando una aplicación que puede acceder a varias cámaras web USB. Soy muy consciente de que no existe un método que pueda contar la cantidad de dispositivos de cámara en una máquina, sin embargo, cada vez que intento acceder a una cámara con un índice incorrecto, obtengo una imagen negra. ¿Hay alguna forma de usar esta imagen para indicar un límite?

Por ejemplo, tengo dos cámaras web. La aplicación recupera fotogramas de la primera cámara en el índice 0 y de la segunda cámara en el índice 1. Cuando incremento el índice a 2, todo lo que obtengo es una pantalla negra (obviamente, ya que no hay una tercera cámara conectada).

Hasta ahora, la única forma de hacerlo es acceder a cada píxel en un mapa de bits de 320x240 y verificar que sea negro. Esto no es muy eficiente, por lo que tal vez haya alguna otra forma de hacer esto que estoy pasando por alto.

Gracias por su tiempo.

preguntado el 10 de marzo de 12 a las 10:03

2 Respuestas

Una forma fácil sería ir con OpenFrameworks, que tiene una clase llamada ofVideoGrabber. Con su listDevices() método puede enumerar todas las cámaras disponibles y elegir la que desea utilizar.

Lo siguiente que necesitas: ofxCv es un contenedor alternativo de OpenCV para openFrameworks, que puede utilizar para transferir las imágenes capturadas por ofVideoGrabber a OpenCV o para el resto del procesamiento.

Entonces podrías hacer algo como esto:

// 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 ...

¡Espero eso ayude!

respondido 11 mar '12, 12:03

¿Hay algo escrito en C #? Estoy usando EmguCV en lugar de OpenCv. - justin saliba

@ swift1691 Me temo que la respuesta es NO, pero no estoy escribiendo ninguna aplicación en C #… Por cierto: ¡Su título es engañoso! - dom

Sí, existe un método para contar cámaras.

tienes que usar directshow o directshow.net.

IEnumMoniker.

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

respondido 10 mar '12, 11:03

¿Qué pasa con los usuarios que no utilizan la plataforma Windows? - burbuja

@bubble echa un vistazo a mi comentario;) - dom

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.