2017-04-06 124 views
0

我用QMediaPlayer获得了一个视频输入,然后我想逐帧读取帧并用其他视觉算法处理所有帧。但我不知道如何从视频逐帧获取帧并访问帧的每个像素...在OpenCV库中,我可以很轻松地使用cv :: VideoCapture解决这个问题, CV ::垫。如何从Qt框架中的视频逐帧获取帧?

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. 

如果有人已经处理了这种问题,请帮助我。

非常感谢。

+0

使用OpenCV没有问题,如果它适合你当然:) –

回答

2

您可以编写自己的QAbstractVideoSurface实现并覆盖其方法来逐帧处理视频。 然后您将不得不通过setVideoOutput设置QMediaPlayer的视频输出。

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

1

建议:你可以使用OpenCV。这将使播放视频更容易,并且无需QImage-> Mat转换即可处理视频。

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

+1

With ['QVideoFrame :: bits()'](https://doc.qt.io/qt-5/qvideoframe.html#bits )你没有得到'QImage',而是原始数据,所以可以将OpenCV代码插入重写的'QAbstractVideoSurface :: present'方法并避免'QTimer'。 –