C++ 如何在Qt中抓取视频帧?

C++ 如何在Qt中抓取视频帧?,c++,image,qt4,video-processing,opticalflow,C++,Image,Qt4,Video Processing,Opticalflow,我是Qt新手,我只知道基本知识:创建接口和连接插槽。简单地说,我的知识一点也不深 我需要打开一个视频文件并捕获它的所有帧,以获得R、G、B通道,然后处理光流(这已经完成)逐帧,最终在窗口上表示它 是否可以使用Qt获取视频帧?我做了很多研究,但没有发现任何结论。你可以用它来实现这一点 实例化 子类 通过QMediaPlayer::setVideoOutput将实现设置为媒体播放器的输出 向媒体播放器提供所需的文件,如果视频加载成功,它最终将开始调用QAbstractVideoSurface::pr

我是Qt新手,我只知道基本知识:创建接口和连接插槽。简单地说,我的知识一点也不深

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

是否可以使用Qt获取视频帧?我做了很多研究,但没有发现任何结论。

你可以用它来实现这一点

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

  • 我不知道为什么我不能包含处理帧所需的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();
    
    cv::VideoCapture(videoFileName);
    if(!cap.isopend())//检查我们是否成功
    返回;
    while(cap.isOpened())
    {
    cv::垫架;
    cap>>框架;
    cv::翻转(帧,帧,-1);
    cv::翻转(帧,帧,1);
    //获取RGB通道
    w=frame.cols;
    h=帧行数;
    int size=w*h*sizeof(无符号字符);
    无符号字符*r=(无符号字符*)malloc(大小);
    无符号字符*g=(无符号字符*)malloc(大小);
    无符号字符*b=(无符号字符*)malloc(大小);
    对于(int y=0;y
    它对我来说非常有效,所以我没有继续研究


    无论如何,谢谢。

    您检查过文档了吗?这可能会帮助您从视频文件中捕获帧。我在任何地方都找不到QMediaPlayer。我已经通过Qt-unified-mac-x64-2.0.1-online.dmg安装了Qt,但我没有移动性package@Leo它不应该在移动包中,只需将添加
    #包括
    添加到您的源代码中,并将
    QT+=multimedia
    添加到您的
    .pro
    文件中,如中所述。另外,我不熟悉osx版本,但2.0.1似乎很奇怪-它是哪个qt版本?