Captura 1080p a 30 fps de logitech c920 con openCV 2.4.3
(2)
Como el autor de la publicación ya encontró la solución pero no la agregó como respuesta, pondré la solución aquí.
Debe configurar el códec antes de establecer la resolución deseada:
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC(''M'',''J'',''P'',''G''));
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
Estoy tratando de capturar la transmisión de video de mi Logitech C920 en OpenCV. Con Labview puedo acceder a una transmisión MJPG a 30 fps 1080p. En opencv estoy limitado a 5fps o 640x480.
Aquí está el código relevante para la configuración de la cámara:
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC(''M'',''J'',''P'',''G''));
Todos estos devuelven 1, pero obtengo un flujo de 5fps de 1080p que corresponde a la secuencia YUY2.
Si agrego la siguiente línea:
this->camRef.set(CV_CAP_PROP_FPS, 30);
Esto devuelve 0. Obtengo un flujo de 30 fps a 640x480. Para mí, parece que la configuración MJPG no se acepta, pero no sé qué hacer o cómo solucionarlo.
EDITAR: Lo siguiente bloquea el programa.
this->camRef.read(this->image);
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC(''M'',''J'',''P'',''G'')) << std::endl;
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
Luego en mi código de ejecución tengo lo siguiente:
void camera::run()
{
while(true)
{
if(this->camRef.read(this->image) == 0)
{
if(this->capture)
{
cv::imwrite(fileName,this->image);
this->count++;
}
}
msleep(15);
}
}
EDIT2: La solución es establecer el códec fourCC antes de configurar la altura y el ancho de la cámara.
Intenta obtener el primer fotograma de la captura antes de configurar nada:
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
Mat frame;
cap >> frame;
double fps;
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0);
//add the loop here
y verifique si funcionará sin configurar MJPG. Si funciona, prueba con MJPG.
Para mí es un poco extraño que tengas que obtener el primer fotograma antes de configurar nada, pero es la única forma en que funciona para mí (Windows 7 de 32 bits).
//editar:
Es posible que intente utilizar una API diferente; consulte la segunda parte de mi respuesta aquí: https://.com/a/14188280/1598485 OpenCV intenta usar la mejor API de forma predeterminada, pero tal vez en su caso alguna otra API funcionará mejor.