【问题标题】:OpenCV foreground detection with adaptive background, static objects too具有自适应背景、静态对象的 OpenCV 前景检测
【发布时间】:2019-09-15 07:18:15
【问题描述】:

我有一张普通表面的背景图片。 我的目标是跟踪在表面上定位/移动的对象。

我正在使用 MOG2 查找学习率为 0 的前景对象,因此不会更新背景(否则会在背景中合并静态对象)。

结果很好,但是我对光线有一个很大的问题:如果在获取背景后光线发生变化,则会将各种伪影检测为前景对象。

如何提高对光照的鲁棒性?


更新

我正在试验一种效果很好的解决方案,但它需要一些修复。

我正在以这种方式使用 MOG2:

  1. 使用第一帧 (BGK) 获取和学习背景
  2. 将 MOG2 应用于当前帧,学习率为 0(不更新)并获得前景蒙版 (FG_MASK)
  3. 对于接下来的帧,我使用 FG_MASK 来屏蔽 BGK,并使用结果以一定的学习率应用到 MOG2(这会更新背景)。
  4. 之后,我将使用 MOG2 算法更新 BGK。

通过这种方式,对象被遮挡在背景之外,并且背景仍在更新。这可以保证对光线变化的良好鲁棒性。

有一些缺点,例如在光线变化时,物体遮罩(“遮罩斑点”)保持之前的亮度,如果差异太大,可以检测为新物体。

在上图中,您可以看到当前帧更亮,而静态对象的蒙版更暗。

我的想法是尝试根据光线变化调整“遮罩斑点”来改变其亮度。我怎样才能用 OpenCV 得到这个?


修复之前的缺点

使用inpaint 函数来简单地屏蔽 BGK(步骤 3),我可以使“遮罩斑点”与背景亮度变化保持同步。 这个修复也有缺点,性能不是很好。


更新 2

我认为这是一个有趣的话题,所以我会不断更新。 修复功能很慢,所以我正在尝试另一种方式。 使用 Hsv 颜色空间可以让您管理亮度通道,我可以通过这种方式减少亮度的影响:

  1. 使用Split函数获取V通道
  2. 计算通道 V 的平均值
  3. 使用平均值对 V 通道应用阈值截断
  4. 使用新的 V 通道重建框架

【问题讨论】:

    标签: opencv emgucv foreground background-subtraction mog


    【解决方案1】:

    我在实现速度估计算法时遇到了类似的问题,希望我的解决方案可以帮助到你。

    我尝试的一种方法是累积差异图像(基本上是您对 MOG2 所做的),但是当背景更新时它无法跟踪静止物体。当我没有更新背景时,我遇到了和你一样的问题。

    所以,我决定使用 RGB/HSV 阈值。我设置了道路颜色的边界(比如说灰色),并创建了二值图像,其中道路颜色的所有颜色都是黑色(0),其他颜色都是白色(1)。 Here 是一个很好的关于 HSV 阈值的教程。选择边界时,您可以确认照明系数设置,让我们说明亮照明的上限和黑暗的下限。但是,这种方法可能会导致算法看不到与背景颜色相似的物体。另一个缺点是背景应该是统一的,没有任何细节。

    您可以尝试的另一种方法是将输入图像和背景都转换为灰度,然后手动减去。这将使您有机会调整与背景差异的阈值水平。假设在黑暗条件下值为 120 的背景在明亮条件下将有 140,因此差异为 20。对于对象像素可能让我们说值为 180,背景值为 120,因此差异为 60。为差异设置阈值 20并将低于 20 的值设置为 0,将高于 20 的值设置为 1,这应该可以解决问题(所有值都在 0 到 255 的范围内)。

    祝你好运!

    【讨论】:

    • 谢谢回复,我的问题是背景不统一,可能是一些物体已经存在,我只需要跟踪新的物体。
    • 我用一个我正在实施的新解决方案的例子更新了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2019-07-25
    • 2016-07-20
    • 2023-03-30
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多