如何在Qt中抓取视频帧?

Leo*_*has 8 c++ image qt4 video-processing opticalflow

我是Qt的新手,我只知道基础知识:创建接口和连接插槽.简而言之,我的知识根本不是深刻的.

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

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

Rud*_*lis 7

您可以使用QMediaPlayer来实现此目的.

  1. 实例化QMediaPlayer.
  2. QAbstractVideoSurface进行子类化.
  3. 将您的实现设置为媒体播放器的输出QMediaPlayer::setVideoOutput.
  4. 向媒体播放器提供所需的文件,最终它将开始调用QAbstractVideoSurface::present(const QVideoFrame & frame)您的实现,QAbstractVideoSurface如果视频已成功加载.然后,您可以从QVideoFrame访问频道和所有内容,并在小部件上绘制帧.


Leo*_*has 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();
Run Code Online (Sandbox Code Playgroud)

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

不管怎么说,还是要谢谢你。