C++基于opencv的视频质量检测--画面冻结检测
文章目录
- 0.引言
- 1. 原始代码分析
- 2. 优化方案
- 3. 优化后的代码
- 4. 代码详细解读
0.引言
视频质量画面冻结检测已在C++基于opencv4的视频质量检测中有所介绍,本文将详细介绍其优化版本。
1. 原始代码分析
图像抖动检测的原始代码:
bool ScreenFreezeDetection(const cv::Mat& srcImg) {if (srcImg.empty()) {return true; // 直接返回true表示检测故障}cv::Mat backgroundA, backgroundB;// 1. 获取云台运动前的背景Astatic int frameCount = 0;if (frameCount < NUM_FRAMES) {if (frameCount == 0) {backgroundA = cv::Mat::zeros(srcImg.size(), srcImg.type());}cv::accumulate(srcImg, backgroundA);++frameCount;if (frameCount == NUM_FRAMES) {backgroundA /= NUM_FRAMES;}return false;}// 2. 发送云台运动指令,改变场景// 3. 获取云台运动后的背景Bif (frameCount < 2 * NUM_FRAMES) {int currentFrameIndex = frameCount - NUM_FRAMES;if (currentFrameIndex == 0) {backgroundB = cv::Mat::zeros(srcImg.size(), srcImg.type());}cv::accumulate(srcImg, backgroundB);++frameCount;if (frameCount == 2 * NUM_FRAMES) {backgroundB /= NUM_FRAMES;}return false;}// 4. 计算背景A和背景B的颜色直方图cv::Mat histA, histB;int histSize = 256;float range[] = {0, 256};const float* histRange = {range};cv::calcHist(&backgroundA, 1, 0, cv::Mat(), histA, 1, &histSize, &histRange, true, false);cv::calcHist(&backgroundB, 1, 0, cv::Mat(), histB, 1, &histSize, &histRange, true, false);// 5. 计算直方图的相似度(使用相关性比较方法)double histSimilarity = cv::compareHist(histA, histB, cv::HISTCMP_CORREL);// 6. 判断相似度是否小于阈值,如果小于则认为画面冻结if (histSimilarity > HIST_SIM_THRESHOLD) {return true;} else {return false;}
}
存在的问题:
-
依赖外部设备运动:该算法需要通过控制云台运动来改变摄像机的视角,以获取不同的背景。这在实际应用中可能不方便,增加了系统的复杂性和成本。
-
复杂的背景处理:使用了帧累积和直方图比较的方法,计算量较大,效率较低。
-
静态场景误判:对于本身就没有明显变化的静态场景,可能误判为画面冻结。
2. 优化方案
-
取消对云台运动的依赖:改为直接比较连续帧之间的相似度,避免对外部设备的依赖。
-
使用结构相似度(SSIM):SSIM是一种衡量两幅图像相似度的指标,考虑了亮度、对比度和结构信息,比简单的直方图比较更准确。
-
引入冻结帧计数:只有当连续多帧都满足冻结条件时,才认为画面冻结,减少了误报率。
-
简化代码结构:移除了累积帧和直方图计算的复杂操作。
3. 优化后的代码
#include <opencv2/opencv.hpp>
#include <opencv2/quality.hpp> // 需要OpenCV Contrib模块/*** @brief 检测画面冻结的函数* @param[in] srcImg 输入的当前图像帧* @return 如果检测到画面冻结返回true,否则返回false*/
bool ScreenFreezeDetection(const cv::Mat& srcImg) {static cv::Mat prevImg;static int freezeFrameCount = 0;const int FREEZE_THRESHOLD = 30; // 冻结帧计数阈值const double SIMILARITY_THRESHOLD = 0.99; // 相似度阈值if (srcImg.empty()) {return true; // 输入图像为空,认为画面冻结}if (prevImg.empty()) {prevImg = srcImg.clone();return false; // 第一帧,没有参考,无法判断}// 计算当前帧与上一帧的结构相似度(SSIM)double similarity = cv::quality::QualitySSIM::compute(srcImg, prevImg, cv::noArray())[0];if (similarity >= SIMILARITY_THRESHOLD) {// 如果相似度高于阈值,认为画面可能冻结freezeFrameCount++;} else {// 相似度低于阈值,认为画面正常freezeFrameCount = 0;}prevImg = srcImg.clone();// 如果连续的冻结帧数量超过阈值,认为画面冻结if (freezeFrameCount >= FREEZE_THRESHOLD) {return true;} else {return false;}
}
4. 代码详细解读

流程说明:
-
开始:函数
ScreenFreezeDetection开始执行。 -
检查输入图像是否为空:如果为空,返回
true,认为画面冻结。 -
检查
prevImg是否为空:如果是第一帧,初始化prevImg,返回false。 -
计算SSIM相似度:使用当前帧和
prevImg计算SSIM相似度。 -
判断相似度是否超过阈值:如果相似度高,认为画面可能冻结,冻结帧计数器加1;否则,重置计数器。
-
更新
prevImg:将当前帧保存为prevImg,供下一次计算使用。 -
检查冻结帧计数器是否超过阈值:如果超过,返回
true,认为画面冻结;否则,返回false。
代码说明:
-
使用静态变量保存上一帧图像和冻结帧计数器:
prevImg保存上一帧,freezeFrameCount统计连续冻结帧的数量。 -
计算SSIM相似度:使用
cv::quality::QualitySSIM::compute函数计算当前帧与上一帧的SSIM相似度。 -
判断画面是否冻结:如果相似度超过阈值
SIMILARITY_THRESHOLD,则增加冻结帧计数;否则,重置计数。 -
返回检测结果:当冻结帧计数超过阈值
FREEZE_THRESHOLD,认为画面冻结。
相关文章:
C++基于opencv的视频质量检测--画面冻结检测
文章目录 0.引言1. 原始代码分析2. 优化方案3. 优化后的代码4. 代码详细解读 0.引言 视频质量画面冻结检测已在C基于opencv4的视频质量检测中有所介绍,本文将详细介绍其优化版本。 1. 原始代码分析 图像抖动检测的原始代码: bool ScreenFreezeDetect…...
Day22 opencv图像预处理
图像预处理 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,常见的操作包括图像空间转换、图像大小调…...
QT中的定时器与计时器
目录 QTimer QTimer 的替代方案 API QElapsedTimer API 笔者写Qt的时候经常遇到需要定时完成任务的情况。举个例子:我写串口通信程序的时候需要定时向下位机发送数据。或者是定时任务周期性出发(更新时间等) 在Qt中,有两个非…...
国内AI大模型学习平台
据不完全统计,目前,国内有几大AI大模型学习平台可供选择: 1.昇思大模型平台:这是一个集算法选型、创意分享、模型实验和大模型在线体验于一体的AI学习与实践社区。 2.魔搭社区:提供AI模型、数据集和应用的开发与探索平…...
曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%
本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》,杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行:科技驱动共享出行未来 曹操…...
深入理解数据库的三范式
数据库设计中的范式(Normal Form)是用于规范数据存储结构、消除冗余以及保证数据一致性的重要原则。范式的概念有多种层次,常用的前三种称为第一范式(1NF)、第二范式(2NF)和第三范式(…...
P11233 [CSP-S 2024] 染色
P11233 [CSP-S 2024] 染色 难度:提高/省选-。 考点:DP。 题意: 给定 n n n 个数 A i A_i Ai,对 A i A_i Ai 进行染色,只有两种颜色。设 C C C 为 A A A 染色后的数组。 如果 A i A_i Ai 左侧没有预期同…...
图传推流学习(敬请期待)
图传推流简介 1.RTSP、RTP与RTCP2.搭建rtsp服务器(资源下载)3.搭建rtsp服务器(搭建过程) 1.RTSP、RTP与RTCP RTSP(Real Time Streaming Protocol)、RTP(Real-time Transport Protocol࿰…...
【JavaGuide】十大经典排序算法总结
冒泡排序 算法步骤 不断的两两比较,这样当前最大的元素总是会排在最后面。所以称为冒泡。 图解算法 代码实现 public static int[] bubbleSort(int[] arr) {// i是排好了几个数for (int i 1; i < arr.length; i) {// flag标记当前循环是否调整了顺序,…...
程序中怎样用最简单方法实现写excel文档
很多开发语言都能找到excel文档读写的库,但是在资源极其受限的环境下开发,引入这些库会带来兼容性问题。因为一个小功能引入一堆库,我始终觉得划不来。看到有项目引用的jar包有一百多个,看着头麻,根本搞不清谁依赖谁。…...
《机器学习与人类学习:比较、融合与未来展望》
《机器学习与人类学习:比较、融合与未来展望》 一、引言二、机器学习的概念与发展(一)机器学习的定义与分类(二)机器学习的发展历程(三)机器学习的应用领域 三、人类学习的本质与过程࿰…...
Mysql 8.4.3LTS 的离线部署
文章目录 一、部署环境资源配置 二、下载地址版本选择 三、部署详情1. 上传安装包2. 解压软件包3. 安装mysql3.3.1 创建mysql用户与用户组3.3.2 授权安装文件夹3.3.3 安装libaio依赖 (坑)ubuntu24.04 中关于libaio的坑 3.3.4 初始化Mysql数据库3.3.5 编辑…...
h5项目打包上线报错404文件找不到
配置一下路由就可以了 1.找到项目里的这个文件 2.滑到最下面‘源码视图’ 3.找到base,没有的话写上一个,保存后打包就可以了 "h5" : {"router" : {"base" : "./"}}...
mysql上课总结(5)(MySQL的完整性约束(详细介绍))
目录 一、完整性约束。 (1)概念与目的。 <1>概念。 <2>目的。 (2)各个约束的详细(表格) (3)各个约束的简要总结。 <1>主键约束。 <2>唯一约束。 <3>非…...
复原IP地址
分割字符串的姐妹题 题目:93. 复原 IP 地址 - 力扣(LeetCode) 题解:代码随想录 代码: class Solution {List<String> resnew ArrayList<>();public List<String> restoreIpAddresses(String s) …...
Effective C++ 学习笔记二
Effective C 学习笔记二 文章目录 Effective C 学习笔记二别让异常逃离析构函数绝不在构造和析构的过程中调用virtual函数令operator 返回一个reference to *this在operator中处理"自我赋值"C四种转换 别让异常逃离析构函数 C 并不禁止析构函数吐出异常,…...
以「JIMUMETA元宇宙体验馆」为例,探讨有哪些元宇宙场景?
让我们以「JIMUMETA元宇宙体验馆」为例,深入探讨元宇宙场景中提供的产品与服务。该体验馆由视创云展精心打造,集成了企业主展馆、元宇宙虚拟活动分会场、品牌展示分会场、线上论坛会场以及会议室接待会客等多重功能,旨在全方位满足企业发布会…...
RHCE的练习(8)
动态网站 lnmp(LAMP) 解析index.php界面 (1)预配,确保服务能够被访问 systemctl stop firewalld setenforce 0 (2)安装nginx服务 mount /dev/sr0 /mnt cat /etc/yum.repos.d/base.repo dnf …...
yocto是如何收集recipes,如何加入现有的bb文件
yocto通常是如何收集recipes: 在Yocto中,通过以下方式收集recipes: 层(Layers) Yocto项目使用层来组织recipes。层是包含配置文件、recipes和其他相关文件的目录结构。每个层有自己的目录,其中 recipes-* 目录用于存…...
[运维] 服务器本地网络可用性检查脚本
引言 在日常活动中,我遇到过一个令人头疼的问题。测试使用的远程终端在第二天继续使用时可能就发生无法与外网通信的情况,往往连上终端后在拉取资源时才能发现。这导致每次使用前都需要手动检查网络状况,增加了不必要的麻烦。为了简化这一过…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
