【问题标题】:How do I get frames one by one from the video in Qt framework?如何从 Qt 框架中的视频中一一获取帧?
【发布时间】:2017-04-06 09:03:33
【问题描述】:

我通过 QMediaPlayer 获得了视频输入,然后我想逐帧读取并使用其他视觉算法处理所有帧。但我不知道如何从视频中一帧一帧地获取帧的每个像素...

在 OpenCV 库中,我可以使用 cv::VideoCapture 和 cv::Mat 轻松解决该问题。

cv::VideoCapture capture(filename);
cv::Mat img;

capture >> img; // 'img' contains the first frame of the video.
capture >> img; // 'img' contains the second frame of the video.

如果有人已经处理过此类问题,请帮助我。

非常感谢。

【问题讨论】:

  • 如果它对你有用,使用 OpenCV 没有任何问题:)

标签: c++ qt opencv


【解决方案1】:

您可以编写自己的 QAbstractVideoSurface 实现并覆盖它 present 逐帧处理视频的方法。 然后您必须通过setVideoOutput 设置QMediaPlayer 的视频输出。

有关如何访问帧数据的详细信息,请参阅QVideoFrame 文档。

【讨论】:

    【解决方案2】:

    一个建议:你可以使用 OpenCV。这将使播放视频和处理视频变得更容易,而无需 QImage->Mat 转换。

    为了使用 OpenCV + Qt 处理视频,您必须创建一个连接到 QTimer 信号的 QThread。 QTimer 信号每隔几毫秒向工作线程中的插槽发出信号,以从 VideoCapture 获取下一个视频帧并处理数据。

    【讨论】:

    • 使用QVideoFrame::bits(),您不会得到QImage,而是原始数据,因此可以将OpenCV 代码插入覆盖的QAbstractVideoSurface::present 方法并避免QTimer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2022-06-21
    • 2013-07-20
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多