具有自适应背景的OpenCV前景检测,静态对象也是如此

时间:2019-04-25 19:25:28

标签: opencv emgucv foreground background-subtraction mog

我有一个平整表面的背景图像。 我的目标是跟踪在表面上定位/移动的对象。

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

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

如何提高耐光性?


更新

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

我以这种方式使用MOG2:

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

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

Foreground detection with adaptive background

存在一些缺点,例如,当光线变化时,对象蒙版(“蒙版blob”)保持以前的亮度,如果差异太大,则可以检测为新对象。

Drawbacks

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

我的想法是尝试根据光线变化来适应“遮罩斑点”以更改其亮度。我该如何使用OpenCV获得此信息?


解决先前的缺陷

使用inpaint功能可以简单地遮罩BGK(步骤3),我可以使“遮罩斑点”与背景亮度变化保持同步。 此修复程序也有缺点,不是很出色。


更新2

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

  1. 使用分割功能获取V通道
  2. 计算通道V的平均值
  3. 使用平均值将阈值截断到V通道
  4. 使用新的V通道重建框架

1 个答案:

答案 0 :(得分:0)

我在实现速度估计算法时遇到类似的问题,希望我的解决方案对您有所帮助。

我尝试的一种方法是“累积差异图像”(基本上是您对MOG2所做的操作),但是当背景更新时,它无法跟踪静止的对象。当我不更新背景时,我会遇到与您相同的问题。

因此,我决定使用RGB / HSV阈值处理。我设置了道路颜色的边界(让我们说灰色),并创建了二进制图像,其中道路颜色的所有内容均为黑色(0),其他所有内容均为白色(1)。 Here是有关HSV阈值的不错的教程。选择边界时,您可以确认照明系数设置,我们说明亮照明的上限,黑暗照明的下限。但是,该方法可能会导致算法看不到颜色类似于背景的对象。另一个缺点是背景应该统一,没有任何细节。

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

祝你好运!