[OpenCV+VS2015]火焰检测算法(RGB判据)

目录

  • [OpenCV+VS2015]火焰检测算法(RGB判据)
    • 1 RGB颜色判据介绍
      • 1.1 RGB 颜色模型
      • 1.2 RGB颜色判据
    • 2 算法简介
      • 2.1 火焰检测函数void FireDetection(Mat &image_input, Mat &image_output)
      • 2.2 框选检测函数void DrawFire(Mat &inputImg, Mat foreImg)
      • 2.3 撸代码

1 RGB颜色判据介绍

1.1 RGB 颜色模型

根据三基色原理,用基色光单位来表示光的量,则在RGB颜色空间,任意色光F都可以用R、G、B三色不同分量的相加混合而成:

F=r[R]+g[G]+b[B]

当三基色分量都为0(最弱)时混合为黑色光;当三基色分量都为k(最强)时混合为白。改变了F的坐标值,也即改变了F的色值。
采用三维空间来进行描述(如图1),把三种成分的数值当做欧几里得空间中普通笛卡尔坐标系的坐标值。在RGB模型中使用0到1之间的非负数作为立方体的坐标值,将原点(0,0,0)作为黑色,强度值沿坐标轴方向递增到达位于对角线(1,1,1)处的白色。

图 1 RGB三维空间

一个RGB组合(r,g,b)表示代表一个给定颜色的点在立方体内部、表面或者边上的三维坐标。这种表示方法使得在计算两个颜色相近程度时只需简单计算它们之间的距离:距离越短颜色越接近。

1.2 RGB颜色判据

眼的视网膜上有两类感光器:锥状体和杆状体。锥状体主要位于视网膜的中间部分,称之为中央凹,且对颜色高度敏感,称为白昼视觉或亮视觉;杆状体分布面积较大,用来给出视野内的一般的总体图像,没有彩色感觉,而对低照明度敏感,称为微光视觉或暗视觉。由于锥状体对红、绿、蓝三种颜色的光很敏感,因此一般用于人眼观看的颜色模型是RGB模型。一般来说,无论是在网上下载的图片或视频,还是从摄像机得来的录像,都是RGB模型。
对于普通火焰来说,它的红色分量和绿色分量会很大,并且绿色分量会大于蓝色分量,所以我们写出如下不等式:
R > RedThreshold
R>G>B
其中,RedThreshold为红色分量的阈值。
经过这两个不等式的判断,我们可以通过二值图的方法得到火焰的外形,如图2所示。

(a)火焰原图

(b)二值化后图像
图2 用RGB判据对图片二值化

2 算法简介

首先导入一张图片,然后对该图片进行RGB颜色判据,从而二值化,然后对二值化后的图像进行框选选出火焰部分。

2.1 火焰检测函数void FireDetection(Mat &image_input, Mat &image_output)

首先先要检测函数导入的两个参量是否有错,使用if语句进行判断。然后使用image_input.at的方法将RGB三个通道分开。
其中要注意的是RGB三个通道的顺序,在程序中B是第一个,R是最后一个。
然后,把分离出的R、G、B分量进行RGB颜色判据判断,从而二值化。最后输出原始图像和二值化图像。

2.2 框选检测函数void DrawFire(Mat &inputImg, Mat foreImg)

首先保存二值化后的整个火焰的轮廓,然后使用迭代器对每个点进行判断是否是火焰,判断为是则框选,最后输出图像。

2.3 撸代码

void FireDetection(Mat &image_input, Mat &image_output)
{image_output = Mat::zeros(image_input.size(), CV_8UC1); //初始化output矩阵if (image_input.empty()) {printf("could not load image...please try again!/n ");}if (image_output.empty()||image_output.channels()!= 1) {printf("could not initialize output...please try again!/n ");}/*初始化程序报错*/for (int i = 0; i < image_input.rows; i++) {for (int j = 0; j < image_input.cols; j++) {float R, G, B;B = image_input.at<uchar>(i, image_input.channels()*j + 0);G = image_input.at<uchar>(i, image_input.channels()*j + 1);R = image_input.at<uchar>(i, image_input.channels()*j + 2);int minRGB = min(min(R, G), B);double S = 1 - 3.0*minRGB / (R + G + B);int RedThreshold = 115;if (R > RedThreshold && R > G&&G > B){image_output.at<uchar>(i, j) = 255;}else {image_output.at<uchar>(i, j) = 0;}}}namedWindow("original image", WINDOW_AUTOSIZE);imshow("original image", image_input);namedWindow("binary image", WINDOW_AUTOSIZE);imshow("binary image", image_output);DrawFire(image_input, image_output);
}void DrawFire(Mat &inputImg, Mat foreImg)
{vector<vector<Point>> contours_set;//保存轮廓提取后的点集及拓扑关系  findContours(foreImg, contours_set, RETR_EXTERNAL, CHAIN_APPROX_NONE);Mat result0;Scalar holeColor;Scalar externalColor;vector<vector<Point>>::iterator iter = contours_set.begin();for (; iter != contours_set.end(); )   //迭代器循环{Rect rect = boundingRect(*iter);/* float radius;Point2f center;minEnclosingCircle(*iter, center, radius);*/if (rect.area()> 0){rectangle(inputImg, rect, Scalar(0, 255, 0));  //scalar表示是什么颜色去框选++iter;}else{iter = contours_set.erase(iter);}}imshow("Detect Fire", inputImg);
}

