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-* 目录用于存…...
[运维] 服务器本地网络可用性检查脚本
引言 在日常活动中,我遇到过一个令人头疼的问题。测试使用的远程终端在第二天继续使用时可能就发生无法与外网通信的情况,往往连上终端后在拉取资源时才能发现。这导致每次使用前都需要手动检查网络状况,增加了不必要的麻烦。为了简化这一过…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...