基于VS和opencv的烟雾识别
1.1 采用两帧图像差分法进行运动物体的识别
原理:两帧间差分算法是目前运动对象检测中在视频分割中常用的一种方法,即相邻两帧图像差分法,在这里的应用主要是考虑到比较容易获得运动物体(烟雾和非烟雾)的轮廓,对于不运动的物体则不会显示,这样就可以得到需要关注的运动部分,为下一步在此基础上剔除疑似烟雾打下良好的基础,其基本原理是通过计算相邻帧图像中像素点的灰度差计算出运动物体的位置和形状等信息。基于相邻两帧图像差分法的运动目标提取的主要优点:算法实现简单,程序设计复杂度低;易于实现实时监控;光照的适应性强,受目标阴影影响不大。
代码:
Mat MoveDetect(Mat temp, Mat frame)
{
Mat result = frame.clone(); //1.将background和frame转为灰度图
Mat gray1, gray2;
cvtColor(temp, gray1, CV_BGR2GRAY);
cvtColor(frame, gray2, CV_BGR2GRAY);
//2.将background和frame做差
Mat diff;
absdiff(gray1, gray2, diff);
//imshow("diff", diff);
//3.对差值图diff_thresh进行阈值化处理
Mat diff_thresh;
threshold(diff, diff_thresh, 50, 255, CV_THRESH_BINARY);
//imshow("diff_thresh", diff_thresh);
//4.腐蚀
Mat kernel_erode = getStructuringElement(MORPH_RECT, Size(3, 3));
Mat kernel_dilate = getStructuringElement(MORPH_RECT, Size(18, 18));
erode(diff_thresh, diff_thresh, kernel_erode);
//imshow("erode", diff_thresh);
//5.膨胀
dilate(diff_thresh, diff_thresh, kernel_dilate);
//imshow("dilate", diff_thresh);
//6.查找轮廓并绘制轮廓
findContours(diff_thresh, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, Point());
//drawContours(result, contours, -1, Scalar(0, 0, 255), 2);//在result上绘制轮廓
//7.查找正外接矩形
vector<Rect> boundRect(contours.size());
for (int i = 0; i < contours.size(); i++)
{
boundRect[i] = boundingRect(contours[i]);
a1 = 1;
rectangle(result, boundRect[i], Scalar(255, 0, 0), 2);
//在result上绘制正外接矩形
}
//if (contours.size() != 0) { a1 = 1; }
//else { a1 = 0; }
imshow("Binary", result);
return result;//返回result
}
- 2 在运动物体识别的基础上进行烟雾的传统颜色RGB模型的判断
原理:人眼所能接受的可见光的波长红,绿,蓝 3 色一样,每一个像素的颜色是由 3 个颜色通道所组成,RGB 颜色系统可以让视频检测中分析图像像素各个分量颜色值。烟雾像素点的R、G、B三个颜色分量值相差无几。在运动物体的标记框内进行烟雾的识别,更加有利于提高判断是真实烟雾的可能性。因此判断条件为:
C(min)=min(R,G,B) 条件1
C(max)=max(R,G,B) 条件2
I=(R,G,B)/3 条件3
给出以下三个规则:
|C(max)-C(min)|<T 规则1
L1<I<L2 规则2
D1<I<D2 规则3
判断条件为: