OpenCv-C++-视频分析与对象跟踪-背景消除建模
背景消除建模有2种方式:
1、MOG2------高斯混合模型
2、kNN---------k最近邻
在OpenCv中也有相关的API:
1、createBackgroundSubtractorMOG2(int history=500, double varThreshold=16,bool detectShadows=true);
2、createBackgroundSubtractorKNN(int history=500, double dist2Threshold=400.0, bool detectShadows=true);
history:层次,长度
varThreshold:像素和模型之间欧式距离的阈值。
detectShadows:默认为true,检测阴影并标记它们(影子会被标记为灰色), 但会降低部分速度。
代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
VideoCapture capture;
capture.open("D:/test/video_004.avi");
if (!capture.isOpened())
{
cout << "未找到视频文件!" << endl;
return -1;
}
//使用高斯混合模型
Ptr<BackgroundSubtractor> bsmKNN = createBackgroundSubtractorKNN();
//使用kNN模型
Ptr<BackgroundSubtractor> bsmMOG2 = createBackgroundSubtractorMOG2();
Mat frame, mog2,knn;
//定义开操作的结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
while (capture.read(frame))
{
imshow("input video", frame);
//MOG2背景消除
bsmMOG2->apply(frame, mog2);
//开操作
morphologyEx(mog2, mog2, MORPH_OPEN, kernel, Point(-1, -1), 1);
//erode(mog2, mog2, kernel, Point(-1, -1), 1);//腐蚀操作
imshow("outputMOG video", mog2);
bsmKNN->apply(frame, knn);
//开操作
morphologyEx(knn, knn, MORPH_OPEN, kernel, Point(-1, -1), 1);
//knn背景消除
imshow("outputKNN video", knn);
char c = waitKey(70);
if(c==27)
{
break;
}
}
capture.release();//释放内存
waitKey(0);
return 0;
}
运行结果: