如何在Qt中抓取视频帧?

How to grab video frames in Qt?

我是Qt的新手,我只知道基础知识:创建接口和连接槽。简而言之,我的知识一点也不深。

我需要打开一个视频文件并捕获它的所有帧以获得 R、G、B 通道,然后逐帧处理光流(这已经完成)以最终在window.

Qt可以获取视频帧吗?我研究了很多但没有找到任何结论。

您可以使用 QMediaPlayer 来实现这一点。

  1. 实例化QMediaPlayer
  2. 子类 QAbstractVideoSurface
  3. 通过 QMediaPlayer::setVideoOutput 将您的实现设置为媒体播放器的输出。
  4. 向媒体播放器提供所需的文件,如果视频加载成功,它最终将开始调用 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();

它非常适合我的目的,所以我没有继续研究。

谢谢。