OpenCV背景扣除:如何预先计算背景模型?

Ale*_* B. 6 opencv computer-vision background-subtraction

我正在研究一种跟踪算法,它所做的最早的步骤之一就是背景扣除。该算法获取一系列代表具有移动对象和静态背景的视频的帧。该对象存在于每一帧中。

在这个过程的第一个版本中,我计算了所有帧的中值图像,并获得了非常好的背景场景近似值。然后我从视频序列中的每一帧中减去生成的图像以获得前景(移动物体)。

上面的方法效果很好,但后来我尝试用OpenCV的背景减法器MOG和MOG2来代替它。

我不明白的是这两个类如何执行“后台模型的预计算”?据我从数十个教程和文档中了解到,每次我使用 apply() 方法并返回前景蒙版时,这些减法器都会更新背景模型。

但这意味着 apply() 方法的第一个结果将是一个空白掩码。后面的图像将具有初始对象的位置重影(参见下面的示例):

我缺少什么?我用谷歌搜索了很多,似乎是唯一一个遇到这个问题的人......有没有一种方法可以运行我不知道的后台预计算?

编辑:我发现了一个“技巧”来做到这一点:在使用 OpenCV 的 MOG 或 MOG2 之前,我首先计算中值背景图像,然后在第一次 apply() 调用中使用它。以下 apply() 调用生成没有初始位置重影的前景蒙版。

但是,这是应该这样做还是有更好的方法?

Rev*_*ohn 3

如果您的移动对象从一开始就存在,则所有更新的背景估计器最初都会将它们放置在背景中。解决方案是在所有帧上初始化 MOG,然后通过此初始化再次运行 MOG(与中值估计一样)。根据帧数,您可能需要调整 MOG (learningRate) 的更新参数,以确保其完全初始化(如果您有 100 帧,则可能需要至少提高 0.01):

void BackgroundSubtractorMOG::operator()(InputArray image, OutputArray fgmask, double **learningRate**=0)
Run Code Online (Sandbox Code Playgroud)

如果您的移动对象从一开始就不存在,请通过为更新参数learningRate 设置足够高的值来确保 MOG 在它们出现时完全初始化。