【问题标题】:OpenCV background subtraction: How to precompute background model?OpenCV背景减法:如何预先计算背景模型?
【发布时间】:2014-05-22 12:25:20
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 你不是唯一一个遇到这个问题的人 :-)

标签: opencv computer-vision background-subtraction


【解决方案1】:

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

void BackgroundSubtractorMOG::operator()(InputArray image, OutputArray fgmask, double **learningRate**=0)

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

【讨论】:

  • 感谢您的回复!我会立即对此进行测试并发表评论。
  • 你是对的 - 学习率用于初始化减法器。然而,调整学习率以获得好的结果似乎是一项艰巨的工作——尤其是如果你想自动化它。如果我将学习率设置为 1/n(n 是序列中的帧数),我会得到与使用我单独预先计算的中值图像类似的结果。所以根本没有改善。无论如何,谢谢你的回答,我接受了。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2016-06-19
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多