1. 程式人生 > >opencv學習筆記四十:背景消除建模

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