视频清晰度、色偏以及亮度异常检测

2023-11-08

    转自:http://blog.csdn.net/kklots/article/details/12720359

  昨天老板临时交代一个活,要求通过算法检测监控设备是否存在失焦、偏色、亮度异常等问题。问题本身不难,在网上查看了一些资料,自己也做了一些思考,方法如下:

        1.失焦检测。

        失焦的主要表现就是画面模糊,衡量画面模糊的主要方法就是梯度的统计特征,通常梯度值越高,画面的边缘信息越丰富,图像越清晰。需要注意的是梯度信息与每一个视频本身的特点有关系,如果画面中本身的纹理就很少,即使不失焦,梯度统计信息也会很少,对监控设备失焦检测需要人工参与的标定过程,由人告诉计算机某个设备正常情况下的纹理信息是怎样的。

[cpp]  view plain copy
  1. /******************************************************************************** 
  2. *函数描述:  DefRto 计算并返回一幅图像的清晰度    
  3. *函数参数: frame  彩色帧图 
  4. *函数返回值:double   清晰度表示值,针对该视频,当清晰度小于10为模糊,大于14为清楚                   
  5. *********************************************************************************/  
  6. double DefRto(Mat frame)  
  7. {  
  8.     Mat gray;  
  9.     cvtColor(frame,gray,CV_BGR2GRAY);  
  10.     IplImage *img = &(IplImage(gray));  
  11.     double temp = 0;  
  12.     double DR = 0;  
  13.     int i,j;//循环变量  
  14.     int height=img->height;  
  15.     int width=img->width;  
  16.     int step=img->widthStep/sizeof(uchar);  
  17.     uchar *data=(uchar*)img->imageData;  
  18.     double num = width*height;  
  19.   
  20.     for(i=0;i<height;i++)  
  21.     {  
  22.         for(j=0;j<width;j++)  
  23.         {  
  24.             temp += sqrt((pow((double)(data[(i+1)*step+j]-data[i*step+j]),2) + pow((double)(data[i*step+j+1]-data[i*step+j]),2)));  
  25.             temp += abs(data[(i+1)*step+j]-data[i*step+j])+abs(data[i*step+j+1]-data[i*step+j]);  
  26.         }  
  27.     }  
  28.     DR = temp/num;  
  29.     return DR;  
  30. }  

        2.色偏检测。

        网上常用的一种方法是将RGB图像转变到CIE L*a*b*空间,其中L*表示图像亮度,a*表示图像红/绿分量,b*表示图像黄/蓝分量。通常存在色偏的图像,在a*和b*分量上的均值会偏离原点很远,方差也会偏小;通过计算图像在a*和b*分量上的均值和方差,就可评估图像是否存在色偏。计算CIE L*a*b*空间是一个比较繁琐的过程,好在OpenCV提供了现成的函数,因此整个过程也不复杂。

