Ptr<BackgroundSubtractorMOG2> bgsubtractor = createBackgroundSubtractorMOG2();
// 用于训练背景的帧数,如果不手动设置learning rate,history就被用于计算当前的learning rate,
// history越大,learning rate越低,背景更新越慢
bgsubtractor->setHistory(500);
// 方差阈值,主要用于判断前景还是背景,值越大,灵敏度越低
// 如果光照变化明显,如阳光下的水面,建议设为25,36
bgsubtractor->setVarThreshold(16);
// 是否检测有影子,开启后会增加算法复杂度
bgsubtractor->setDetectShadows(true);
// 高斯模型个数,默认5个,最多8个
bgsubtractor->setBackgroundRatio(4);
// 高斯背景模型权重和阈值,nmixtures个模型按权重重排序后,
// 只取模型权重累加值大于backgroundRatio的前几个作为背景模型
bgsubtractor->setNMixtures(5);
// 新建高斯模型的方差初始值,默认15
bgsubtractor->setVarInit(15);
// 背景更新时,用于限制高斯模型方差的最大值,默认20
bgsubtractor->setVarMax(20);
// 背景更新时,用于限制高斯模型方差的最小值,默认4
bgsubtractor->setVarMin(4);
// 方差阈值,用于已经存在的匹配的模型,如果不存在则新建一个
bgsubtractor->setVarThresholdGen(100);
PS:实际使用时发现指针实例的算法模型并没有以上的函数去设置这些参数细节(opencv 版本 4.5.2)查阅了opencv的官方在线文档后,发现这些参数在c++版本中均为virtual 的函数方法。实际效果我并没有一一调用尝试,只是修改了指针实例化时可传入的 History,Threshold和shadowDetect 三个参数。实际使用中,感觉把History 参数和 Threshold 调大一些会比默认的参数好一些。
关于实际使用时的目标融入背景问题。参阅了多个国内外关于物品遗留的专利和论文,里面大致都会提到使用帧对比或者快、慢速建模的方法,并提到了用此方法可以避免前景目标融入背景,具体做法专利和论文均没有详细提及,有的只是画了一个简单的流程图,后经我查阅了OPENCV的官方文档和研究MOG2 算法处理的原理,得出只要在一开始对背景建模后,可以用一种方法让MOG2模型的训练停止,从而使其只是作推理计算而不作模型更新的办法,这样前景目标就可以不融入背景。具体方法就是在调用apply函数时,同时传入学习率参数,当训练到某程度时,把学习率设为0即可让模型停止更新。同理,只要把学习率设为1 周可以整体刷新模型让其重新学习。