实时监控系统
项目描述
该项目是基于QT实现的实时监控系统,最多支持25路视频流实时监控,为保证识别流畅,同时利用显卡识别并计算物品,识别人物和物品等。封装自定义视频处理窗口,重写paintEvent事件重绘样式。利用ffmpeg实现视频解码、显示和处理的相关功能,并且实现计算线程,在独立线程中采用opencv处理图像数据,避免阻塞UI,根据yolo智能模型圈选并且识别物品种类等,包括黑名单报警。
个人职责:
实现以下功能:
a视频流的初始化和连接
1从视频流中读取编码数据包(AVPacket)
2将数据包解码为原始视频帧(AVFrame)
3检测视频分辨率变化并适配
4将原始YUV格式视频帧转换为RGB格式
5将RGB图像数据转换为QImage并发送给UI进行显示
●实现计算线程逻辑
ⅰ发送处理开始信号(sendProess(false))
ⅱ将输入图像转换为Format_RGB888格式
ⅲ将QImage转换为OpenCV的Mat格式
ⅳ使用YOLOv8进行目标检测
ⅴ在图像上标注检测到的对象类别
ⅵ将处理后的Mat转换回QImage
ⅶ发送处理后的图像(sendImage)
ⅷ发送处理完成信号(sendProess(true))
项目构成
项目由两部分组成
1 GUI
2 FFMPEG核心解码和计算流程
源码剖析
主函数
去查找XCoreWidget.ui中文件
综上所述,FFMPegWidget就是用来做显示的,底层通过thread从视频流中解码并且投递给m_QXProcessObject对象计算,
QXProcessObject对象计算后,投递给FFMPegWidget显示图像。
相关问题
1 如何实现视频流抽取?
我们通过FFMpeg从视频流中抽取原始的YUV格式的帧,放到数组中,再通过FFMPEG提供的转换函数,将YUV格式转换为RGB32彩色带透明度的图片缓存,进一步调用QImage构造函数构造图像。最后将图像传输到UI线程显示。
2 你在做这个项目遇到什么问题?
抽取视频流时,解析的格式不对,最开始是YUV格式,直接用YUV格式生成图片,发现无法显示,后来查阅资料,将YUV转为RGB32才生效。
3 计算线程的效率跟不上抽取线程怎么办?
计算逻辑线程处理的速率跟不上抽取视频流的线程,导致计算逻辑线程的线程队列太大,所以,采用反向通知的方式,动态控制计算线程的队列大小,当队列大小超过阈值时,发送信号通知抽取线程放弃一部分视频帧。
4 采用何种方式封装线程?
继承于QThread, 一种移动到Thread中,信号连接采用默认方式,跨线程就是队列了。
若有收获,就点个赞吧