2013-08-21 193 views
0

我在使用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; 
+0

這個插槽'MainWindow :: demoSlot()'在這麼多層次上是完全錯誤的! WTF#1'cvWaitkey(20);',WTF#2'while while(imageTimer-> isActive())',W​​TF#3 if(imageTimer-> isActive())... stop()... start )' –

+0

簡單地說,我甚至沒有在這個插槽中看到任何有用的代碼。它只是阻止主線程。我懷疑你可以垃圾除''代碼播放視頻'(假設你隱藏代碼在這個地方),這將工作。 –

+0

顯然我沒寫完整個代碼。我只是寫了部分,因爲我認爲這個問題可能會出現。其餘的代碼只是我們將捕捉設置爲幀並調整大小和設置圖像的部分。由於while循環,主線程是否被阻塞?但是如果我刪除while循環,則視頻無法播放。它需要一些條件來播放視頻。我是否必須將整個視頻放在QThread中並根據需要啓動和停止它,還是有其他解決方案? – Sid411

回答

1

這將改變這種情況,以3電影很簡單。

class MainWindow : public QMainWindow { 
Q_OBJECT 

    explicit QMainWindow(QWidget *parent) .... 
    // prepare timer and so on 

public slots: 
    void startVideo() { 
     vid1.close(); 
     vid1.open("/root/mp.mp4"); 
     imageTimer->start(); 
    } 

    void demoSlot() { 
     cv::Mat frame; 
     vid1 >> frame; 
     cv::cvtColor(frame,frame,CV_BGR2RGB); 
     QImage img((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888); 
     label1->setPixmap(QPixmap::fromImage(img)); 
    } 

private: 
    ... 
    QTimer *imageTimer; 
    cv::VideoCapture vid1; 
}; 
+0

何時應該調用startVideo()插槽? – Sid411

+0

讓我猜:每當你想開始播放視頻 –

+0

感謝您的幫助到目前爲止。我試過這種方式。在我設置索引的地方,我調用了startvideo,然後是通常的demoSlot。該程序意外完成,另一個問題是它沒有像vid1.close那樣的東西。但是有vid1.open。 – Sid411

0

檢查是否從照相機捕獲的幀是NULL。然後簡單地跳過這臺相機的處理步驟。

而不是混合C++和C接口(我的意思是cv :: Mat和IplImage)會更好。