Opencv 之常用跟踪器汇总
- 总结一下opencv集成的一些跟踪算法:
MIL、CSRT、KCF、GOTURN、Nano、DaSiamRPN,重点!(这些算法需要对opencv、opencv-contrib、cuda联合编译才可以使用) - 其中,关于深度学习跟踪算法所需要的模型文件免费下载链接:https://download.csdn.net/download/yohnyang/92568954
- 多数为单目标跟踪算法,使用时需要给定一个ROI进行初始化跟踪器
- 下边是详细算法介绍
1. 深度学习跟踪器 (Deep Learning Trackers)
1.1 TrackerDaSiamRPN
bash
全称: Distractor-aware Siamese Region Proposal Network
原理: 孪生网络结构 + RPN网络 + 干扰物感知
特点:
高精度,平衡了速度与准确性
专门设计处理相似干扰物
实时性较好(30-50 FPS)
应用: 视频监控、无人机跟踪
1.2 TrackerNano
bash
原理: 轻量级神经网络设计
特点:
专为移动/嵌入式设备优化
参数量少,推理速度快
在资源受限环境下表现优异
应用: 移动设备、边缘计算、IoT设备
1.3 TrackerGOTURN
bash
全称: Generic Object Tracking Using Regression Networks
原理: 基于深度回归网络的离线训练
特点:
不需要在线学习,速度快
对GPU要求不高
但精度通常不如在线学习方法
应用: 实时应用场景
2. 传统/相关滤波跟踪器 (Traditional/CF Trackers)
2.1 TrackerKCF
bash
全称: Kernelized Correlation Filters
特点:
速度极快(100+ FPS)
在简单场景下效果好
开源实现成熟
缺点: 对剧烈形变、遮挡处理不佳
2.2 TrackerCSRT
bash
全称: Channel and Spatial Reliability Tracker
特点:
KCF的改进版本
引入通道和空间可靠性
精度更高,但速度稍慢
应用: 需要高精度的实时应用
2.3 TrackerMIL
bash
全称: Multiple Instance Learning Tracker
特点:
使用正负样本包学习
对目标漂移有一定抵抗能力
相对稳定但速度较慢
3. 使用总结

3.1 OpenCV 使用示例
cpp
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
int main()
{
// 读取视频
std::string path = "test.mp4";
cv::VideoCapture cap(path);
if (!cap.isOpened())
{
printf("cap open failes\n");
exit(-1);
}
//cv::分别尝试不同的跟踪器
cv::Ptr<cv::Tracker> tracker;
try
{
//传统算法
//tracker = cv::TrackerMIL::create();
//tracker = cv::TrackerCSRT::create();
//tracker = cv::TrackerKCF::create();
//深度学习算法
//tracker = cv::TrackerGOTURN::create();
tracker = cv::TrackerNano::create();
//tracker = cv::TrackerDaSiamRPN::create();
}
catch (const std::exception& e)
{
std::cout << "error :" << e.what() << std::endl;
}
cv::Mat frame;
cap >> frame;
cv::Rect2d bbox = cv::selectROI(frame, false);
tracker->init(frame, bbox);
cv::Rect box;
while(true)
{
cap >> frame;
if (frame.empty())
break;
auto t1 = cv::getTickCount();
bool ret = tracker->update(frame, box);
auto t2 = cv::getTickCount();
auto tc = float(t2 - t1) / cv::getTickFrequency() * 1000;
if (ret)
{
cv::rectangle(frame, box, cv::Scalar(255, 0, 0), 2, 1);
cv::putText(frame, cv::format("cost: %.2f ms", tc), cv::Point(8, 18), cv::FONT_HERSHEY_SIMPLEX, 0.6, cv::Scalar(0, 188, 188), 1);
}
cv::imshow("Tracking", frame);
if (cv::waitKey(1) == 27) break;
}
return 0;
}