[cpp]  view plain copy
  1. /******************************************************************************************** 
  2. *函数描述:  calcCast    计算并返回一幅图像的色偏度以及,色偏方向    
  3. *函数参数:  InputImg    需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效 
  4. *           cast        计算出的偏差值,小于1表示比较正常,大于1表示存在色偏 
  5. *           da          红/绿色偏估计值,da大于0,表示偏红;da小于0表示偏绿 
  6. *           db          黄/蓝色偏估计值,db大于0,表示偏黄;db小于0表示偏蓝 
  7. *函数返回值: 返回值通过cast、da、db三个应用返回,无显式返回值 
  8. *********************************************************************************************/  
  9. void colorException(Mat InputImg,float& cast,float& da,float& db)  
  10. {  
  11.     Mat LABimg;  
  12.     cvtColor(InputImg,LABimg,CV_BGR2Lab);//参考http://blog.csdn.net/laviewpbt/article/details/9335767  
  13.                                        //由于OpenCV定义的格式是uint8,这里输出的LABimg从标准的0~100,-127~127,-127~127,被映射到了0~255,0~255,0~255空间  
  14.     float a=0,b=0;  
  15.     int HistA[256],HistB[256];  
  16.     for(int i=0;i<256;i++)  
  17.     {  
  18.         HistA[i]=0;  
  19.         HistB[i]=0;  
  20.     }  
  21.     for(int i=0;i<LABimg.rows;i++)  
  22.     {  
  23.         for(int j=0;j<LABimg.cols;j++)  
  24.         {  
  25.             a+=float(LABimg.at<cv::Vec3b>(i,j)[1]-128);//在计算过程中,要考虑将CIE L*a*b*空间还原 后同  
  26.             b+=float(LABimg.at<cv::Vec3b>(i,j)[2]-128);  
  27.             int x=LABimg.at<cv::Vec3b>(i,j)[1];  
  28.             int y=LABimg.at<cv::Vec3b>(i,j)[2];  
  29.             HistA[x]++;  
  30.             HistB[y]++;  
  31.         }  
  32.     }  
  33.     da=a/float(LABimg.rows*LABimg.cols);  
  34.     db=b/float(LABimg.rows*LABimg.cols);  
  35.     float D =sqrt(da*da+db*db);  
  36.     float Ma=0,Mb=0;  
  37.     for(int i=0;i<256;i++)  
  38.     {  
  39.         Ma+=abs(i-128-da)*HistA[i];//计算范围-128~127  
  40.         Mb+=abs(i-128-db)*HistB[i];  
  41.     }  
  42.     Ma/=float((LABimg.rows*LABimg.cols));  
  43.     Mb/=float((LABimg.rows*LABimg.cols));  
  44.     float M=sqrt(Ma*Ma+Mb*Mb);  
  45.     float K=D/M;  
  46.     cast = K;  
  47.     return;  
  48. }  

        3.亮度检测。

        亮度检测与色偏检测相似,计算图片在灰度图上的均值和方差,当存在亮度异常时,均值会偏离均值点(可以假设为128),方差也会偏小;通过计算灰度图的均值和方差,就可评估图像是否存在过曝光或曝光不足。函数如下:

