当前位置: 首页 > news >正文

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;}
}

存在的问题:

  1. 依赖外部设备运动:该算法需要通过控制云台运动来改变摄像机的视角,以获取不同的背景。这在实际应用中可能不方便,增加了系统的复杂性和成本。

  2. 复杂的背景处理:使用了帧累积和直方图比较的方法,计算量较大,效率较低。

  3. 静态场景误判:对于本身就没有明显变化的静态场景,可能误判为画面冻结。

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的视频质量检测中有所介绍&#xff0c;本文将详细介绍其优化版本。 1. 原始代码分析 图像抖动检测的原始代码&#xff1a; bool ScreenFreezeDetect…...

Day22 opencv图像预处理

图像预处理 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;常见的操作包括图像空间转换、图像大小调…...

QT中的定时器与计时器

目录 QTimer QTimer 的替代方案 API QElapsedTimer API 笔者写Qt的时候经常遇到需要定时完成任务的情况。举个例子&#xff1a;我写串口通信程序的时候需要定时向下位机发送数据。或者是定时任务周期性出发&#xff08;更新时间等&#xff09; 在Qt中&#xff0c;有两个非…...

国内AI大模型学习平台

据不完全统计&#xff0c;目前&#xff0c;国内有几大AI大模型学习平台可供选择&#xff1a; 1.昇思大模型平台&#xff1a;这是一个集算法选型、创意分享、模型实验和大模型在线体验于一体的AI学习与实践社区。 2.魔搭社区&#xff1a;提供AI模型、数据集和应用的开发与探索平…...

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…...

深入理解数据库的三范式

数据库设计中的范式&#xff08;Normal Form&#xff09;是用于规范数据存储结构、消除冗余以及保证数据一致性的重要原则。范式的概念有多种层次&#xff0c;常用的前三种称为第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;和第三范式&#xff08…...

P11233 [CSP-S 2024] 染色

P11233 [CSP-S 2024] 染色 难度&#xff1a;提高/省选-。 考点&#xff1a;DP。 题意&#xff1a; 给定 n n n 个数 A i A_i Ai​&#xff0c;对 A i A_i Ai​ 进行染色&#xff0c;只有两种颜色。设 C C C 为 A A A 染色后的数组。 如果 A i A_i Ai​ 左侧没有预期同…...

图传推流学习(敬请期待)

图传推流简介 1.RTSP、RTP与RTCP2.搭建rtsp服务器&#xff08;资源下载&#xff09;3.搭建rtsp服务器&#xff08;搭建过程&#xff09; 1.RTSP、RTP与RTCP RTSP&#xff08;Real Time Streaming Protocol&#xff09;、RTP&#xff08;Real-time Transport Protocol&#xff0…...

【JavaGuide】十大经典排序算法总结

冒泡排序 算法步骤 不断的两两比较&#xff0c;这样当前最大的元素总是会排在最后面。所以称为冒泡。 图解算法 代码实现 public static int[] bubbleSort(int[] arr) {// i是排好了几个数for (int i 1; i < arr.length; i) {// flag标记当前循环是否调整了顺序&#xff0c…...

程序中怎样用最简单方法实现写excel文档

很多开发语言都能找到excel文档读写的库&#xff0c;但是在资源极其受限的环境下开发&#xff0c;引入这些库会带来兼容性问题。因为一个小功能引入一堆库&#xff0c;我始终觉得划不来。看到有项目引用的jar包有一百多个&#xff0c;看着头麻&#xff0c;根本搞不清谁依赖谁。…...

《机器学习与人类学习:比较、融合与未来展望》

《机器学习与人类学习&#xff1a;比较、融合与未来展望》 一、引言二、机器学习的概念与发展&#xff08;一&#xff09;机器学习的定义与分类&#xff08;二&#xff09;机器学习的发展历程&#xff08;三&#xff09;机器学习的应用领域 三、人类学习的本质与过程&#xff0…...

Mysql 8.4.3LTS 的离线部署

文章目录 一、部署环境资源配置 二、下载地址版本选择 三、部署详情1. 上传安装包2. 解压软件包3. 安装mysql3.3.1 创建mysql用户与用户组3.3.2 授权安装文件夹3.3.3 安装libaio依赖 &#xff08;坑&#xff09;ubuntu24.04 中关于libaio的坑 3.3.4 初始化Mysql数据库3.3.5 编辑…...

h5项目打包上线报错404文件找不到

配置一下路由就可以了 1.找到项目里的这个文件 2.滑到最下面‘源码视图’ 3.找到base&#xff0c;没有的话写上一个&#xff0c;保存后打包就可以了 "h5" : {"router" : {"base" : "./"}}...

mysql上课总结(5)(MySQL的完整性约束(详细介绍))

目录 一、完整性约束。 &#xff08;1&#xff09;概念与目的。 <1>概念。 <2>目的。 &#xff08;2&#xff09;各个约束的详细&#xff08;表格&#xff09; &#xff08;3&#xff09;各个约束的简要总结。 <1>主键约束。 <2>唯一约束。 <3>非…...

复原IP地址

分割字符串的姐妹题 题目&#xff1a;93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 代码&#xff1a; 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 并不禁止析构函数吐出异常&#xff0c;…...

以「JIMUMETA元宇宙体验馆」为例,探讨有哪些元宇宙场景?

让我们以「JIMUMETA元宇宙体验馆」为例&#xff0c;深入探讨元宇宙场景中提供的产品与服务。该体验馆由视创云展精心打造&#xff0c;集成了企业主展馆、元宇宙虚拟活动分会场、品牌展示分会场、线上论坛会场以及会议室接待会客等多重功能&#xff0c;旨在全方位满足企业发布会…...

