2012-04-26 16 views
8

Estoy usando opencv y Qt para crear una aplicación. Dentro de la aplicación, estoy creando una pequeña herramienta para grabar video. Por esta razón, y para no bloquear el hilo del evento principal, creé un diálogo separado que contiene un hilo de grabación. En este hilo, para empezar, quería ver la salida de la cámara (todavía no he introducido el código de grabación). Así que una subclase QThread y la función run() es la siguiente:OpenCV y Qt VideoCapture no abre la cámara correcta en Windows

void VideoRecordThread::run(){ 
    cv::VideoCapture capture; 
    cv::Mat frame; 
    QImage img; 

    qDebug() << "Opening camera" << cameraIndex ; 
    capture.open(cameraIndex); 

    if(!capture.isOpened()){ 
     qDebug() << "Could not open camera" << cameraIndex; 
     emit threadReturned(); 
     return; 
    } 

    while(!stopFlag){ 
     capture >> frame; 
     qDebug() << "Frame Width = " << frame.cols << "Frame Height = " << frame.rows; 
     if(frame.cols ==0 || frame.rows==0){ 
      qDebug() << "Invalid frame skipping"; 
      continue; 
     } 
     img = cvMatToQImage(frame); //Custom function 
     emit imageCaptured(img); 
    } 
    capture.release(); 
    emit threadReturned(); //Custom signal 
    qDebug() << "Thread returning"; 
} 

esto se supone que funciona, pero el problema es que cuando el hilo se inicia, aparece un nuevo cuadro de diálogo "de la nada", me pide que seleccione la cámara cuando selecciono una de las cámaras conectadas, a veces funciona y otras no. Aquí está el diálogo que me sale:

enter image description here

Cualquier ayuda en lo que puedo hacer?

+0

¿Qué valor es 'cameraIndex'? – karlphillip

+0

la cámaraIndex es 0 – msmechanized

+0

Si solo hay una cámara o no importa qué cámara se use -1 puede pasar. En Windows, el índice 0 abre ese diálogo para que el usuario seleccione la fuente de video. – karlphillip

Respuesta

4

Me di cuenta de que OpenCV tiene problemas cuando algunas funciones no se ejecutan desde el hilo principal.

Mueva la inicialización del procedimiento de captura al hilo principal de su aplicación y deje el resto en el hilo secundario. La parte de inicialización parece ser:

cv::VideoCapture capture; 

qDebug() << "Opening camera" << cameraIndex ; 
capture.open(cameraIndex); 

if(!capture.isOpened()) 
{ 
    qDebug() << "Could not open camera" << cameraIndex; 
    emit threadReturned(); 
    return; 
} 
+0

Sí, pero el problema es que tengo una ventana principal -> recodingdialog -> hilo de grabación de video. ¿Cómo puedo mover VideoCapture desde el subproceso 2 niveles hasta la ventana principal? – msmechanized

+0

Simplemente pase el objeto 'cv :: VideoCapture' entre clases. Puede poner el constructor de las clases si lo desea, así que cuando se inicializa una nueva clase ya tiene acceso a la interfaz de captura, o agrega un nuevo método para establecer esta variable en estas clases una vez que se inicializó correctamente en el hilo principal . O bien, como última opción (fea), declare 'cv :: VideoCapture capture' como una variable global, supongo que para fines de prueba sería más rápido implementarla y probarla. – karlphillip

Cuestiones relacionadas