[cpp]  view plain copy
  1. /********************************************************************************************************************************************************* 
  2. *函数描述:  brightnessException     计算并返回一幅图像的色偏度以及,色偏方向    
  3. *函数参数:  InputImg    需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效 
  4. *           cast        计算出的偏差值,小于1表示比较正常,大于1表示存在亮度异常;当cast异常时,da大于0表示过亮,da小于0表示过暗 
  5. *函数返回值: 返回值通过cast、da两个引用返回,无显式返回值 
  6. **********************************************************************************************************************************************************/  
  7. void brightnessException (Mat InputImg,float& cast,float& da)  
  8. {  
  9.     Mat GRAYimg;  
  10.     cvtColor(InputImg,GRAYimg,CV_BGR2GRAY);  
  11.     float a=0;  
  12.     int Hist[256];  
  13.     for(int i=0;i<256;i++)  
  14.     Hist[i]=0;  
  15.     for(int i=0;i<GRAYimg.rows;i++)  
  16.     {  
  17.         for(int j=0;j<GRAYimg.cols;j++)  
  18.         {  
  19.             a+=float(GRAYimg.at<uchar>(i,j)-128);//在计算过程中,考虑128为亮度均值点  
  20.             int x=GRAYimg.at<uchar>(i,j);  
  21.             Hist[x]++;  
  22.         }  
  23.     }  
  24.     da=a/float(GRAYimg.rows*InputImg.cols);  
  25.     float D =abs(da);  
  26.     float Ma=0;  
  27.     for(int i=0;i<256;i++)  
  28.     {  
  29.         Ma+=abs(i-128-da)*Hist[i];  
  30.     }  
  31.     Ma/=float((GRAYimg.rows*GRAYimg.cols));  
  32.     float M=abs(Ma);  
  33.     float K=D/M;  
  34.     cast = K;  
  35.     return;  
  36. }  
        最后展示一下结果。
        可以发现:当亮度变低时,失焦检测显示结果为:模糊。这是由于失焦检测依赖于梯度统计,亮度变低时,会导致梯度值整体下降,从而导致检测不正确。一种更好的方法是利用亮度检测的结果,合理设定失焦检测的报警阈值,避免这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视频清晰度、色偏以及亮度异常检测 的相关文章

  • 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)

    问题 VS2010 MFC OpenCV 显示图片 链接 http jingyan baidu com article f71d60375ddd411ab641d1e3 html 说明 可以了解一个基本的应用OpenCV的MFC程序的基本流
  • 【OpenCV学习笔记】【函数学习】十四(cvSeq的用法说明(功能很多,按照需求使用))

    OpenCV CvSeq 结构 一直困惑于CvSeq到底是个什么样的东西 因为曾经拿到别人写的一个函数库 其返回值是一个CvSeq指针 我的任务是遍历所有的Sequence 然后删除其中不符合要求的Sequence 由于没有文档 我当时并不
  • OpenCV(十五)边缘检测1 -- Sobel算子(一阶微分算子,X、Y方向边缘检测)

    目录 一 边缘检测基础理论 1 作用 2 分类 1 基于搜索 2 基于零穿越 3 算子比较 二 Sobel算子基础理论 1 作用 2 原理及推导 3 更详细推导 4 Sobel函数 二 实战 1 对x方向微分 2 对y方向微分 3 线性混合
  • 我的opencv3.1+vs2015配置

    opencv下载地址 www opencv org 下载opencv3 1版本 其实是个压缩文件zip 然后解压 解压文件说明 build 里是各平台的jar dll sources 是源文件 头文件 框架等等 设置环境变量 右键我的电脑
  • 在 C++ 代码中调用 NumPy

    要在 C 代码中调用 NumPy 可以使用 Boost Python 库 为了这样做 需要安装 Boost 开发库和 NumPy 并使用 BOOST PYTHON MODULE 宏定义来创建一个 Python 模块 以下是一个简单的示例 演
  • VS编译OpenCV3

    目录 流程 源码 环境 编译完成库 流程文档转载 防丢 1 下载Cmake 2 下载OpenCV源码 3 编译OpenCV 4 最后一步 VS编译openCV 4 1编译Debug版的openCV 4 2编译Release版的openCV
  • 【C++】一文详解lambda表达式用法及发展历程

    文章目录 1 lambda表达式语法 2 捕获列表 2 1 作用域 2 2 捕获值与捕获引用 2 3 特殊捕获方法 3 lambda表达式实现原理 4 无状态lambda表达式 5 在STL中使用lambda表达式 6 广义捕获 7 泛型l
  • 【C++】5、构建:CMake

    文章目录 一 概述 二 实战 2 1 内部构建 外部构建 2 2 CLion Cmake 一 概述 CMake 是跨平台构建工具 其通过 CMakeLists txt 描述 并生成 native 编译配置文件 在 Linux Unix 平台
  • OpenCV-Python 图像缩放

    缩放就是调整图片的大小 使用cv2 resize 函数实现缩放 图像的大小可以手动指定 也可以指定缩放比例 也可使用不同的插值方法 插值方式 cv INTER NEAREST 最近邻插值 cv INTER LINEAR 双线性插值 cv I
  • 【VS2010学习笔记】【异常处理】一(无法启动此程序,因为计算机中丢失libiconv-2.dll)

    问题1 无法启动此程序 因为计算机中丢失libiconv 2 dll 问题描述 在VS2010 Opencv2 4 7的程序调试的过程中 再点击 运行 后 系统提示 无法启动此程序 因为计算机中丢失libiconv 2 dll 自己在调试的
  • 【OpenCV学习笔记】【异常处理】一(The Matrix is not continuous, thus its number of rows can not be changed)

    在调试 Mastering OpenCV with Practical Computer Vision Projects 书中的代码 trainSVM cpp文件 对数码管的正负样本进行训练时 出现以下错误 OpenCV Error Ima
  • 高斯滤波的快速实现

    http www cnblogs com ImageVision archive 2012 06 11 2545555 html 二維高斯函數具有旋轉對稱性 處理後不會對哪一個方向上的邊緣進行了過多的濾波 因此相對其他濾波器 具有無法比擬的
  • 我的python3.6、opencv安装环境搭建

    我需要使用tesseract OCR的模块 vs的配置有点麻烦 所以采用py的环境 搭建 1 在python org网站下载python3 6版本 我下载的3 6 8的python的安装 选存放的路径和把配置环境变量选项勾上否则需要自己配置
  • 【C语言】C语言的495个问题

    文章目录 1 声明和初始化 基本类型 1 1 各类型区别 1 2 为什么不精确定义标准类型的大小 1 3 因为C没有精确定义标准类型大小 那么用typedef定义int16和int32是否能解决问题呢 1 4 新64位机上64位类型是什么样
  • 推荐!国外程序员整理的 C++ 资源大全

    关于 C 框架 库和资源的一些汇总列表 由 fffaraz 发起和维护 内容包括 标准库 Web应用框架 人工智能 数据库 图片处理 机器学习 日志 代码分析等 标准库 C 标准库 包括了STL容器 算法和函数等 C Standard Li
  • cvCloneImage()内存泄漏解决方法, cvCloneImage()和cvCopy()的区别

    转自 http blog csdn net stellar0 article details 8741759 cvCloneImage 每次使用时编译器会分配新的内存空间 不会覆盖以前的内容 所以如果在循环中使用内存会迅速减小 每次用完都需
  • Opencv4基于C++的 实时人脸监测

    文章目录 一 环境配置搭建 VS2015 Opencv4 6 二 下资源文件 第一种 本地生成 第二种 直接下载 三 代码展示 窗口布局 main cpp test h test cpp 效果图 opencv人脸识别效果图 请叫我真爱粉 一
  • C++模板实参类型推导

    1 什么是模板 C 特性之一 批量生成代码的手段 2 模板有什么应用 1 泛型编程 例如 std vector 2 模板元编程 利用模板的特化等特性 在编译期计算出结果 例如 3 模板实参类型推导 虽然模板这么牛逼 但是今天我们不讲上述两个
  • C++ cin 实现循环读入

    习惯了使用while scanf d x 来实现循环读入 但是有时候使用泛型编程的时候就必须使用C 中的cin 但是当我想要实现循环读入的时候却发现有些困难 我们可以看一下下面这个简单的例子 include
  • 树莓派视觉小车 -- 小球追踪(颜色追踪)(OpenCV色彩空间HSV)

    目录 效果展示 基础理论 HSV 为什么用HSV空间而不是RGB空间 HSV 1 Hue 色相 2 Value 明度 3 Saturation 饱和度 一 初始化 滑动条初始化 1 创建回调函数 2 窗口设置 名称 3 滑动条设置 代码 二

