QT中VideoProbe的简介和实现
一、遇到问题
在Android机上使用QT进行图像处理程序设计的时候,遇到的一个比较明显的问题就是图片采集的问题----摄像头获得是实时的视频,如果我们想从中动态地截获图片,并且转换成Mat的格式,那么仅仅是静态的imagecapturee就无法完成,必须要依靠
VideoProbe机制。
二、基本情况
我们参考QT的相关文档:
QVideoProbe class允许你监控正在播放或者记录的视频
它的头文件
#
include
<QVideoProbe
>
qmake
: QT
+= multimedia
Inherits
: QObject
成员函数
Public Functions
QVideoProbe(QObject
*parent
= Q_NULLPTR)
~QVideoProbe()
bool isActive()
const
bool setSource(QMediaObject
*source)
bool setSource(QMediaRecorder
*mediaRecorder)
可以发出两个信号,其中比较重要的是后面一个videoFrameProbed
void flush()
void videoFrameProbed(
const QVideoFrame
&frame)
基本例子,比如打开视频:
QMediaPlayer
*player
=
new QMediaPlayer();
QVideoProbe
*probe
=
new QVideoProbe;
connect(probe, SIGNAL(videoFrameProbed(QVideoFrame)),
this, SLOT(processFrame(QVideoFrame)));
probe
-
>setSource(player);
// Returns true, hopefully.
player
-
>setVideoOutput(myVideoSurface);
player
-
>setMedia(QUrl
:
:fromLocalFile(
"observation.mp4"));
player
-
>play();
// Start receiving frames as they get presented to myVideoSurface
同样可以打开QCamera
三、编写代码
它的主要结构(流程)是这样的,我们创建QMl的代码:
在qml中生成camera和probe对象。这个probe对象是对原始QVideoProbe的重新封装,原始的QVideoProbe在
看的更清楚一些
在
probe对象中,首先通过调用摄像头,将videoframeprobed信号和processframe槽对应起来。这样一旦有视频probed则自动触发processframe。
注意在这行代码中
_camera
= qvariant_cast
<QCamera
*
>(_qmlCamera
-
>property(
"mediaObject"));
是c++调用qml对象的方法,是将qmlcamera强转为qcamera的一句
videoFrameProbed是自动触发的信号,其结果将被
processFrame截获并处理。信号和槽的方式是可以直接带变量传递的。
在process中,最主要的步骤就是QVideoFrame格式和Mat格式的转换。这个目前还没有非常好的方法,只能在NoHandle模式下进行灰度处理。但是对于图像处理来说已经能够解决一些问题。需要注意的是,最后采集的结果,通过
也就是
的模式将其直接推送到qml这里
四、小结
probe这种模式还是比较简单的,而且经过封装后能够很好地和OpenCV结合起来,用于图像采集处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!