当前位置: 首页 > 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,认为画面冻结。

http://www.lryc.cn/news/474438.html

相关文章:

  • Day22 opencv图像预处理
  • QT中的定时器与计时器
  • 国内AI大模型学习平台
  • 曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%
  • 深入理解数据库的三范式
  • P11233 [CSP-S 2024] 染色
  • 图传推流学习(敬请期待)
  • 【JavaGuide】十大经典排序算法总结
  • 程序中怎样用最简单方法实现写excel文档
  • 《机器学习与人类学习:比较、融合与未来展望》
  • Mysql 8.4.3LTS 的离线部署
  • h5项目打包上线报错404文件找不到
  • mysql上课总结(5)(MySQL的完整性约束(详细介绍))
  • 复原IP地址
  • Effective C++ 学习笔记二
  • 以「JIMUMETA元宇宙体验馆」为例,探讨有哪些元宇宙场景?
  • RHCE的练习(8)
  • yocto是如何收集recipes,如何加入现有的bb文件
  • [运维] 服务器本地网络可用性检查脚本
  • MYSQL-显示信息关于服务器插件语法(二十五)
  • 【线下培训】龙信受邀参加开封市公安局举办的电子数据取证培训班
  • 软件测试工程师面试整理 —— 编程与自动化!
  • 【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!
  • java.io.IOException: Too many open files
  • ElementUI el-form表单多层数组的校验
  • 常见的向量范数、矩阵范数和对偶范数-对偶范数详细证明过程
  • Android 滴滴面经
  • angular登录按钮输入框监听
  • 硅谷甄选(10)用户管理
  • Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】