我是Qt新手,我只知道基礎知識:創建接口和連接插槽。簡而言之,我的知識根本不深。如何抓住Qt中的視頻幀?
我需要打開一個視頻文件並捕獲所有幀,以獲得R,G,B通道,並且稍後將處理光流(這已經完成)幀到幀,以最終在窗口中表示它。
是否有可能獲得與Qt視頻幀?我研究了很多,但沒有發現任何結論。
我是Qt新手,我只知道基礎知識:創建接口和連接插槽。簡而言之,我的知識根本不深。如何抓住Qt中的視頻幀?
我需要打開一個視頻文件並捕獲所有幀,以獲得R,G,B通道,並且稍後將處理光流(這已經完成)幀到幀,以最終在窗口中表示它。
是否有可能獲得與Qt視頻幀?我研究了很多,但沒有發現任何結論。
我不知道爲什麼我不能包括必要的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();
它爲我的目的完美工作,所以我沒有繼續研究。
無論如何。
您可以使用QMediaPlayer來實現此目的。
QMediaPlayer::setVideoOutput
將您的實現設置爲媒體播放器的輸出。QAbstractVideoSurface
的實現中調用QAbstractVideoSurface::present(const QVideoFrame & frame)
。然後,您可以訪問QVideoFrame的頻道和所有內容,並在小部件上繪製框架。我無法在任何地方找到QMediaPlayer。我已經通過qt-unified-mac-x64-2.0.1-online.dmg安裝了Qt,但我沒有移動包 – Leo
@Leo它不應該在移動包中,只需添加'#include <如http://doc.qt.io/qt-5/qmediaplayer.html中所述,QMediaPlayer>將'QT + = multimedia'加入您的'.pro'文件。我也不熟悉osx版本,但2.0.1看起來很奇怪 - 哪個版本是qt? –
您是否檢查過文檔? http://doc.qt.io/qt-5/videooverview.html –
This [link](http://stackoverflow.com/questions/38468644/getting-video-frame-in-provided-time-qt/38484477 #38484477)可能會幫助您從視頻文件中捕獲幀。 – Jeet