OpenCV之目标追踪
1.目标追踪
目标追踪(Object Tracking)是指在视频序列中持续追踪目标的位置,这是计算机视觉中的核心难点,其核心挑战包括遮挡、光照变化和快速运动。在视频分析、自动驾驶、智能监控、人机交互等领域中应用广泛。
1.按任务类型分类
- 单目标追踪(SOT, Single Object Tracking):只追踪一个初始帧中给定的目标,典型方法如:
- Siamese-based Tracking(孪生网络)
- Transformer-based Tracking
- 多目标追踪(MOT, Multi-Object Tracking):同时追踪多个目标,通常包括目标检测与数据关联两个阶段,典型方法如:
- 基于检测的跟踪(Tracking-by-Detection)
- 端到端方法
- 多摄像头追踪(MTMC, Multi-Camera Multi-Object Tracking):跨视角数据关联,更复杂的特征匹配,常结合ReID、时空建模、图神经网络等
2.传统目标追踪算法
除了基于深度学习的追踪算法,还有依赖传统的机器学习的目标追踪算法,它们适用于某些轻量级、实时或资源受限的场景(如嵌入式设备)。
OpenCV中常用的目标追踪算法:
- Boosting Tracker
• 原理:使用在线Boosting分类器,从背景中区分出目标
• 优点:适应性强,适合光照变化的情况
• 缺点:对遮挡敏感,易漂移 - MIL (Multiple Instance Learning) Tracker
• 原理:目标不是单个样本表示,而是多个候选区域的集合;只要集合中包含目标就算正例
• 优点:缓解标签不确定问题,增强鲁棒性
• 缺点:对遮挡还是不太稳,精度一般 - KCF (Kernelized Correlation Filter)
• 原理:使用核技巧加速的相关滤波器,训练和测试都在频域完成
• 优点:非常快,速度极高(可达上百帧/秒),适合实时追踪
• 缺点:对尺度变化、遮挡、快速运动敏感 - TLD (Tracking-Learning-Detection)
• 原理:将追踪、检测、学习分成三个模块协同工作。追踪失败时,检测器会重新识别目标
• 优点:鲁棒性强,能处理遮挡后的恢复
• 缺点:复杂度高,速度慢,容易累积错误 - MedianFlow
• 原理:跟踪局部块(点),计算前后帧之间的点的光流;中位数流用于稳定估计
• 优点:平滑、稳定,适合小运动
• 缺点:对快速运动、遮挡很不鲁棒;会直接失败而不是漂移 - MOSSE (Minimum Output Sum of Squared Error Filter)
• 原理:训练一个滤波器,使得卷积后的响应图和期望响应(高斯峰)最接近
• 优点:非常快(轻量、实时);对照明变化有一定鲁棒性
• 缺点:定位不够准,易受背景干扰 - CSRT (Discriminative Correlation Filter with Channel and Spatial Reliability)
• 原理:在KCF基础上改进,引入通道可靠性和空间可靠性来增强鲁棒性
• 优点:比KCF更准确,适合尺度变化、部分遮挡
• 缺点:比KCF慢,实时性稍差
3.OpenCV目标追踪
下面是一个可以在视频中实时添加跟踪目标的代码示例:
1.支持算法
1 | def get_tracker(name): |
2.主函数
1 | def tracking(video_path, tracker_type="kcf"): |
3.调用
1 | multi_object_tracking.tracking("videos/soccer_01.mp4", "medianflow") |
按s键,框出需要追踪的区域,再按任意键继续
4.DNN+Dlib的实时视频追踪
下面是一个先检测再追踪的代码示例:
1.单个目标追踪
dlib.correlation_tracker
是 Dlib
库中基于相关滤波(correlation filter)算法的目标追踪器,可以用来在视频中持续追踪一个物体。
它属于 单目标追踪器(Single Object Tracker),不是检测器,不会识别物体类型,只能追踪一开始指定的区域。
实现原理:
利用初始帧中的目标图像作为“模板”,在后续每一帧中,通过相关匹配来寻找与这个模板最相似的区域,更新模板以适应外观的小变化。
1 | def start_tracker(box, label, rgb, inputQueue, outputQueue): |
多进程的好处是:多个对象可以并行追踪,不会互相影响,CPU 利用率高
2.主函数
1 | # 类别定义 用于检测输出中的label索引对应类别名 |
3.调用
1 | multi_object_tracking_fast.tracking("videos/race.mp4", |
主要功能点:
- 用 OpenCV 的 DNN 模块加载 Caffe 模型检测“person”
- 每个目标分配一个子进程进行独立追踪
- 利用 multiprocessing 提升处理性能
- 使用 FPS 类打印处理速度
5.总结
方法类型 | 优势 | 局限 | 适用场景 |
---|---|---|---|
传统算法 | 轻量、高速,适合嵌入式设备 | 对复杂变化(遮挡、尺度)敏感 | 实时监控、资源受限环境 |
深度学习+Dlib | 高精度,支持多目标并行 | 计算资源要求较高 | 复杂场景(如人流密集、遮挡频繁) |
端到端模型 | 检测与追踪联合优化,简化流程 | 需大量标注数据,训练成本高 | 高精度需求(如自动驾驶) |
6.备注
环境
- mac: 15.2
- python: 3.12.4
- numpy: 1.26.4
- opencv-python: 4.11.0.86
- dlib: 19.24.6
资源和代码
https://github.com/keychankc/dl_code_for_blog/tree/main/009_opencv_tracking