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

目录

  • [OpenCV+VS2015]火焰检测算法(HSI判据)
    • 1 HSI模型和简介
    • 2 代码
    • 3 注意点
    • 4 效果

1 HSI模型和简介

别人的宝藏文章 :https://blog.csdn.net/qq_27569955/article/details/51531460
模型,还有RGB转HSI的关系这里面的介绍都很棒,我从中受益匪浅

2 代码

#include <opencv2\opencv.hpp>
#include <iostream>
#include <math.h>using namespace cv;
using namespace std;double Judge(double in);
void RGBtoHIS(Mat& image_input, Mat& image_output);
void DrawFire(Mat &inputImg, Mat foreImg);
void FireDetection(Mat &image_input, Mat &image_output);int main(int argc, char** argv) {Mat src = imread("E:\\vs_work\\firedetection\\8.jpg");Mat dst;FireDetection(src, dst);imshow("original picture", src);imshow("convert picture", dst);//imwrite("E:\\vs_work\\result\\10_binary_image.jpg", dst);//imwrite("E:\\vs_work\\result\\10_Detect_Fire.jpg", src);waitKey(0);return 0;
}void FireDetection(Mat &image_input, Mat &image_output)
{image_output = Mat::zeros(image_input.size(), CV_8UC1); //初始化output矩阵Mat image_middle;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 ");}/*初始化程序报错*/RGBtoHIS( image_input,  image_middle);for (int i = 0; i < image_middle.rows; i++) {for (int j = 0; j < image_middle.cols; j++) {double H, S, I;H = image_middle.at<uchar>(i, image_middle.channels()*j + 0);S = image_middle.at<uchar>(i, image_middle.channels()*j + 1);I = image_middle.at<uchar>(i, image_middle.channels()*j + 2);if ((H>0 && H<60) && S>20 && S<255 && I>30 && I<255){image_output.at<uchar>(i, j) = 255;//printf("H = %f", H);}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);imshow("HIS image", image_middle);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);
}void RGBtoHIS(Mat& image_input, Mat& image_output)
{image_output = Mat::zeros(image_input.size(), CV_8UC3); //初始化output矩阵if (image_input.empty()) {printf("could not load RGBtoHIS image...please try again!/n ");}if (image_output.empty() || image_output.channels() != 3) {printf("could not initialize RGBtoHIS 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);//RGB转HIS公式编写/*   B = B / 255.0;G = G / 255.0;R = R / 255.0;*/float minRGB = min(min(R, G), B);double I = (R + B + G) / 3;double S = 1 - 3 * minRGB / (R + B + G);double H;double theta, den, num, esp = 0.0000001;double pi = 3.14159265;num = 0.5*((R - G) + (R - B));den = (R - G)*(R - G) + (R - B)*(G - B);den = sqrt(den);den = num / (den);   //den = num / (den+esp);theta = acos(den);if (G >= B){H = theta;}else{H = 2 * pi - theta;}//H的单位是弧度//H = Judge(H * 255);//I = Judge(I * 255);//S = Judge(S * 255);H = H / (2 * pi);image_output.at<uchar>(i, image_output.channels()*j + 0) = H*360 ;image_output.at<uchar>(i, image_output.channels()*j + 1) = S*255 ;image_output.at<uchar>(i, image_output.channels()*j + 2) = I*255 ;}}
}double Judge(double in)
{double out;if (in < 0){out = 0;}if (in > 255){out = 255;}else{out = in;}return out;
}

3 注意点

1、HSI模型下中的H要注意一开始计算出来是弧度,要把它转化为角度,然后判断0~60°内是红到黄色的变换

2、我这里使用的HSI参数是可以随着不同的变化调整的

   0<H<60 20<S<255 30<I<255

4 效果





很简单的算法,后面还要学一些更好的检测方法

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

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

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

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

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

  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. 连接池你用对了吗?一次Unexpected end of stream异常的排查
  2. 用js自动把url加入ubb代码的函数
  3. 【编程之美】2.21 只考加法的面试题
  4. GitHub的嵌入式开源项目
  5. 小甲鱼 OllyDbg 教程系列 (十七) : 反调试
  6. 代码重用_WebAssembly的速度和代码重用
  7. 【计算机网络笔记】交换方式:电路/分组/报文交换
  8. 【渝粤教育】电大中专药剂学基础知识 (2)作业 题库
  9. fcm算法matlab实现,fcm算法matlab
  10. SAP ERP的版本演变基础知识
  11. android屏幕点击录制脚本,Android录制屏幕脚本
  12. 【考试】二阶段2201班考试答案(做错一概不负责)
  13. 过7游戏c语言,C语言实现扫雷小游戏
  14. R安装时出现辑程包不存在,解决方法
  15. 【萧蕊冰】ui设计和交互设计的区别是什么?
  16. 泰克Tektronix示波器软件TDS420|TDS430|TDS460上位机软件NS-Scope
  17. 银行软件测试论文参考文献,软件测试毕业论文参考文献.doc
  18. 王者服务器维护s24,王者荣耀:体验更新S24数据,征召模式痛点解决,不会再失手了...
  19. 【SQL】查找重复的数据
  20. 1024,程序员节!快乐!

热门文章

  1. python SVG图片转PNG
  2. 【FastDFS-V5.11】Linux下FastDFS+Nginx实现分布式图片服务器搭建详细教程(单机模式)
  3. Redis 内存碎片
  4. js自动生成html报表,JavaScript实现动态生成表格
  5. PDF证书加密文件如何解密?
  6. 计算机cad模板样例,教你如何新建适合自己的CAD模板
  7. APP图片加载库(框架)和缓存
  8. Notepad++ 5.8.5 中文版
  9. 李沐 动手学深度学习 第二版
  10. 【学习笔记】程序员学操作系统