一、检测方式
1.1 传统方式
- 基于颜色空间
- RGB
- HSV
- YCbCr
- 基于纹理
- 高斯混合模型
- 基于视频流的帧差法
1.2 机器学习
- 支持向量机
- 随即森林
- 决策树
1.3 深度学习
- 分类网络
- mobileNet
- squeezeNet
- VGG16
- AlexNet
- 目标检测
- yolo
- Fast-RCNN
- 语义分割
- FCN
- UNet
- SegNet
- DeepLab
二、检测方式介绍
由于时间有限,在这会主讲基于颜色空间的传统方式及深度学习方式。还有日后我研一论文的实现细节,现在暂时不做叙述。关注我别迷失哦
2.1 基于YCbCr颜色空间的火焰检测
1、实验环境
import cv2
import numpy as np
2、公式介绍
3、正常情况下我们通过opencv得到的是一张基于BGR颜色空间的图片。因此,我们第一步是将BGR图片转换成YCbCr颜色空间的图片。代码如下:
def BGRToYCbCr(image):
"""
颜色空间转换
:param image: 图像
:return:
"""
image_B, image_G, image_R = cv2.split(image)
y = np.array(0.2568 * image_R + 0.5041 * image_G + 0.0979 * image_B, dtype=np.uint8) + 16
cb = np.array(-0.1482 * image_R - 0.2910 * image_G + 0.4392 * image_B, dtype=np.uint8) + 128
cr = np.array(0.4392 * image_R - 0.3678 * image_G - 0.0714 * image_B, dtype=np.uint8) + 128
return y, cb, cr
4、第二步就是完成对论文中火焰区域的限制条件,也就是论文中所列公式的代码编写。
代码如下:注:X_decay为X的衰减系数是本人额外添加的。
具体公式以后再详细介绍
def detectFireByYCbCr(Y, Cb, Cr, Y_decay=1.15, Cb_decay=0.75, Cr_decay=1.15, threshold=40):
"""
通过YCbCr颜色空间进行火焰识别,为Y, Cb, Cr添加对应的权值衰减
"""
rows, cols = Y.shape
# 像素的个数
numPixs = rows * cols
zeros = np.zeros((rows, cols))
ones = np.ones((rows, cols))
# 等式3
YgtCb = np.where(Y > Cb, ones, zeros)
# 等式4
CrgtCb = np.where(Cr > Cb, ones, zeros)
# 等式5
Y_mean = cv2.integral(Y)[-1, -1] / numPixs * Y_decay
Cb_mean = cv2.integral(Cb)[-1, -1] / numPixs * Cb_decay
Cr_mean = cv2.integral(Cr)[-1, -1] / numPixs * Cr_decay
F = np.where(Y > Y_mean, np.where(Cb < Cb_mean, np.where(Cr > Cr_mean, ones, zeros), zeros), zeros)
# 等式6
Ft = np.where(np.abs(Cb - Cr) > threshold, ones, zeros)
return YgtCb * CrgtCb * F * Ft
3、实验结果