效果如下


感觉还是阔以

[OpenCV+VS2015]火焰检测算法(RGB判据)相关推荐

  1. 基于OpenCV的火焰检测(二)——RGB颜色判据

    上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域.火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据--RGB判 ...

  2. 基于OpenCV的火焰检测(三)——HSI颜色判据

    上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据--HSI判据.为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型:HSI颜色模 ...

  3. vs2019 基于pcl和opencv的体积检测算法 zed版本+安卓端新手版(二)

    vs2019 基于pcl和opencv的体积检测算法 zed版本+安卓端新手版(二) Pcl库安卓端的环境配置和使用jni实现c++算法在安卓端的实现 Pcl库的编译 安装ubuntu系统 编译pcl ...

  4. 基于OpenCV安全帽识别检测算法 Python

    安全帽识别检测算法基于OpenCV-Python网络架构对现场画面进行实时分析检测.Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和 ...

  5. OpenCV特征点检测算法对比

    识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点, ...

  6. 基于opencv的裂缝宽度检测算法(计算轮廓最大内切圆算法)

    这里依然是应用在图像分割的场景,在对路面病害中的裂缝进行检测时,通过UNet++图像分割模型我们可以得到裂缝的标注图像,如下图所示. 针对裂缝的图像分割图像,我们仍需进一步的进行图像处理操作,计算裂缝 ...

  7. 相机模型与标定(十二)--opencv圆形标志点检测算法

    本来以为圆形检测比较简单,实际还是花费我近一上午时间,网上几乎没有相关资料(除了OpenCV官网).这里坐下简单介绍,分享给大家. 非对称圆形标定物检测: 1.findCirclesGrid函数的使用 ...

  8. 移植OpenCV的AdaBoost人脸检测算法到DM6467

    1        人脸检测算法在DM6467上移植的步骤 要将人脸检测算法移植到DM6467,我们使用OpenCV现有的源码作为基础.首先,需要在PC上用C语言实现人脸检测的程序编写,然后移植Open ...

  9. 仅使用OpenCV实现活体检测!(附源码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 我们先来看一个网络留言 △ 来自虾米妈咪 小朋友用妈妈的一寸照片通 ...

  10. 照片解锁手机不能忍?教你用OpenCV做活体检测 | 有代码

    圆栗子 编译整理 量子位 出品 | 公众号 QbitAI △ 来自虾米妈咪 小朋友用妈妈的一寸照片通过了人脸识别,打击了小度音箱的家长监督机制. 活体检测没做好. 公交车身广告上的董明珠头像,被宁波交 ...

最新文章

  1. 【转发】centos7支持ntfs
  2. 总结JavaScript常用数组操作方法,包含ES6方法
  3. 使用python操作hdfs,并grep想要的数据
  4. Java 异常处理中对于 finally 的一些思考
  5. 算法竞赛训练指南代码仓库_数据仓库综合指南
  6. java 线程 内存分配内存_漫谈JAVA语言的内存分配
  7. ffmpeg运行在服务器上,FFMPEG安装在服务器上
  8. apache FilesMatch
  9. SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比
  10. java: jsp:param中文乱码
  11. 虚拟化实验室推进计算机网络专业实践教学的解决方案
  12. Annotation-specified bean name ‘mapper‘ for bean class [com.thoughtworks.xstream.mapper.Mapper] conf
  13. matlab画图标签,Matlab绘图
  14. 纽约亮马河邮轮 - 从水上欣赏纽约迷人景色
  15. 腾讯云联手腾讯安全玄武实验室,提供「应用克隆」漏洞免费检测服务
  16. ASO|几个ASO优化方案解析(下)
  17. 关乎Java多线程+Runnable和Thread…
  18. 黑马送书啦!全体IT技术人的福利~
  19. 《Java程序设计》第三周学习总结
  20. c++ opengl 三维图形中显示文字_为什么使用GPU渲染图形图像,而不使用CPU呢?

热门文章

  1. HelloWorld
  2. 当toB产品经理遇到数据分析
  3. 高斯函数及高斯滤波器
  4. PDF在线预览插件:PDFObject web端预览(不支持手机网页预览,手机网页预览见下一篇博客);
  5. pdfobject屏蔽头部工具栏如何兼容ie
  6. 基于STM32完成FATFS文件系统移植与运用--这是完全免费开源的FAT文件系统
  7. pdf页面倒序如何调整?
  8. 运动控制器用c语言编程吗,中文可编程运动控制器
  9. IntelliJ IDEA2018版下载安装教程以及详细步骤
  10. eclipse导入android项目