- 计算机视觉
- 图像处理
- 机器学习
【免费下载链接】opencv_contrib
本教程以 opencv_contrib 仓库 modules/tracking 模块中的官方入门文档 tutorial_introduction_to_tracker.markdown 为核心骨架,配套完整的可运行示例源码 tutorial_introduction_to_tracker.cpp,讲解如何构建一个完整的单目标跟踪程序:从创建跟踪器对象、通过图形界面框选目标,到逐帧更新目标位置并在画面上可视化。读完本篇,你将掌握 OpenCV Tracking API 的基本调用范式,能够独立编写基于视频文件或图像序列输入的单目标跟踪应用,并为后续切换不同跟踪算法(MIL、KCF、CSRT 等)或扩展到多目标跟踪打下基础。
教程目标与整体流程
官方文档开篇明确了本教程的三个学习目标:
- 创建一个跟踪器(Tracker)对象;
- 使用
selectROI函数从给定图像中框选感兴趣区域(ROI); - 对给定图像中的特定区域执行跟踪。
从整个流程看,一个典型的 OpenCV 单目标跟踪程序包含六个步骤:设置输入源(视频或图像序列)→ 声明所需变量(ROI 与帧)→ 创建跟踪器对象 → 图形界面框选目标 → 初始化跟踪器 → 循环调用update逐帧更新。对应示例的完整实现位于 tutorial_introduction_to_tracker.cpp,下文将按照文档原有顺序逐一展开。
设置输入视频:视频文件与图像序列两种模式
示例程序通过命令行参数接收输入源。运行程序时至少需要传入一个参数,否则程序会打印使用说明并退出:
if(argc<2){ cout<< " Usage: tracker <video_name>\n" " examples:\n" " example_tracking_kcf Bolt/img/%04d.jpg\n" " example_tracking_kcf faceocc2.webm\n" << endl; return 0; }两种输入方式如下:
- 视频文件:直接传入视频文件路径,例如
faceocc2.webm,程序内部通过VideoCapture cap(video)(见 tutorial_introduction_to_tracker.cpp)读取; - 图像序列:传入带格式化编号的文件名模板,例如
Bolt/img/%04d.jpg,表示图像文件以 4 位数字递增编号(0001.jpg、0002.jpg……),VideoCapture会按编号顺序自动读取,将其视为连续帧。这也是 OpenCV 视频捕获接口通用的 printf 风格格式约定。
关于测试素材,官方文档说明可以在opencv_extra仓库的testdata/cv/tracking目录下找到视频样例,可用于快速验证程序效果。
声明所需变量:ROI 与帧
在创建跟踪器之前,需要声明两个核心变量:
Rect roi; Mat frame;roi用于记录被跟踪目标的边界框(bounding box)。该变量的值会在跟踪过程中由跟踪器对象持续更新,因此它既是初始化时的输入,也是每一帧跟踪结果的输出;frame用于保存输入视频或图像序列中每一帧的图像数据。
创建跟踪器对象:可用的跟踪算法家族
示例默认创建一个 KCF(Kernelized Correlation Filter,核化相关滤波)跟踪器:
Ptr<Tracker> tracker = TrackerKCF::create();官方文档列出了至少 7 种可用的跟踪算法:MIL、BOOSTING、MEDIANFLOW、TLD、KCF、GOTURN 和 MOSSE。每种算法各有优缺点,适合不同的场景,详细说明可参考cv::Tracker的类文档。
结合当前仓库源码,可以对这些算法做更精准的定位:
- 在 tracking.hpp 中,
TrackerCSRT与TrackerKCF是位于cv::tracking命名空间下的新一代(贡献版)跟踪器,均继承自cv::Tracker,通过静态create()工厂方法构造实例; - 在 tracking_legacy.hpp 中,
TrackerMIL、TrackerBoosting、TrackerMedianFlow、TrackerTLD、TrackerKCF、TrackerMOSSE等位于cv::legacy::tracking命名空间,属于 Legacy Tracking API。它们的实现分别位于 trackerMIL_legacy.cpp、trackerBoosting.cpp、trackerMedianFlow.cpp、tldTracker.cpp、mosseTracker.cpp 等源文件中。
需要说明的是,GOTURN 是基于卷积神经网络的跟踪器,依赖外部训练好的 Caffe 模型(goturn.prototxt与goturn.caffemodel)才能运行,示例 goturnTracker.cpp 展示了其用法;而 KCF、MOSSE 等传统相关滤波类跟踪器则开箱即用。
KCF 跟踪器及其可调参数
从源码看,KCF 的实现基于循环矩阵的性质提升处理速度,并在原始 KCF 论文基础上扩展了 Color-names(CN)颜色特征,参见 tracking.hpp 的注释。TrackerKCF::Params暴露了如下可调参数(定义见 tracking.hpp):
| 参数 | 类型 | 含义 |
|---|---|---|
detect_thresh | float | 检测置信度阈值 |
sigma | float | 高斯核带宽 |
lambda | float | 正则化系数 |
interp_factor | float | 模型自适应线性插值因子 |
output_sigma_factor | float | 与目标大小成比例的空间带宽 |
pca_learning_rate | float | 特征压缩(PCA)学习率 |
resize | bool | 是否启用缩放以提升处理速度 |
split_coeff | bool | 是否将训练系数拆分为两个矩阵 |
wrap_kernel | bool | 是否环绕核值 |
compress_feature | bool | 是否启用 PCA 压缩特征 |
max_patch_size | int | ROI 尺寸阈值 |
compressed_size | int | 压缩后的特征维度 |
desc_pca/desc_npca | int | 压缩 / 非压缩描述子类型(TrackerKCF::MODE枚举) |
上述参数的默认值在 trackerKCF.cpp 的构造函数中给出:detect_thresh = 0.5f、sigma = 0.2f、lambda = 0.0001f、interp_factor = 0.075f、output_sigma_factor = 1/16、resize = true、max_patch_size = 80*80、split_coeff = true、desc_npca = GRAY、desc_pca = CN、compress_feature = true、compressed_size = 2、pca_learning_rate = 0.15f。TrackerKCF::MODE枚举支持GRAY(灰度特征)、CN(颜色名特征)与CUSTOM(自定义特征提取回调)三种模式,见 tracking.hpp。
TrackerKCF::create的实际实现是返回一个TrackerKCFImpl实例(trackerKCF.cpp),内部完成滤波器训练与检测的全部工作。
CSRT 跟踪器(进阶补充)
仓库同样提供了 CSRT(Discriminative Correlation Filter with Channel and Spatial Reliability)跟踪器,其Params包含use_hog、use_color_names、use_gray、use_segmentation、window_function(可选"hann"、"cheb"、"kaiser")、filter_lr、number_of_scales、psr_threshold等众多参数(见 tracking.hpp),默认值见 trackerCSRT.cpp。在精度要求更高、计算资源允许的场景,可将示例中的创建语句替换为Ptr<Tracker> tracker = TrackerCSRT::create();。
选择被跟踪对象:selectROI 图形化框选
读取首帧之后,示例调用selectROI打开一个名为"tracker"的 GUI 窗口,让用户用鼠标框选要跟踪的目标:
roi=selectROI("tracker",frame);- 该函数在显示窗口中用鼠标拖拽绘制矩形,即为目标的初始边界框;
- 默认参数下,框选从矩形中心开始,并显示一个中心十字辅助线;
- 如果用户在框选过程中取消(例如按 ESC 或关闭窗口),返回的
roi宽高为 0,示例随后会直接退出程序:
if(roi.width==0 || roi.height==0) return 0;初始化跟踪器对象
框选得到初始边界框后,需要用当前帧图像和该边界框对跟踪器进行初始化:
tracker->init(frame,roi);根据cv::legacy::Tracker::init的接口说明(见 tracking_legacy.hpp),该方法接收初始帧图像与初始边界框,返回true表示初始化成功。官方文档特别强调:必须确保边界框尺寸大于零(宽度与高度均大于 0),否则初始化过程可能失败。示例程序正是通过此前的roi.width==0 || roi.height==0判断来保证这一点。
循环更新:逐帧跟踪与结果可视化
初始化完成后,程序进入无限循环,反复执行"读取帧 → 更新跟踪 → 绘制结果 → 显示"四个动作:
for ( ;; ){ // get frame from the video cap >> frame; // stop the program if no more images if(frame.rows==0 || frame.cols==0) break; // update the tracking result tracker->update(frame,roi); // draw the tracked object rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 ); // show image with the tracked object imshow("tracker",frame); //quit on ESC button if(waitKey(1)==27)break; }- 读取帧:
cap >> frame从视频或图像序列中取出当前帧;当读取完毕(返回空帧,frame.rows==0 || frame.cols==0)时跳出循环; - 更新跟踪:
tracker->update(frame,roi)执行跟踪过程,将最新估计的目标位置写回roi变量。根据 tracking_legacy.hpp 的接口说明,update返回true表示目标被成功定位,返回false则表示当前帧中无法定位目标——注意这并不一定意味着跟踪失败,目标可能只是暂时离开画面(例如移出视野); - 绘制与显示:
rectangle( frame, roi, Scalar(255,0,0), 2, 1 )用蓝色、线宽 2 的矩形框标注当前目标位置,imshow("tracker", frame)将结果展示在窗口中; - 退出机制:
waitKey(1)每帧等待 1 毫秒并读取键盘输入,按下 ESC(键码 27)即退出循环,结束程序。
从源码结构看内部机制(可选进阶)
对于想深入理解底层原理的读者,官方文档引用 tracking_internals.hpp 说明了传统长期跟踪器的三大内部组件:
- TrackerContribSampler:根据目标最近一次位置在帧上采集候选图像块(patch);
- TrackerContribFeatureSet:管理特征提取器,可接入 HAAR、HOG、LBP、Feature2D 等多种特征;
- TrackerModel:目标的内部外观模型,存储所有候选状态并计算最可能的运动轨迹(由
TrackerTargetState表示候选目标状态)。
其中采样器与特征集由Tracker基类统一实例化,而外观模型是抽象的,需要每种跟踪算法自行实现。这一架构从源码结构看正是 MIL、Boosting 等传统跟踪器的公共设计基础;KCF、CSRT 等新一代跟踪器则采用了各自独立的高效实现,不依赖该组件框架。
编译与运行
该示例属于 opencv_contrib 的 tracking 模块,需要先确保在构建 OpenCV 时启用了opencv_contrib中的 tracking 模块(构建时配置OPENCV_EXTRA_MODULES_PATH指向本仓库的 modules 目录)。编译完成后,按以下方式运行:
# 使用视频文件作为输入 ./tutorial_introduction_to_tracker faceocc2.webm # 使用图像序列作为输入(4 位数字编号) ./tutorial_introduction_to_tracker Bolt/img/%04d.jpg程序启动后会弹出tracker窗口,用鼠标在首帧上框选目标,回车确认后即开始跟踪,跟踪过程中按 ESC 退出。若读者希望在同一数据集上对比多种算法的精度,仓库还提供了 tracker_dataset.cpp 与 benchmark.cpp 等示例;若需同时跟踪多个目标,可参考 tutorial_multitracker.markdown 介绍的多目标跟踪教程。
小结
本文完整还原了 OpenCV Tracking 模块入门教程的六个核心步骤:设置输入、声明变量、创建跟踪器、框选目标、初始化跟踪器、循环更新与可视化。示例代码位于 tutorial_introduction_to_tracker.cpp,其简洁的"创建 → 初始化 → 循环更新"三段式结构是 OpenCV 所有单目标跟踪应用的标准范式。在此框架基础上,读者可以自由替换为 CSRT、MIL、MOSSE 等算法,调整TrackerKCF::Params等参数以获得更优的精度或速度表现,并进一步扩展为多目标跟踪应用。
- 计算机视觉
- 图像处理
- 机器学习
【免费下载链接】opencv_contrib
相关推荐
OpenCV contrib tracking 模块入门:用 OpenCV Tracker API 完成单目标视频跟踪实战
OpenCV contrib tracking 模块入门:用 OpenCV Tracker API 完成单目标视频跟踪实战 本文基于 opencv_contri
计算机视觉图像处理深度学习机器学习用opencv_contrib tracking模块打造强力目标跟踪系统:8种视觉跟踪算法横向对比
用opencv_contrib tracking模块打造强力目标跟踪系统:8种视觉跟踪算法横向对比 opencv_contrib 的 tracking 模块是
计算机视觉图像处理深度学习机器学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考