原理介绍
一些使用场景
实际场景:电梯间检测人,电梯间没人的时候摄像头看到的都是轿箱图片,由于电梯内部光源比较恒定,平时变化部分不大属于背景,当有人进来的时候,当前帧与背景差值,就是新物体,可以做到人体检测。
还可以用到其它的背景画面常态性不变的监控场景。
基本原理图
Background Subtraction基本原理
- BS算法
- 图像分割(GMM-高斯混合模型)
- 机器学习(KNN-K个最近邻),随着时间不断更新背景
相关api
函数api
BackgroundSubtractor; //父类
BackgroundSubtractorMOG2; //基于高斯混合模型
BackgroundSubtractorKNN; //基于机器学习
代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(void)
{
Mat frame;
Mat bsmaskMOG2,bsmaskKNN;
VideoCapture cap;
namedWindow("input video",WINDOW_AUTOSIZE);
namedWindow("MOG2",WINDOW_AUTOSIZE);
namedWindow("KNN",WINDOW_AUTOSIZE);
//创建BSM消除器 基于GMM
Ptr<BackgroundSubtractorMOG2> pMOG2 = createBackgroundSubtractorMOG2();
//创建BSM消除器 基于KNN
Ptr<BackgroundSubtractorKNN> pKNN = createBackgroundSubtractorKNN();
if(!cap.open("/work/opencv_video/vtest.avi"))
{
cout << "video is err" << endl;
return -1;
}
//开操作 掩膜
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
while(true)
{
cap>>frame;
if(frame.empty())
{
break;
}
imshow("input video",frame);
//识别前景
pMOG2->apply(frame,bsmaskMOG2);
pKNN->apply(frame,bsmaskKNN);
//开操作 消除噪点
morphologyEx(bsmaskMOG2,bsmaskMOG2,MORPH_OPEN,kernel);
morphologyEx(bsmaskKNN,bsmaskKNN,MORPH_OPEN,kernel);
//显示结果
imshow("MOG2",bsmaskMOG2);
imshow("KNN",bsmaskKNN);
if(waitKey(100)>0)
break;
}
cap.release();
destroyAllWindows();
return 0;
}
}