【问题标题】:track vehicle trajectory by using opencv使用opencv跟踪车辆轨迹
【发布时间】:2016-10-24 08:01:45
【问题描述】:

这个问题困扰了我很久。基本的车辆计数程序包括: 1. 识别车辆。 2. 按特征跟踪车辆。

但是,如果在时间 t 找到了 #1 车辆,则在 t+1 时程序开始跟踪该车辆,但通过识别过程也可以找到 #1,则 t+2 程序将跟踪两辆车,但实际上帧中只有一个 #1。已识别车辆如何避免重复检测?

提前致谢!

【问题讨论】:

    标签: opencv


    【解决方案1】:

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

    • 预检查 - 在检测期间排除您已经跟踪对象的区域或
    • 后检查 - 丢弃检测到的靠近跟踪对象的对象(如果由于某种原因您的方法无法进行“选择性”检测)

    有几种可能的实现方式。

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

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

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

    1. Mask 需要 O(N) 次操作将所有被跟踪的对象添加到 mask 和 O(M) 次操作来检查所有感兴趣的位置。这是 O(N + M) = O(max(N, M)),其中 N 是跟踪对象的数量,M 是检查位置的数量(例如,检测到的对象)。哪个数字(NM)更大取决于您的应用程序。还需要额外的内存来保存二进制掩码(通常它不是很重要,但同样取决于应用程序)。

    2. Brute-force 需要 O(N * M) 次操作(每个 M 个位置对 N 个候选者进行检查)。它不需要额外的内存,并允许在检查期间执行更复杂的逻辑。例如,如果对象在一帧内突然改变大小/颜色/任何东西 - 我们可能不应该跟踪它(因为它可能是完全不同的对象,遮挡了原始对象),而是做其他事情。

    总结一下:

    1. 当您有很多对象时,Mask 会渐近更好。如果您在检测期间执行滑动窗口搜索之类的操作,这几乎是必不可少的,并且可以排除某些区域(因为在这种情况下,您可能会有很大的 M)。您可能会将其与 Pre-check 一起使用。
    2. 蛮力 当您的对象很少并且需要进行涉及不同属性的检查时是可以的。将它与 Post-check 一起使用是最有意义的。

    如果您碰巧需要介于两者之间的东西 - 您必须更有创意,并且以某种方式在掩码中编码对象属性(以实现恒定的查找时间)或使用更复杂的数据结构(以加速“蛮力" 搜索)。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多