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ę:
Każda pomoc na co mogę zrobić?
Jaką wartością jest "cameraIndex"? – karlphillip
cameraIndex to 0 – msmechanized
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