好吧,首先,OpenCV VideoSurveillance项目是开始处理您的问题的好方法。
正如您所说,它执行检测响应的数据关联。此外,它通过简单的机制(初始化也基于帧阈值和删除)处理误报(如您所说的 2 个 blob 到 1 个对象)。另一个问题,正如您所提到的,大约 1 个 blob 对应于 2 个对象通常称为遮挡(在 VideoSurveillance 项目中使用了术语“碰撞”,但现在已经过时了)。VideoSurveillance 正在使用基于 3D 颜色直方图建模的粒子过滤器实现来解决这种情况。
简单解释:你如何根据他们的外表(他们的衣服)来区分两个不同的目标?您可以存储他们的颜色直方图并在以后的帧中使用它,对吗?但是,您如何进行搜索?您可以在下一帧中搜索所有可能的质心,或者使用散布在您认为对象所在区域周围的 200 个随机点。这 200 个点就是粒子。它们是如何工作的?他们比较他们所关注的区域并产生物体在那里的概率。距离越近,可能性就越大。最后,您总结所有可能性并找到“平均”质心。
简单来说,就是将每个目标的服装建模在概率函数内部,借助粒子滤波的思想,实现了近乎实时的计算。
最后,卡尔曼滤波器是一个预测器,它仅使用运动数据帮助跟踪器。它“过滤”极端运动行为,以防粒子过滤器结果变得比它应该的更疯狂。VideoSurveillance 也包括这一点。它与外观相得益彰,并且当同时使用两者时,跟踪器会更加复杂。
编辑:它对多目标跟踪有何用处?假设我们有一个带有数据关联的简单跟踪器,假设两个对象即将“碰撞”。跟踪器工作正常,直到对象被合并。在“合并”期间,跟踪器只看到一个对象。另一个丢失了。过了一会儿,它们分裂了,跟踪器将旧对象检测为新对象!我们如何解决这个问题?这次让我们从粒子过滤和外观建模重新开始:
在合并之前,我们有 2 个对象相互靠近。物体是独立的,跟踪器可以清楚地看到它们。在此期间,外观建模器(一种“记住”对象外观的机制)正在学习这两个对象的外观。当然,随着帧的推移,两个对象的外观都略有变化。这就是为什么建模者有一个“学习率”,可以让他随着时间的推移调整他的“记忆”。
在合并过程中,这一次,我们将跟踪器设置得更加耐心,不要像以前那样轻易杀死第二个对象。跟踪器让两个对象都处于活动状态。未遮挡的对象像以前一样被成功跟踪,另一个对象边界框尝试再次重新定位它的目标。如果我们幸运*,在很短的时间后,被遮挡(隐藏)的对象将重新出现(分裂),并且由于粒子,边界框将被吸引到那里。
*如前所述,被遮挡目标的边界框仍由建模者建模。如果被遮挡的人隐藏的时间过长,建模者会忘记旧对象并了解遮挡区域前面的内容(即未遮挡的对象),或者会像孤盒一样四处游荡(这称为漂移)。VideoSurveillance 没有这样的机制。一种简单的解决方案可能是在遮挡期间停止建模器适应。如何?当两个边界框重叠时。