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