2016-10-23 90 views
0

这个问题困扰了我很长一段时间。基本车辆计数程序包括:1.识别车辆。 2.通过功能跟踪车辆。然而,如果在时间t发现车辆#1,则在t + 1时程序开始追踪车辆,但是#1也可以通过识别过程找到,然后t + 2程序将两个车辆跟踪,但实际上只是框架中的一个#1。公认的车辆如何避免重复检测?使用opencv跟踪车辆轨迹

在此先感谢!

回答

1

如果我理解正确,则担心检测到您已跟踪的对象(缺少检测器/跟踪器通信)。在这种情况下,您可以:

  • 前检查 - 检测过程中排除的区域,在那里你已经跟踪物体或
  • 后的检查 - 丢弃检测对象,是附近跟踪者(如果出于某种原因您的方法无法进行“选择性”检测)

有几种可能的实现方式。

  1. 面膜。创建一个二进制掩码,其中靠近被跟踪对象的区域被“标记”(例如,在跟踪对象附近的区域和其他地方的零区域)。给定这样一个掩码,在检测到特定位置之前,您可以快速检查是否有某个事件正在被跟踪,并放弃检测(预检方法)或删除检测到的对象,如果坚持使用后检查的方法。

  2. 蛮力。计算特定位置与每个跟踪位置之间的距离(您也可以检查重叠区域和其他特征)。然后,您可以丢弃与已经跟踪的对象太接近和/或类似的检测。

让我们考虑哪种方式更好(以及何时)。

  1. 面膜需要O(ñ)操作所有跟踪的对象添加到面具和O(中号)操作来检查所有感兴趣的位置。这是O(Ñ + 中号)= O(MAX(Ñ中号)),其中Ñ跟踪对象的数量,M是检查位置(检测到的物体,例如数)。哪个号码(NM)将取决于您的应用程序。额外的内存也需要保存二进制掩码(通常它不是很重要,但它又取决于应用程序)。

  2. 蛮力需要O(Ñ * 中号)操作(每种中号位置抵靠Ñ候选选中)。它不需要额外的内存,并允许在检查过程中执行更复杂的逻辑。例如,如果对象在一帧内突然改变大小/颜色/任何内容 - 我们可能不应该跟踪它(因为它可能是一个完全不同的遮挡原始对象的对象),而是执行其他操作。

综上所述:

  1. 面膜是渐近更好,当你有很多的对象。如果在检测过程中进行滑动窗口搜索等操作几乎是必不可少的,并且可以排除某些区域(因为在这种情况下,您可能会有很大的空间)。您可能会使用预检
  2. 蛮力是确定的,当你有几个对象,需要做涉及不同属性的检查。使用后检查是最有意义的。

如果您正好需要的东西其间的 - 你必须在面膜更有创意,要么编码对象属性不知何故(达到恒定的查找时间),或使用更复杂的数据结构(加快“蛮力“搜索)。