定义:
视频通过闪过x帧画面来实现,帧差法就是利用两帧之间的差异找出。也就是移动目标识别
帧差法识别步骤:
1、灰度处理:将多通道变成双通道压缩图像数据。
cpp
cvtColor(before_frame,before_gray,CV_RGB2GRAY);
cvtColor(after_frame,after_gray,CV_RGB2GRAY);
2、侦差计算
cpp
absdiff(before_gray,after_gray,diff_frame);
3、二值化处理:将图片变成黑色和白色两种
cpp
/*
* 25:灰度值在25以上为1,在25以下为0
*/
threshold(diff_frame,diff_frame,25,255,CV_THRESH_BINARY);
4、降噪:去除噪点
开运算:先腐蚀再膨胀,用来消除小物体(图像周边白点)。
关键代码
cpp
// 腐蚀
Mat ele1=getStructuringElement(MORPH_RECT,Size(3,3));
erode(diff_frame,diff_frame,ele1);
// 膨胀
Mat ele2=getStructuringElement(MORPH_RECT,Size(20,20));
dilate(diff_frame,diff_frame,ele2);
闭运算:先膨胀再腐蚀,用于排除小型黑洞(图像内部黑点)。
5、多边拟合:将相邻的点连成一块区域(绘制矩形的坐标)
6、获取坐标点,绘制矩形
cpp
// 5、多边拟合:将相邻的点连成一块区域(绘制矩形的坐标)
// 原始的轮廓点集合
vector<vector<Point>> contours;
// 它能在二值图像diff_frame中检测出物体的轮廓
findContours(diff_frame,contours,CV_RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));
// 创建一个与 contours 大小相同的向量,用于存储每个轮廓的简化多边形表示
vector<vector<Point>> contours_poly(contours.size());
// 创建一个与 contours 大小相同的向量,用于存储每个简化多边形的外接矩形
vector<Rect> boundRect(contours.size());
// 6、获取坐标点,绘制矩形
int x,y,w,h;
int num=contours.size();
for(int i=0;i<num;i++)
{
// 将复杂的轮廓曲线简化为近似的多边形
approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);
// 计算外接矩形
boundRect[i]=boundingRect(Mat(contours_poly[i]));
x=boundRect[i].x;
y=boundRect[i].y;
w=boundRect[i].width;
h=boundRect[i].height;
rectangle(res_frame,Point(x,y),Point(x+w,y+h),Scalar(0,255,0));
}
优点:
开销小,占用内存和CPU算力小,对硬件配置要求不高。
缺点:
检测时对画面要求高,且监测方要固定。