RHCE的练习(8)

动态网站 lnmp&#xff08;LAMP&#xff09; 解析index.php界面 &#xff08;1&#xff09;预配&#xff0c;确保服务能够被访问 systemctl stop firewalld setenforce 0 &#xff08;2&#xff09;安装nginx服务 mount /dev/sr0 /mnt cat /etc/yum.repos.d/base.repo dnf …...

yocto是如何收集recipes,如何加入现有的bb文件

yocto通常是如何收集recipes: 在Yocto中&#xff0c;通过以下方式收集recipes&#xff1a; 层&#xff08;Layers&#xff09; Yocto项目使用层来组织recipes。层是包含配置文件、recipes和其他相关文件的目录结构。每个层有自己的目录&#xff0c;其中 recipes-* 目录用于存…...

[运维] 服务器本地网络可用性检查脚本

引言 在日常活动中&#xff0c;我遇到过一个令人头疼的问题。测试使用的远程终端在第二天继续使用时可能就发生无法与外网通信的情况&#xff0c;往往连上终端后在拉取资源时才能发现。这导致每次使用前都需要手动检查网络状况&#xff0c;增加了不必要的麻烦。为了简化这一过…...

Ecco架构:突破LLM推理内存墙的熵编码优化方案

1. Ecco架构&#xff1a;突破LLM推理的内存墙在A100 GPU上运行LLaMA-70B模型时&#xff0c;仅权重参数就占用140GB显存&#xff0c;而HBM带宽仅有2TB/s——这就是典型的"内存墙"问题。传统解决方案如量化会损失精度&#xff0c;而单纯增加硬件成本又面临边际效益递减…...

SAP顾问实战:给MB51报表加供应商名称和原因代码,完整隐式增强教程

SAP顾问实战&#xff1a;MB51报表增强之供应商与原因代码集成指南 在SAP项目实施过程中&#xff0c;业务用户对标准报表的抱怨几乎成为每个顾问的日常。"为什么不能在一个报表里看到所有信息&#xff1f;"——MB51物料凭证清单作为物料移动的核心查询工具&#xff0c…...

一款面向高清多媒体应用的高性价比解决方案

Hi-CHIP C3100是一款面向高清多媒体应用的高性价比解决方案。它集成了高性能32位RISC CPU与强大的多媒体处理系统&#xff0c;支持2K视频解码和显示&#xff0c;并提供丰富的外设接口。主要规格与特性特性类别具体规格CPU双核高性能32位RISC CPU&#xff0c;性能达2000 DMIPS&a…...

双人成行2026最新官方正版免费下载 520情侣必玩 一键转存 永久更新 (看到速转存 资源随时走丢)

下载链接 # 编织奇迹的合作历程&#xff1a;《双人成行》的幕后、机制与同类作品剖析 在现代电子游戏领域&#xff0c;纯粹专注于双人合作的游戏并不多见&#xff0c;而能将其做到极致并斩获行业高额荣誉的作品&#xff0c;更是凤毛麟角。由Hazelight Studios开发的《双人成行…...

ABAP 采购带组件收货BAPI

一、背景 有一项业务比较特殊&#xff0c;金靶的回收加工&#xff0c;既会有物料的消耗&#xff0c;也会收进上一批加工洗出来的物料&#xff0c;并且组件物料会带有批次&#xff0c;MIGO过账时需要填写批次&#xff0c;那么对应BAPI&#xff0c;也需要加入这一部分批次。如果…...

2026年终极指南:JetBrains IDE试用期重置完整解决方案

2026年终极指南&#xff1a;JetBrains IDE试用期重置完整解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置是每个开发者都可能遇到的挑战&#xff0c;当IntelliJ IDEA、PyCharm、W…...

网络安全有哪些岗位?如何成为一名优秀的网络安全工程师?

网络安全有哪些岗位&#xff1f;如何成为一名优秀的网络安全工程师&#xff1f; 网络安全是什么&#xff1f; 首先说一下什么是网络安全&#xff1f;其中&#xff0c;网络安全工程师工作内容具体有哪些&#xff1f; 网络安全 确保网络系统的硬件、软件及其系统中的数据受到保护…...

破解人类微生物组数据分析难题:curatedMetagenomicData的完整解决方案

破解人类微生物组数据分析难题&#xff1a;curatedMetagenomicData的完整解决方案 【免费下载链接】curatedMetagenomicData Curated Metagenomic Data of the Human Microbiome 项目地址: https://gitcode.com/gh_mirrors/cu/curatedMetagenomicData 宏基因组数据分析在…...

Purple Pi OH开发板适配OpenHarmony 5.0全流程解析与实战

1. 项目概述&#xff1a;从一块开发板到OpenHarmony 5.0的完整旅程最近&#xff0c;我手头的这块触觉智能Purple Pi OH开发板&#xff0c;终于成功跑通了OpenHarmony 5.0 Release版本。这不仅仅是一次简单的系统升级适配&#xff0c;更像是一场从硬件引脚定义、内核驱动、系统服…...

避开RS485通信的‘坑’:基于STM32和MODBUS协议,详解半双工收发时序与数据紊乱处理

避开RS485通信的‘坑’&#xff1a;基于STM32和MODBUS协议&#xff0c;详解半双工收发时序与数据紊乱处理 在工业自动化、智能家居等场景中&#xff0c;RS485总线因其抗干扰能力强、传输距离远等优势成为多设备通信的首选方案。但许多开发者在实际项目中常遇到数据收发冲突、响…...