我在使用opencv播放Qt中的視頻。我有6個平鋪視圖相機,我正在播放視頻。問題是如果其中一個視頻沒有播放完成,那麼GUI會凍結並退出。我得到的錯誤是你必須重新實現QApplication :: notify()並捕獲那裏的異常。這個怎麼做? 我正在使用的代碼如下。視頻不連續播放
在某處的函數
void MainWindow::ActivateWindow()
{
//Some part of code to set Index for stacked widget
if(stackWidget->currentIndex()==9)
{
const int imagePeriod == 1000/25;
imageTimer->setInterval(imagePeriod);
connect(imageTimer,SIGNAL(timeout()),this,SLOT(demoSlot());
imageTimer->start();
}
}
在時隙demoSlot
void MainWindow::demoSlot()
{
captureCamera1 cvCaptureFromFile("/root/mp.mp4");
captureCamera2 cvCaptureFromFile("/root/mp.mp4");
captureCamera3 cvCaptureFromFile("/root/mp.mp4");
while(imageTimer->isActive())
{
frameCamera1 = cvQueryFrame(captureCamera1);
frameCamera2 = cvQueryFrame(captureCamera2);
frameCamera3 = cvQueryFrame(captureCamera2);
sourceImageCam1 = frameCamera1;
sourceImageCam2 = frameCamera2;
sourceImageCam3 = frameCamera3;
cv::resize(sourceImageCam1,sourceImageCam1,cv::size(400,100),0,0);
cv::resize(sourceImageCam1,sourceImageCam1,cv::size(400,100),0,0);
cv::resize(sourceImageCam1,sourceImageCam1,cv::size(400,100),0,0);
cv::cvtColor(sourceImageCam1,sourceImageCam2,CV_BGR2RGB);
cv::cvtColor(sourceImageCam2,sourceImageCam2,CV_BGR2RGB);
cv::cvtColor(sourceImageCam2,sourceImageCam2,CV_BGR2RGB);
QImage tempImage1 = QImage((const unsigned char* sourceImageCam1.data,sourceImageCam1.cols,sourceImageCam2.rows,QImage::Format_RG888);
QImage tempImage2 = QImage((const unsigned char* sourceImageCam2.data,sourceImageCam2.cols,sourceImageCam2.rows,QImage::Format_RG888);
QImage tempImage3 = QImage((const unsigned char* sourceImageCam3.data,sourceImageCam3.cols,sourceImageCam3.rows,QImage::Format_RG888);
labelCameraCapture1->setPixmap(QPixmap::fromImage(tempImage1)); //label to display video
labelCameraCapture2->setPixmap(QPixmap::fromImage(tempImage2));
labelCameraCapture3->setPixmap(QPixmap::fromImage(tempImage3));
lblCameraCapture1->resize(lblCameraCapture1->Pixmap->size());
lblCameraCapture1->resize(lblCameraCapture1->Pixmap->size());
lblCameraCapture1->resize(lblCameraCapture1->Pixmap->size());
cvWaitkey(20);
qApp->processEvents();
}
if(imageTimer->isActive())
{
imageTimer->stop();
}
else
{
imageTimer->start();
}
}
在頭文件
cvCapture *captureCamera1;
cvCapture *captureCamera1;
cvCapture *captureCamera1;
IplImage frameCamera1;
IplImage frameCamera2;
IplImage frameCamera3;
cv::Mat sourceImageCam1;
cv::Mat sourceImageCam2;
cv::Mat sourceImageCam3;
這個插槽'MainWindow :: demoSlot()'在這麼多層次上是完全錯誤的! WTF#1'cvWaitkey(20);',WTF#2'while while(imageTimer-> isActive())',WTF#3 if(imageTimer-> isActive())... stop()... start )' –
簡單地說,我甚至沒有在這個插槽中看到任何有用的代碼。它只是阻止主線程。我懷疑你可以垃圾除''代碼播放視頻'(假設你隱藏代碼在這個地方),這將工作。 –
顯然我沒寫完整個代碼。我只是寫了部分,因爲我認爲這個問題可能會出現。其餘的代碼只是我們將捕捉設置爲幀並調整大小和設置圖像的部分。由於while循環,主線程是否被阻塞?但是如果我刪除while循環,則視頻無法播放。它需要一些條件來播放視頻。我是否必須將整個視頻放在QThread中並根據需要啓動和停止它,還是有其他解決方案? – Sid411