随机推荐

  • Spring 中的 @Cacheable 缓存注解,太好用了!

    1 什么是缓存 第一个问题 首先要搞明白什么是缓存 缓存的意义是什么 对于普通业务 如果要查询一个数据 一般直接select数据库进行查找 但是在高流量的情况下 直接查找数据库就会成为性能的瓶颈 因为数据库查找的流程是先要从磁盘拿到数据 再
  • 彩虹6号怎么修改服务器,彩虹6号修改服务器地址

    彩虹6号修改服务器地址 内容精选 换一换 修改云服务器信息 目前支持修改云服务器名称及描述和hostname 该接口支持企业项目细粒度权限的校验 具体细粒度请参见 ecs cloudServers put云服务器hostname修改后 需要
  • C#常见简答题

    静态类和静态方法的好处与缺陷 1 好处是 在外部调用静态方法时 可以使用 类名 方法名 的方式 也可以使用 对象名 方法名 的方式 而实例方法只有后面这种方式 也就是说 调用静态方法可以无需创建对象 2 缺陷是 静态方法在访问本类的成员时
  • .el-dialog弹窗垂直居中(重点::兼容IE)

    el dialog display flex display ms flex 兼容IE flex direction column ms flex direction column 兼容IE margin 0 important posit
  • 浮点数与数组的转换

    一 指针方式 include
  • Servlet+JDBC实战开发书店项目讲解第12讲:会员管理功能

    Servlet JDBC实战开发书店项目讲解第12讲 会员管理功能 实现思路 显示会员列表 创建一个管理页面 用于显示所有会员的信息 在后端 创建一个Servlet来处理显示会员列表的请求 在该Servlet中 通过JDBC从数据库中检索会
  • MinGW、GCC、qMake等编译工具的区别

    MSVC在Windows下编译C和C gcc g 分别是GNU的C 和 C 编译器 在Linux 下面用 cmake qmake分别用来编译C和QT工程 输入是makefile 输出结果是可执行文件 编译的过程会调用编译器和连接器来完成整个
  • 百万并发服务器设计

    文章目录 前言 1 改造ntyreactor 2 如何管理eventblock 创建一个eventblock 查找对应fd在那个eventblock上 具体使用 3 总结 前言 本文的基础以及使用的代码模型都继承自上一篇文章 所以请先详细阅
  • 大模型时代下做科研的四个思路

    背景 在模型越来越大的时代背景下 如何利用有限的资源做出一些科研工作 四个方向 1 Efficient PEFT 提升训练效率 这里以PEFT parameter efficient fine tuning 为例 2 Existing st
  • linux查看磁盘IO,网络IO 总结

    一 linux查看磁盘IO 网络 IO可用的命令 1 top 监控整体服务器 cpu 内存 磁盘 网络等 2 dstat d 查看当前磁盘每秒的读取 写入量 单位K 3 dstat r 查看当前磁盘随机的读IOPS 写IOPS 4 dsta
  • 一款简单的角度计算Python包:PyAngle

    一款简单的角度计算Python包 PyAngle GitHub仓库 gzn00417 PyAngle PyPI项目 PyAngle A simple package for angle calculation Use pip install
  • ubuntu下载的国内镜像

    阿里云镜像
  • 惊爆GPT OpenAPI的调用以及API内的参数详解

    开篇 随着人工智能技术的飞速发展 自然语言处理技术 NLP 在过去几年也取得了突飞猛进的突破 在这个过程中 一个重要且可称为颠覆者的模型 GPT 3 第三代生成式预训练 Transformer 模型 的诞生 无疑大大加速了 NLP 领域的前
  • 以太坊智能合约安全编程最佳实践smart-contract-best-practices

    https github com ConsenSys smart contract best practices Ethereum Contract Security Techniques and Tips The recent attac
  • Web UI自动化测试之Selenium工具篇

    本文大纲截图 一 自动化测试介绍 1 基本介绍 1 1 自动化 概念 由机器设备代替人工自动完成指定目标的过程 优点 1 减少人工劳动力 2 提高工作效率 3 产品规格统一标准 4 规模化 批量生产 1 2 自动化测试 软件测试 校验系统是
  • 今天我抓了个 HTTPS 的包

    之前写过一篇讲 HTTPS 的思想的文章 破玩意 用 HTTPS 传纸条 后来又写了篇用更凝练的语言总体描述了 HTTPS 的主干 叮咚 HTTPS 的分支和主干 想必通过这两篇文章 HTTPS 为什么要这么设计 以及它是用来解决什么问题的
  • Android 使用retrofit解析接口返回的xml格式数据

    直接入正题 需要解析的数据格式为 从数据格式上看 上面都是单个字段的解析 下面则是一个数组 解析过程 1 添加retrofit预返回数据处理类型 2 添加返回数据处理类 也就是后面会用的 在上图中可以看到将xml的数据结构在XmlLogin
  • Matlab实现神经网络(附上100个完整仿真源码+说明文档+数据)

    神经网络是一种模仿人类神经系统 以处理信息为目的的计算模型 它由大量节点 或称神经元 和连接它们的边组成 每个节点代表一个变量 边表示变量之间的关系 在神经网络中 信息通过节点之间的连接传递 并在各个节点之间进行处理和转换 Matlab是一
  • 算法:求最长回文数

    题目 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 eg 输入 babad 输出 bab 注意 aba 也是一个有效答案 eg 输入 cbbd 输出 bb C 采用动态规划 是学习别人的 但在lee
  • 视频清晰度、色偏以及亮度异常检测

    转自 http blog csdn net kklots article details 12720359 昨天老板临时交代一个活 要求通过算法检测监控设备是否存在失焦 偏色 亮度异常等问题 问题本身不难 在网上查看了一些资料 自己也做了一