使用opencv跟踪车辆轨迹

时间:2016-10-23 21:02:18

标签: opencv

这个问题困扰了我很长一段时间。基本车辆计数程序包括:1。识别车辆。 2.按功能跟踪车辆。

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

  • 预检 - 在检测过程中排除您已跟踪对象的区域或
  • 检查后 - 丢弃接近被跟踪对象的检测到的对象(如果"选择性"由于某种原因无法检测您的方法)

有几种可能的实施方式。

  1. <强>面膜即可。创建一个二进制掩码,其中跟踪对象附近的区域被标记为&#34; (例如,跟踪对象附近和其他地方的零)。给定这样的掩码,在特定位置检测之前,您可以快速检查是否在那里跟踪某些内容,并中止检测(预检方法)或删除检测到的对象,如果您坚持使用检查后方法。

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

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

    1. 掩码需要O( N )操作才能将所有跟踪对象添加到掩码中并执行O( M )操作以进行检查所有感兴趣的地点。那个O( N + M )= O(最大( N M )),其中 N 是跟踪对象的数量, M 是已检查位置的数量(例如,检测到的对象)。哪个号码( N M )会更大取决于您的应用。保存二进制掩码也需要额外的内存(通常它不是很重要,但同样取决于应用程序)。

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

    3. 总结一下:

        当你拥有大量物品时,
      1. 面具会渐渐变得更好。如果您在检测期间执行类似滑动窗口搜索的操作,并且可以排除某些区域(因为在这种情况下您可能会有一个很大的 M ),这几乎是必不可少的。您可能会将其用于预先检查
      2. Brute-force 在您拥有少量对象并且需要执行涉及不同属性的检查时是可以的。使用后检查
      3. 最有意义

        如果您碰巧需要介于两者之间 - 您必须更具创造性,并以某种方式在掩码中编码对象属性(以实现持续的查找时间)或使用更复杂的数据结构(以加快&# 34;蛮力&#34;搜索)。