2012-04-26 25 views
8

Używam opencv i Qt do tworzenia aplikacji. Wewnątrz aplikacji tworzę małe narzędzie do nagrywania wideo. Z tego powodu i aby nie blokować głównego wątku zdarzenia, utworzyłem osobne okno dialogowe zawierające nagrany wątek. W tym wątku na początek chciałem tylko zobaczyć wyjście kamery (jeszcze nie wprowadziłem kodu nagrywania). Więc podklasy QThread i funkcja run() jest następujący:OpenCV i Qt VideoCapture nie otwiera prawidłowej kamery w 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"; 
} 

to ma działać, ale problemem jest to, że kiedy zaczyna się gwint, mam nowe okno „znikąd” pyta mnie, aby wybrać kamera, gdy wybiorę jedną z podłączonych kamer, czasami działa, a czasami nie. Oto dialogowe, które pojawia się:

enter image description here

Każda pomoc na co mogę zrobić?

+0

Jaką wartością jest "cameraIndex"? – karlphillip

+0

cameraIndex to 0 – msmechanized

+0

Jeśli jest tylko jedna kamera lub nie ma znaczenia, która kamera jest używana -1 może zostać przekazana. W systemie Windows indeks 0 otwiera to okno dialogowe, w którym użytkownik wybiera źródło wideo. – karlphillip

Odpowiedz

4

Zauważyłem, że OpenCV ma problemy, gdy niektóre funkcje nie są wykonywane z głównego wątku.

Przenieś inicjalizację procedury przechwytywania do głównego wątku aplikacji i pozostaw resztę wątku dodatkowego. Częścią inicjalizacji wydaje się być:

cv::VideoCapture capture; 

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

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

Tak, ale problem polega na tym, że mam mainwindow -> recodingdialog -> wątek nagrania wideo. Jak mogę przenieść VideoCapture z poziomu 2 wątku do głównego okna? – msmechanized

+0

Po prostu przepuść obiekt 'cv :: VideoCapture' na różnych klasach. Możesz wstawić konstruktor klas, jeśli chcesz, więc kiedy nowa klasa jest zainicjowana, ma już dostęp do interfejsu przechwytywania lub dodaj nową metodę ustawienia tej zmiennej w tych klasach po jej pomyślnym zainicjowaniu w głównym wątku . Lub, jako ostatnia (brzydka) opcja, zadeklaruj "cv :: VideoCapture capture" jako zmienną globalną - Myślę, że w celach testowych byłoby szybsze wdrożenie i testowanie. – karlphillip

Powiązane problemy