如何在Qt中抓取视频帧?
How to grab video frames in Qt?
我是Qt的新手,我只知道基础知识:创建接口和连接槽。简而言之,我的知识一点也不深。
我需要打开一个视频文件并捕获它的所有帧以获得 R、G、B 通道,然后逐帧处理光流(这已经完成)以最终在window.
Qt可以获取视频帧吗?我研究了很多但没有找到任何结论。
您可以使用 QMediaPlayer 来实现这一点。
- 实例化QMediaPlayer。
- 子类 QAbstractVideoSurface。
- 通过
QMediaPlayer::setVideoOutput
将您的实现设置为媒体播放器的输出。
- 向媒体播放器提供所需的文件,如果视频加载成功,它最终将开始调用
QAbstractVideoSurface::present(const QVideoFrame & frame)
执行 QAbstractVideoSurface
。然后您可以从 QVideoFrame 访问频道和所有内容,并在小部件上绘制框架。
我不知道为什么我不能包含必要的 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();
它非常适合我的目的,所以我没有继续研究。
谢谢。
我是Qt的新手,我只知道基础知识:创建接口和连接槽。简而言之,我的知识一点也不深。
我需要打开一个视频文件并捕获它的所有帧以获得 R、G、B 通道,然后逐帧处理光流(这已经完成)以最终在window.
Qt可以获取视频帧吗?我研究了很多但没有找到任何结论。
您可以使用 QMediaPlayer 来实现这一点。
- 实例化QMediaPlayer。
- 子类 QAbstractVideoSurface。
- 通过
QMediaPlayer::setVideoOutput
将您的实现设置为媒体播放器的输出。 - 向媒体播放器提供所需的文件,如果视频加载成功,它最终将开始调用
QAbstractVideoSurface::present(const QVideoFrame & frame)
执行QAbstractVideoSurface
。然后您可以从 QVideoFrame 访问频道和所有内容,并在小部件上绘制框架。
我不知道为什么我不能包含必要的 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();
它非常适合我的目的,所以我没有继续研究。
谢谢。