火灾识别总结

来源:互联网 发布:用java编写水仙花数 编辑:程序博客网 时间:2024/04/29 03:43


一、针对图像的火灾识别初步的探索

1、复习之前看过的一篇火灾识别的论文,里面介绍了较为基础RGB+HIS模式的图像识别方法,本次进行出发点也是基于此篇论文,并且很幸运找到了相关的代码来进行学习。

2、具体的操作方法:将原图像进行RGB三通道分离,去取各个通道像素的值,根据实验得出的经验,对火灾像素定规则,规定各个分量之间的关系;

(其中饱和度加入是为了去除背景亮度带来的影响,饱和度的值和RGB存在映射的关系。)根据这个规则对输入图像进行判断,创建一个新的图像,符合就在这个新的图像中保存火灾像素的位置,否则不保存(如图所示);将创建的二值图像进行检测轮廓,根据轮廓组数进行火灾识别框的绘制,最后输出结果图像。

3、识别效果图:

4、备注:

(1)此过程我是基于VS2013,以及opencv2.4.9版本实现的。其中需要注意的是opencv分离颜色三通道时顺序是B、G、R而不是R、G、B。

(2)遍历RGB图像采用的是at<>遍历方法,此方法实现读取矩阵中的像素,或者对像素进行赋值操作。通过此方法以及上述的公式规则完成RGB图像转换成火灾像素二值图像。

(3)RGB和灰度图像中的排列:

(4)将转换的二值图像进行下一步绘制处理,在进行轮廓检索时使用的是findContours()函数来寻找轮廓。此函数的定义为:

findContours( InputOutputArray image, OutputArrayOfArrayscontours,  int mode, int method, Pointoffset=Point()); 

Image:输入图像,8位的单通道二值图像,非零的像素会被认成1

Contour(外形轮廓):检测到的轮廓。是一个向量,响亮的每个元素都是轮廓因此,这个向量的每个元素仍是一个向量。即

vector<vector<Point> > contours;

其中mode表示轮廓检测方法,对应的有四种方法。

—CV_RETR_EXTERNAL:只检测外轮廓。忽略轮廓内部的洞。(火灾识别采用的轮廓检测方法;)

—CV_RETR_LIST:检测所有轮廓,但不建立继承(包含)关系。

—CV_RETR_TREE:检测所有轮廓,并且建立所有的继承(包含)关系。一张图来解释有何不同

(5)对二值图像查找轮廓之后,对轮廓进行建立垂直矩阵。首先就是对图像进行遍历,这里采用的遍历方法是:迭代法。在迭代法中,我们所需要的仅仅是获得begin和end,然后增加迭代直至从begin到end。将*操作符添加在迭代指针前,即可访问当前指向的内容。boundingRect()函数是计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的,其中函数内的参数只能是二维点集,点的序列或向量。