c++ - una - opencv python camera test
No se pueden leer fotogramas de VideoCapture desde la cámara web secundaria con OpenCV (2)
La forma más fácil de resolver es leer una vez antes de verificar el éxito. Este fragmento de código funciona para mí. //
cap.read(frame);
if(!cap.read(frame)){
// ...
Código:
Ejemplo simple que funciona perfectamente con la cámara web primaria (dispositivo 0):
VideoCapture cap(0);
if (!cap.isOpened()) {
std::cout << "Unable to read stream from specified device." << std::endl;
return;
}
while (true)
{
// retrieve the frame:
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to retrieve frame from video stream." << std::endl;
break;
}
// display it:
imshow("MyVideo", frame);
// check if Esc has been pressed:
if (waitKey(1) == 27) {
break;
}
// else continue:
}
cap.release();
Problema:
Tengo una segunda cámara web, que me gustaría usar. Sin embargo, cuando reemplazo VideoCapture cap(0);
con VideoCapture cap(1);
, la secuencia se está abriendo correctamente (o al menos cap.isOpened()
devuelve true
) pero la cap.read(frame)
devuelve false
y no puedo averiguar por qué.
Lo que he intentado:
He estado tratando de jugar con la configuración de
VideoCapture
un poco como llamar:cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);
y cosas al azar como esa, pero nada parece ayudar.
También he encontrado esto: VideoCapture :: read falla en el video sin comprimir (Bug # 2281) , que parece estar resuelto en la versión 2.4.7 .. pero acabo de actualizar OpenCV a 2.4.8 y aún no lo hace trabajo...
Intenté utilizar AMCap para capturar el video sin procesar de esta cámara, guardarlo como
aaa.avi
archivoaaa.avi
yVideoCapture
llamando a:VideoCapture cap("aaa.avi");
y funciona (mientras se lee desde el archivo) ... lo que necesito es un procesamiento en tiempo real con visualización en vivo.
HW, OS, SW detalles:
Mi HW: HP ProBook 4510s con cámara web incorporada que siempre funciona a la perfección
+ cámara web externa CANYON CNR-FWCII3, referido por OS como "dispositivo de video USB" (el problemático) SO, SW: Windows 8.1 Pro x86, Visual Studio 2012 Pro, OpenCV 2.4.8 ~ usando vc11 build
Preguntas:
- ¿Me estoy perdiendo de algo?
- ¿Hay algo más que pueda hacer?
- ¿Hay alguna forma, al menos, de recuperar información adicional sobre cuál podría ser realmente el problema?
... La API de OpenCV parece bastante pobre en este caso y en todas partes donde la gente parecía estar enfrentando un problema similar, había alguien que decía que era "OS / HW depnendant" como una excusa.
Cualquier ayuda será apreciada.
Después de un tiempo, descubrí que siempre es la primera read
que falla la read
y que omitir el primer fotograma funcionaba bien, aunque la verdadera razón de este comportamiento seguía siendo desconocida.
Más tarde James Barnett (ver comentarios arriba) ha señalado que la razón podría ser que lleva un tiempo hasta que la cámara se prepara para la captura y mi solución actual se ve de la siguiente manera (sueño de C ++ 11):
#include <chrono>
#include <thread>
...
VideoCapture cap(1);
// give camera some extra time to get ready:
std::this_thread::sleep_for(std::chrono::milliseconds(200));
if (!cap.isOpened()) {
std::cout << "Unable to read stream from specified device." << std::endl;
return;
}
while (true)
{
// retrieve the frame:
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to retrieve frame from video stream." << std::endl;
continue;
}
// display it:
imshow("LiveStream", frame);
// stop if Esc has been pressed:
if (waitKey(1) == 27) {
break;
}
}
cap.release();
Con suerte, algunos visitantes futuros lo encontrarán útil :)