OpenCv-C++-视频分析与对象跟踪-背景消除建模

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Daker_Huang/article/details/86479231

背景消除建模有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;
}

运行结果:
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/86479231
今日推荐