我正在研究跟踪算法,其中最早的步骤之一是背景减法。该算法获得一系列帧,表示具有移动对象和静态背景的视频。对象在每一帧中。
在我的第一个版本的过程中,我计算了所有帧的中值图像,得到了非常好的背景场景近似值。然后我从视频序列中的每一帧中减去结果图像以获得前景(移动物体)。
上述方法运行良好,但后来我尝试使用OpenCV的背景减法器MOG和MOG2替换它。
我不明白这两个类是如何执行“背景模型的预计算”的?据我所知,从几十个教程和文档中,这些减法器每次使用apply()方法并返回前景蒙版时都会更新背景模型。
但这意味着apply()方法的第一个结果将是一个空白掩码。后面的图像中会有初始对象的位置重影(见下面的例子):
我错过了什么?我google了很多,似乎是唯一一个有这个问题的人...有没有办法运行我不知道的后台预计算?
编辑:我发现了一个“技巧”:在使用OpenCV的MOG或MOG2之前,我首先计算中间背景图像,然后在第一次apply()调用中使用它。以下apply()调用产生的前景蒙版没有初始位置重影。
但是,这是应该做的还是有更好的方法?
答案 0 :(得分:2)
如果您的移动物体从一开始就存在,则所有更新背景估算器最初都会将它们放在背景中。解决方案是在所有帧上初始化您的MOG,然后使用此初始化再次运行MOG(与您的中值估计值一样)。根据帧数可能需要调整MOG(learningRate)的更新参数以确保其完全初始化(如果您有100帧,则可能需要更高至少0.01):
void BackgroundSubtractorMOG::operator()(InputArray image, OutputArray fgmask, double **learningRate**=0)
如果您的移动物体从一开始就不存在,请通过为更新参数learningRate设置足够高的值来确保MOG在出现时完全初始化。