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;
}

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

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82720908