我想从QMediaPlayer
获取每一帧,并将其转换为QImage
(或cv::Mat
)
所以我使用QVideoProbe
中的videoFrameProbed
信号:
connect(&video_probe_, &QVideoProbe::videoFrameProbed,
[this](const QVideoFrame& currentFrame){
//QImage img = ??
}
但是我没有找到任何从QVideoFrame
得到QImage
的方法!
如何将QVideoFrame
转换为QImage
?!
4条答案
按热度按时间tez616oj1#
您可以使用QImage的构造函数:
从
QVideoFrame
的pixelFormat
可以得到imageFormat
:5n0oy7gb2#
对于QCamera输出,这个方法并不总是有效的。特别是,当给定QVideoFrame::Format_Jpeg时,QVideoFrame::imageFormatFrom泛指elFormat()返回QImage::Format_Invalid,这是从我的QCamera输出的。但是这个方法是有效的:
kse8i1jr3#
Qt有一个私有函数
qt_imageFromVideoFrame
,用于将QVideoFrame
转换为QImage
。如果要使用它,您需要:1.将
QT += multimedia multimedia-private
添加到.pro
文件1.将
#include "private/qvideoframe_p.h"
添加到.cpp
文件1.然后您可以使用
qt_imageFromVideoFrame
搭配下列签章:(c)将图像转换为视频帧;
请注意标题中的警告:
该实现使用
QVideoFrame::map()
,并对位进行低级操作。转换器处理包括YUV在内的各种条件。qt_imageFromVideoFrame
可以在几乎所有的平台上运行,例如Windows、macOS、Linux和iOS。唯一一个运行不稳定的平台是Android。在那里,你需要使用OpenGL调用来提取视频帧。同样,在Android上,你需要在最后调用QImage:rgbSwapped()
,因为QImage将图像存储为ARGB,而OpenGL将图像检索为ABGR。我在GitHub上有一个完整的工作应用程序,其中包括上述函数的实现:
https://github.com/stephenquan/MyVideoFilterApp/blob/master/QVideoFrameToQImage.cpp
gpnt7bae4#
对于那些在Qt5.15.0中发现qt私有函数“qt_imageFromVideoFrame”已不存在的人,现在可以使用新实现的方法QImage QVideoFrame::image()。
我已经在Ubuntu上测试过了,效果很好。
对于Ubuntu 6.4版,请用途:
QImage img = frame.toImage();