2017-04-06 554 views
0

我用QMediaPlayer獲得了一個視頻輸入,然後我想逐幀讀取幀並用其他視覺算法處理所有幀。但我不知道如何從視頻逐幀獲取幀並訪問幀的每個像素...在OpenCV庫中,我可以很輕鬆地使用cv :: VideoCapture解決這個問題, CV ::墊。如何從Qt框架中的視頻逐幀獲取幀?

cv::VideoCapture capture(filename); 
cv::Mat img; 

capture >> img; // 'img' contains the first frame of the video. 
capture >> img; // 'img' contains the second frame of the video. 

如果有人已經處理了這種問題,請幫助我。

非常感謝。

+0

使用OpenCV沒有問題,如果它適合你當然:) –

回答

2

您可以編寫自己的QAbstractVideoSurface實現並覆蓋其方法來逐幀處理視頻。 然後您將不得不通過setVideoOutput設置QMediaPlayer的視頻輸出。

有關如何訪問幀數據的詳細信息,請參閱QVideoFrame文檔。

1

建議:你可以使用OpenCV。這將使播放視頻更容易,並且無需QImage-> Mat轉換即可處理視頻。

爲了使用OpenCV + Qt處理視頻,您必須創建一個連接到QTimer信號的QThread。 QTimer信號將每毫秒的信號發出到工作線程中的一個插槽,以便從VideoCapture獲取下一個視頻幀並處理數據。

+1

With ['QVideoFrame :: bits()'](https://doc.qt.io/qt-5/qvideoframe.html#bits )你沒有得到'QImage',而是原始數據,所以可以將OpenCV代碼插入重寫的'QAbstractVideoSurface :: present'方法並避免'QTimer'。 –