欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-07 08:47:34
...

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

背景建模(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

上一篇:

下一篇: