【发布时间】:2016-10-24 08:01:45
【问题描述】:
这个问题困扰了我很久。基本的车辆计数程序包括: 1. 识别车辆。 2. 按特征跟踪车辆。
但是,如果在时间 t 找到了 #1 车辆,则在 t+1 时程序开始跟踪该车辆,但通过识别过程也可以找到 #1,则 t+2 程序将跟踪两辆车,但实际上帧中只有一个 #1。已识别车辆如何避免重复检测?
提前致谢!
【问题讨论】:
标签: opencv
这个问题困扰了我很久。基本的车辆计数程序包括: 1. 识别车辆。 2. 按特征跟踪车辆。
但是,如果在时间 t 找到了 #1 车辆,则在 t+1 时程序开始跟踪该车辆,但通过识别过程也可以找到 #1,则 t+2 程序将跟踪两辆车,但实际上帧中只有一个 #1。已识别车辆如何避免重复检测?
提前致谢!
【问题讨论】:
标签: opencv
如果我理解正确,您担心检测到您已经在跟踪的对象(缺少检测器/跟踪器通信)。在这种情况下,您可以:
有几种可能的实现方式。
面具。创建一个二进制掩码,其中被跟踪对象附近的区域被“标记”(例如,被跟踪对象附近的区域和其他地方的零)。给定这样的掩码,在特定位置进行检测之前,您可以快速检查那里是否正在跟踪某物,如果您坚持使用 ,则中止检测(预检查方法)或移除检测到的对象后检查方法。
蛮力。计算特定位置与每个跟踪位置之间的距离(您还可以检查重叠区域和其他特征)。然后,您可以丢弃与已跟踪对象太近和/或相似的检测。
让我们考虑哪种方式更好(以及何时)。
Mask 需要 O(N) 次操作将所有被跟踪的对象添加到 mask 和 O(M) 次操作来检查所有感兴趣的位置。这是 O(N + M) = O(max(N, M)),其中 N 是跟踪对象的数量,M 是检查位置的数量(例如,检测到的对象)。哪个数字(N 或 M)更大取决于您的应用程序。还需要额外的内存来保存二进制掩码(通常它不是很重要,但同样取决于应用程序)。
Brute-force 需要 O(N * M) 次操作(每个 M 个位置对 N 个候选者进行检查)。它不需要额外的内存,并允许在检查期间执行更复杂的逻辑。例如,如果对象在一帧内突然改变大小/颜色/任何东西 - 我们可能不应该跟踪它(因为它可能是完全不同的对象,遮挡了原始对象),而是做其他事情。
总结一下:
如果您碰巧需要介于两者之间的东西 - 您必须更有创意,并且以某种方式在掩码中编码对象属性(以实现恒定的查找时间)或使用更复杂的数据结构(以加速“蛮力" 搜索)。
【讨论】: