2012-04-24 263 views
2

我試圖通過OpenCV庫的方法來處理視頻,並用imshow方法顯示這些幀,這裏沒有問題。如何通過Qt gui應用程序顯示視頻的幀?

但是當涉及到與Qt-gui應用程序實時顯示它們時,我無法管理。

該程序從openfile對話框中獲取視頻的路徑,並開始在while循環中抓取視頻的幀並處理它們。在處理步驟之後,當我嘗試在QLabel上顯示這些處理後的幀時,gui-app的QLabel不會顯示任何內容(沿着視頻的長度),而只顯示視頻末尾的最後一幀,沒有其他內容。我試圖刷新/更新每一幀的標籤,但沒有奏效。

我想要做點什麼嗎?或者有沒有更方便的方法呢?

我的代碼的必要部分如下。提前致謝。

bool stop=false; 
cv::VideoCapture capture("a.avi"); 
cv::Mat cur_frame; 

while (!stop) {  
      //...    
      capture.read(cur_frame);     
      //process steps..    
      QImage img= QImage((const unsigned char*)(cur_frame.data), 
           cur_frame.cols,cur_frame.rows, 
           QImage::Format_RGB888); 
      ui->label->setPixmap(QPixmap::fromImage(img)); 
      // resize the label to fit the image 
      ui->label->resize(ui->label->pixmap()->size()); 
      //... 
      cv::waitkey(50); 
      } 

回答

1

Qt只能在控件返回到事件循環時更新UI。您可以嘗試在循環中調用qApp->processEvents(),但這可能不是最佳方法。

+1

感謝阿諾德,它的工作,至少現在它對我有用。除此之外,做這項工作的最佳方法是什麼?是否使用Qlabel來顯示幀是一種可用且適合的方式來處理這項工作?(我不這麼認爲,我使用Qlabel是因爲我不知道QT那麼好) – Horizon1710 2012-04-24 23:57:26

+1

不幸的是,我沒有一個好的方法來解決您的問題去做吧。我沒有做過像Qt一樣的實時視頻要求。 – 2012-04-25 00:20:13

+1

儘管這是一個老問題,但我只想指出這個答案(http://stackoverflow.com/a/2671834/1990758)可能有所幫助。 – Energy 2016-03-02 08:07:42

相關問題