首页
登录 | 注册

opencv学习笔记四十:背景消除建模

在很多情况下,我们需要从一段视频中找到感兴趣的目标,比如说当人进入已经打烊的超市时发出警报。为了达到这个目的,我们首先需要“学习”背景模型,然后将背景模型和当前图像进行比较,从而得到前景目标。

背景建模(Background Subtraction)
    背景与前景都是相对的概念,以高速公路为例:有时我们对高速公路上来来往往的汽车感兴趣,这时汽车是前景,而路面以及周围的环境是背景;有时我们仅仅对闯入高速公路的行人感兴趣,这时闯入者是前景,而包括汽车之类的其他东西又成了背景。背景建模的方式很多,或高级或简单。不过各种背景模型都有自己适用的场合,即使是高级的背景模型也不能适用于任何场合。
1.帧差
    帧差可说是最简单的一种背景模型,指定视频中的一幅图像为背景,用当前帧与背景进行比较,根据需要过滤较小的差异,得到的结果就是前景了。OpenCv中为我们提供了一种动态计算阀值,然后用帧差进行前景检测。对于类似无人值守的仓库防盗之类的场合,使用帧差效果估计很好。

2.背景统计模型
    背景统计模型是:对一段时间的背景进行统计,然后计算其统计数据(例如平均值、平均差分、标准差、均值漂移值等等),将统计数据作为背景的方法。

3.高级背景统计模型
    在OpenCv还实现了两种高级的背景统计模型,它们为别是:(1)MOG——高斯混合模型(Mixture Of Gauss);(2)KNN——K近邻;

#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv) { 
	VideoCapture capture;
	capture.open("vtest.avi");
	Mat frame, bsmaskMOG2, bsmasKNN;
	namedWindow("input video", CV_WINDOW_AUTOSIZE);
	namedWindow("MOG2", CV_WINDOW_AUTOSIZE);
	namedWindow("KNN", CV_WINDOW_AUTOSIZE);
	Ptr<BackgroundSubtractor> mog2 = createBackgroundSubtractorMOG2();
	Ptr<BackgroundSubtractor> knn = createBackgroundSubtractorKNN();
	while (capture.read(frame)) {
		imshow("input video", frame);
		mog2->apply(frame, bsmaskMOG2);
		medianBlur(bsmaskMOG2, bsmaskMOG2, 3);
		imshow("MOG2", bsmaskMOG2);
		knn->apply(frame, bsmasKNN);
		medianBlur(bsmasKNN, bsmasKNN, 3);		
		imshow("KNN", bsmasKNN);
		char c = waitKey(100);
		if (c == 27) {
			break;
		}
	}
	capture.release();
	waitKey(0);
	return 0;
}

 

帧差法:

 

#include<opencv2/opencv.hpp>
#include<opencv2/xfeatures2d.hpp>

using namespace cv;
using namespace cv::xfeatures2d;

#include<iostream>
using namespace std;

int main()
{
	VideoCapture capture;
	capture.open("vtest.avi");
	Mat frame,pre,current,result;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(7,7));
	int num = 0;

	while (capture.read(frame))
	{
		imshow("src", frame);
		num++;
		if (num == 1)
		{
			cvtColor(frame, pre, CV_BGR2GRAY);
		}
		if (num > 1 )
		{
			cvtColor(frame, current, CV_BGR2GRAY);
			absdiff(pre, current, result); //To seek difference
			threshold(result, result, 20, 255, THRESH_BINARY);	
			morphologyEx(result, result, MORPH_CLOSE, kernel);
			
			imshow("dst", result);
			int c = waitKey(100);
			if (c == 27)
				break;
			//The current frame is saved as the previous frame for next time
			cvtColor(frame, pre, CV_BGR2GRAY);	
		}
		
	}
	return 0;
}


参考文献:http://www.cnblogs.com/xrwang/archive/2010/02/21/ForegroundDetection.html



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.010 s.
京ICP备10005923号