2015-06-12 70 views
6

我是Qt新手,我只知道基礎知識:創建接口和連接插槽。簡而言之,我的知識根本不深。如何抓住Qt中的視頻幀?

我需要打開一個視頻文件並捕獲所有幀,以獲得R,G,B通道,並且稍後將處理光流(這已經完成)幀到幀,以最終在窗口中表示它。

是否有可能獲得與Qt視頻幀?我研究了很多,但沒有發現任何結論。

+0

您是否檢查過文檔? http://doc.qt.io/qt-5/videooverview.html –

+0

This [link](http://stackoverflow.com/questions/38468644/getting-video-frame-in-provided-time-qt/38484477 #38484477)可能會幫助您從視頻文件中捕獲幀。 – Jeet

回答

1

我不知道爲什麼我不能包括必要的Qt頭處理幀(他們似乎總是有未解決的依賴性,有些根本不存在),所以我轉過身來,OpenCV的3.0就是這麼做的:

cv::VideoCapture cap(videoFileName); 

if(!cap.isOpened()) // check if we succeeded 
    return; 

while (cap.isOpened()) 
{ 
    cv::Mat frame; 
    cap >> frame; 
    cv::flip(frame, frame, -1); 
    cv::flip(frame, frame, 1); 

    // get RGB channels 
    w = frame.cols; 
    h = frame.rows; 
    int size   = w * h * sizeof(unsigned char); 
    unsigned char * r = (unsigned char*) malloc(size); 
    unsigned char * g = (unsigned char*) malloc(size); 
    unsigned char * b = (unsigned char*) malloc(size); 

    for(int y = 0; y < h;y++) 
    { 
     for(int x = 0; x < w; x++) 
     { 
      // get pixel 
      cv::Vec3b color = frame.at<cv::Vec3b>(cv::Point(x,y)); 
      r[y * w + x] = color[2]; 
      g[y * w + x] = color[1]; 
      b[y * w + x] = color[0]; 
     } 
    } 
} 

cap.release(); 

它爲我的目的完美工作,所以我沒有繼續研究。

無論如何。

6

您可以使用QMediaPlayer來實現此目的。

  1. 實例化QMediaPlayer
  2. 子類QAbstractVideoSurface
  3. 通過QMediaPlayer::setVideoOutput將您的實現設置爲媒體播放器的輸出。
  4. 向媒體播放器提供所需的文件,最終如果視頻已成功加載,它將開始在您的QAbstractVideoSurface的實現中調用QAbstractVideoSurface::present(const QVideoFrame & frame)。然後,您可以訪問QVideoFrame的頻道和所有內容,並在小部件上繪製框架。
+0

我無法在任何地方找到QMediaPlayer。我已經通過qt-unified-mac-x64-2.0.1-online.dmg安裝了Qt,但我沒有移動包 – Leo

+0

@Leo它不應該在移動包中,只需添加'#include <如http://doc.qt.io/qt-5/qmediaplayer.html中所述,QMediaPlayer>將'QT + = multimedia'加入您的'.pro'文件。我也不熟悉osx版本,但2.0.1看起來很奇怪 - 哪個版本是qt? –