opencv (opencv_contrib) 实现目标跟踪
前提
需要安装 opencv 和 opencv_contrib。
请参考文章:linux 下 opencv_contrib 源代码编译方法
为什么需要跟踪?
通常跟踪比检测快
单目标检测速度可能为 100+ ms,而单目标跟踪的速度为 10+ ms。
目标跟踪可以基于前一帧检测的位置,运动方向,速度预测下一帧的位置。并围绕预期位置进行小范围搜索以准确定位物体。
比无依赖直接进行检测会快很多。
一个高效的系统应该通常会在 n 帧的第一帧进行使用检测算法进行目标检测,此后 n - 1 帧使用跟踪算法。
为什么不基于第一次检测结果的基础上,后续全部使用跟踪算法?
因为跟踪在遇到遮挡,运动方向和速度高速变化以致于跟踪算法跟不上时,可能会导致跟踪失败。
而且跟踪在一定程度上会有误差参数,误差一直积累下去时,会导致跟踪偏离原始目标。
所以需要检测算法对目标进行修正,一定程度上避免跟踪误差的积累。
当检测失败时,跟踪可以提供帮助
检测在目标被遮挡时,会检测失败。
而一个好的跟踪算法,还能依靠前面帧的位置,方向,速度信息,预测当前的目标。
一定程度上解决一些遮挡问题、
目标跟踪
opencv (opencv_contrib 模块) 目前支持 8 种跟踪算法。
跟踪算法 | opencv 支持的最低版本 | 说明 |
---|---|---|
Boosting | opencv 3.0.0 | 比较古老的目标跟踪算法,速度慢 |
MIL | opencv 3.0.0 | 速度快,但是失败率较高 |
KCF | opencv 3.1.0 | 比 Boosting 和 MIL 快,但是遮挡情况下效果差 |
TLD | opencv 3.0.0 | (TLD 目前有 3 种版本算法。TLD 1.0,TLD 2.0,TLD 3.0。opencv 的 TLD 跟踪效果较差,怀疑是基于 TLD 1.0 算法实现的) |
MedianFlow | opencv 3.0.0 | 跟踪效果较好,但对于快速移动/跳动的物体容易失败。 |
GOTURN | opencv 3.2.0 | 基于深度学习的目标检测器。需要额外的 GOTURN 模型,可以自行训练目标跟踪模型。 |
MOSSE | opencv 3.4.1 | 速度比其它算法快,但是准确率比 CSRT 和 KCF 低。 |
CSRT | opencv 3.4.2 | 准确率比 KCF 稍高,但速度不如 KCF。 |
建议:
- CSRT:如果可以接受较慢速度下,追求高准确度。
- KCF:速度要求稍高,准确度要求不高。
- MOSSE:只要求高速,不要