标题:Qt/C++音视频开发73-高效滤镜/文字水印/图形水印/图片水印/yolo运算后的结果显示到画面中
作者:liudianwu
日期:2024-05-10 10:04
内容:
## 一、前言
视频监控系统发展到今天,越来越智能,比如这些年流行的人脸识别、物体识别、烟感识别等,都是需要拿到图片数据去做运算处理,然后将结果显示到视频画面中,或者还有要求将结果保存到视频录像文件中,以便打开回放查看。显示到画面中一般有两种方式,一种是通过滤镜的方式直接写入到图片视频数据中,一种是直接用opengl绘制,如果是滤镜方式,则占用比较大的CPU,如果分辨率大占用更多,毕竟需要将完整的一帧视频数据全部更新,应用新的文字水印和图形水印。如果是opengl绘制,则基本上是gpu在做处理,和cpu这边没啥关系,但是也有缺点,就是如果想直接将这些图形数据保存到视频文件中,则只能通过MP4中的额外数据存储才行。
保存到视频文件中一般也有两种方式,一种是源头就是加好滤镜后的视频帧,这种无需做处理直接写入到文件即可。一种是通过extdata方式写入水印信息,这样就要求定义一种格式规范,解析那边按照这个规范解析MP4码流数据的时候,取出来,然后再绘制。总之无论何种方式都各有优缺点,个人建议如果通道少,或者硬件性能强劲,直接用滤镜的方式更可靠通用,毕竟视频帧数据就已经是带了各种水印的,用任何播放器都可以正常播放查看。
一路通道滤镜很简单,没啥问题,当通道多了的时候,你会发现可能出现崩溃的情况,这个问题找了很久的原因,后面发现原来是用openglwidget绘制那边和这边解析的视频帧数据公用的指针,而这边发生了变化,绘制那边正好绘制到一半,冲突导致,于是需要搞个队列,慢慢的释放,比如缓存10帧滤镜帧,到了10帧后再释放第一帧,保证绘制那边永远是正确的数据。加上这个机制后,当开启了16路1080P,每个通道50ms生成30个图形和文字水印帖进去的时候,这种巨大压力测试下,大概能稳定运行一天,依然还是有问题。绞尽脑汁找了很久,发现如果开启了getimage实时获取图像做运算,依然有冲突,因为getimage中用到了采集到的原始视频帧做转换,转换成qimage,而这个数据也是公用的内存,解码那边也在往里面写数据,也会遇到冲突的时候,于是加个锁,完美解决,7*24无间断运行,高压测试下,再无崩溃。打完收工,去楼下沙县小吃吃个大排饭,必须加两个蛋。
## 二、效果图
## 三、体验地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https ..