转载https://blog.csdn.net/m0_37901643/article/details/72841289
Opencv集成了BackgroundSubtractorMOG2用于动态目标检测,用到的是基于自适应混合高斯背景建模的背景减除法,相对于BackgroundSubtractorMOG,其具有更好的抗干扰能力,特别是光照变化。
ps:BackgroundSubtractorMOG2等一些背景减除法、帧差法仅仅做运动检测,网上经常有人做个运动检测,再找个轮廓,拟合个椭圆就说跟踪了,混淆了概念,凡是没有建立帧与帧之间目标联系的,没有判断目标产生和目标消失的都不能算是跟踪吧。
BackgroundSubtractorMOG2具有大量的参数,参数的设置会对运动检测的结果产生极大影响。opencv2版本的BackgroundSubtractorMOG2参数是不可调的,因此MOG2的检测效果往往令人失望,甚至有人认为不如MOG。
在opencv3版本中,BackgroundSubtractorMOG2通过大量的成员函数使得参数可调,相信这一状况可以极大改变。然而对于不想钻研算法的opencv玩家来说,或者像我这种初学opencv又想做出点好玩的效果的人来说,,理解这些参数头都大了,这里结合我的浅见和别人的一些成果,总结了一些参数的意义,仅供参考,误人子弟勿喷!
1-- BackgroundSubtractorMOG2创建及初始化
Ptr<backgroundsubtractormog2> cv::createBackgroundSubtractorMOG2 (
int history = 500,
double varThreshold = 16,
bool detectShadows = true
)
eg:Ptr mog = createBackgroundSubtractorMOG2(100,25,false);
···history:用于训练背景的帧数,默认为500帧,如果不手动设置learningRate,history就被用于计算当前的learningRate,此时history越大,learningRate越小,背景更新越慢;
···varThreshold:方差阈值,用于判断当前像素是前景还是背景。一般默认16,如果光照变化明显,如阳光下的水面,建议设为25,36,具体去试一下也不是很麻烦,值越大,灵敏度越低;
···detectShadows:是否检测影子,设为true为检测,false为不检测,检测影子会增加程序时间复杂度,如无特殊要求,建议设为false;
2-- 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,即算法自动更新;
3-- 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:方差阈值,用于是否存在匹配的模型,如果不存在则新建一个;