Opencv集成了BackgroundSubtractorMOG2用于动态目标检测,用到的是基于自适应混合高斯背景建模的背景减除法,相对于BackgroundSubtractorMOG,其具有更好的抗干扰能力,特别是光照变化。
------------------------------------------------------------------------------------------------------------
ps:
BackgroundSubtractorMOG2等一些背景减除法、帧差法仅仅做运动检测,网上经常有人做个运动检测,再找个轮廓,拟合个椭圆就说跟踪了,混淆了概念,凡是没有建立帧与帧之间目标联系的,没有判断目标产生和目标消失的都不能算是跟踪吧。
-----------------------------------------------------------------------------------------------------------
BackgroundSubtractorMOG2具有大量的参数,参数的设置会对运动检测的结果产生极大影响。opencv2版本的BackgroundSubtractorMOG2参数是不可调的,因此MOG2的检测效果往往令人失望,甚至有人认为不如MOG。
在opencv3版本中,BackgroundSubtractorMOG2通过大量的成员函数使得参数可调,相信这一状况可以极大改变。然而对于不想钻研算法的opencv玩家来说,或者像我这种初学opencv又想做出点好玩的效果的人来说,,理解这些参数头都大了,这里结合我的浅见和别人的一些成果,总结了一些参数的意义,仅供参考,误人子弟勿喷!
部分参考自:http://blog.csdn.net/abc20002929/article/details/43247425
1--
BackgroundSubtractorMOG2创建及初始化
Ptr<backgroundsubtractormog2> cv::createBackgroundSubtractorMOG2 (
int history = 500,
double varThreshold = 16,
bool detectShadows = true
</backgroundsubtractormog2>
eg:Ptr<BackgroundSubtractorMOG2> mog = createBackgroundSubtractorMOG2(100,25,false);
-
history:用于训练背景的帧数,默认为500帧,如果不手动设置learningRate,history就被用于计算当前的learningRate,此时history越大,learningRate越小,背景更新越慢;
-
varThreshold:方差阈值,用于判断当前像素是前景还是背景。一般默认16,如果光照变化明显,如阳光下的水面,建议设为25,36,具体去试一下也不是很麻烦,值越大,灵敏度越低;
-
detectShadows:是否检测影子,设为true为检测,false为不检测,检测影子会增加程序时间复杂度,如无特殊要求,建议设为false;
BackgroundSubtractorMOG2运动检测
virtual void cv::BackgroundSubtractor::apply (
InputArray image,
OutputArray fgmask,
double learningRate = -1
eg:mog->apply(src_YCrCb, foreGround, 0.005);
-
image 源图
-
fmask 前景(二值图像)
-
learningRate 学习速率,值为0-1,为0时背景不更新,为1时逐帧更新,默认为-1,即算法自动更新;
BackgroundSubtractorMOG2其他参数
参数设置函数见:
http://docs.opencv.org/3.2.0/d7/d7b/classcv_1_1BackgroundSubtractorMOG2.html
eg:mog->setVarThreshold(20);
部分重要参数介绍
-
nmixtures:高斯模型个数,默认5个,最多8个,一般设为5就好,个人测试:设为8个的时候检测效果提升有限,但程序耗时增加;
-
backgroundRatio:高斯背景模型权重和阈值,nmixtures个模型按权重排序后,只取模型权重累加值大于backgroundRatio的前几个作为背景模型。也就是说如果该值取得非常小,很可能只使用权重最大的高斯模型作为背景(因为仅一个模型权重就大于backgroundRatio了);
-
fVarInit:新建高斯模型的方差初始值,默认15;
-
fVarMax:背景更新过程中,用于限制高斯模型方差的最大值,默认20;
-
fVarMin:背景更新过程中,用于限制高斯模型方差的最小值,默认4;
-
varThresholdGen:方差阈值,用于是否存在匹配的模型,如果不存在则新建一个;
BackgroundSubtractorMOG2运动检测程序参考
#include <stdafx>
#include "opencv2/opencv.hpp"
#include <vector>
using namespace cv;
using namespace std;
const int Train = 100;
int main(int argc, char *argv[])
Ptr<backgroundsubtractormog2> mog = createBackgroundSubtractorMOG2(100, 25, false);
//bgsubtractor->setVarThreshold(20);
Mat foreGround;
Mat backGround;
int trainCounter = 0;
bool dynamicDetect = true;
namedWindow("src");
namedWindow("foreground");
VideoCapture cap(0);//打开默认的摄像头
if (!cap.isOpened())
return -1;
Mat src;
bool stop = false;
while (!stop)
cap >> src;
if (dynamicDetect)
mog->apply(src_YCrCb, foreGround, 0.005);
//图像处理过程
medianBlur(foreGround, foreGround, 3);
dilate(foreGround, foreGround, Mat(), Point(-1, -1), 3);
erode(foreGround, foreGround, Mat(), Point(-1, -1), 6);
dilate(foreGround, foreGround, Mat(), Point(-1, -1), 3);
imshow("foreground", foreGround);
if (trainCounter < Train)//训练期间所得结果为不准确结果,不应作为后续
Mat findc;
foreGround.copyTo(findc);
vector<vector<point>> contours;
cv::findContours(findc, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
//targets.clear();
const int maxArea = 800;
size_t s = contours.size();
for (size_t i = 0; i < s; i++)
double area = abs(contourArea(contours[i]));
if (area > maxArea)
Rect mr = boundingRect(Mat(contours[i]));
rectangle(src, mr, Scalar(0, 0, 255), 2, 8, 0);
//targets.push_back(mr);
//string text;
char text[50];
sprintf_s(text, "background training -%d- ...", trainCounter);
putText(src, text, Point(50, 50), 3, 1, Scalar(0, 255, 255), 2, 8, false);
//delete[] text;
}else
//detects.clear();
Mat findc;
foreGround.copyTo(findc);
vector<vector<point>> contours;
cv::findContours(findc, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
const int maxArea = 500;
size_t s = contours.size();
RNG rng;
for (size_t i = 0; i < s; i++)
double area = abs(contourArea(contours[i]));
if (area > maxArea)
Scalar sca_color = Scalar(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
Rect mr = boundingRect(Mat(contours[i]));
rectangle(src, mr, sca_color, 2, 8, 0);
//可以对动态目标进行相应操作
trainCounter++;
imshow("src", src);
if (waitKey(30) == 27) //Esc键退出
stop = true;
return 0;
</point></point></backgroundsubtractormog2></vector></stdafx>
Opencv集成了BackgroundSubtractorMOG2用于动态目标检测,用到的是基于自适应混合高斯背景建模的背景减除法,相对于BackgroundSubtractorMOG,其具有更好的抗干扰能力,特别是光照变化。-------------------------------------------------------------------------------------
1.
Background
Sub
trac
tor
MOG2
的构造函数
C++:
Background
Sub
trac
tor
MOG2
::
Background
Sub
trac
tor
MOG2
()
采用默认值进行构造
Background
Sub
trac
tor
MOG2
的对象。
混合高斯分布(GMM)是背景建模中的经典算法,自提出至今已经有了很多围绕它改进和应用的论文。
opencv
中(2.4.13版本)也引入了该算法及其改进版本。
首先是基本版本的GMM,
opencv
将其封装为
Background
Sub
trac
tor
MOG,有关该版本算法源码解读及相关论文翻译参考点击打开链接
之后是改进版GMM,
opencv
把它封装为
Background
Sub
trac
tor
MOG2
算法类,源代码位于
opencv
\sources\modules\video\src\bgfg_gaussmix2.
cv::
Background
Sub
trac
tor
MOG2
和cv::bgsegm::
Background
Sub
trac
tor
MOG一样,都是基于高斯混合模型的背景与前景分割算法。
cv::
Background
Sub
trac
tor
MOG2
是对cv::bgsegm::
Background
Sub
trac
tor
MOG的改进,经过改进,它实现了自适应高斯混合模型
参数
的更新,增强了复杂场景背景检测的性能。
具体的算法原理可以参见下面两篇论文:
Zoran Zivkovic and Ferdinand van d
Background
Sub
trac
tor
MOG2
基于自适应混合高斯背景建模,具有一定的抗光照干扰的能力,
参数
配置
如下
Ptr<
Background
Sub
trac
tor
MOG2
> bg
sub
trac
tor
= create
Background
Sub
trac
tor
MOG2
();
// 用于训练背景的帧数,如果不手动设置learning rate,his
tor
y就被用于计算当前的learni...
该方法可以用来做运动检测,用法:
Ptr<
Background
Sub
trac
tor
MOG2
> mog = create
Background
Sub
trac
tor
MOG2
(100,25,false);
his
tor
y:用于训练背景的帧数,默认帧数为500帧,如果不动手设置learingRate,his
tor
y就被用于计算当前的learningRate, 此时his
tor
y越大,learningRate越小,背景更新越慢;
varThreshold:方差阈值,用于判断当前像素是前景还是背景。一般
1. 安装
OpenCV
库,可以通过官网下载安装包或使用包管理器进行安装。
2. 在编译程序时指定
OpenCV
库的路径,可以使用"-I"选项指定头文件路径,"-L"选项指定库文件路径,"-l"选项指定链接的库名。
3. 检查文件或目录名是否正确,可以使用文件管理器或命令行查看文件或目录是否存在。