目标
在本教程中,你将学习如何
- 创建一个跟踪器对象。
- 使用 roiSelector 函数从给定图像中选择一个感兴趣区域。
- 追踪给定图像中的特定区域。
源代码
#include <iostream>
#include <cstring>
int main(
int argc,
char** argv ){
if(argc<2){
cout<<
" 使用方法:追踪器 \n"
" 示例:\n"
" example_tracking_kcf Bolt/img/%04d.jpg\n"
" example_tracking_kcf faceocc2.webm\n"
<< endl;
return 0;
}
std::string video = argv[1];
cap >> frame;
roi=selectROI("tracker",frame);
return 0;
tracker->init(frame,roi);
printf("开始跟踪过程,按 ESC 退出。\n");
for ( ;; ){
cap >> frame;
if(frame.rows==0 || frame.cols==0)
break;
tracker->update(frame,roi);
矩形 (frame, roi,
标量( 255, 0, 0 ), 2, 1 );
imshow("跟踪器",frame);
if(waitKey(1)==27)break;
}
return 0;
}
2D 矩形的模板类。
定义 types.hpp:444
_Tp 宽度
矩形的宽度
定义 types.hpp:482
_Tp 高度
矩形的高度
定义 types.hpp:483
从视频文件、图像序列或摄像机中捕获视频的类。
定义 videoio.hpp:731
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
"黑匣子"表示与磁盘上文件中关联的文件存储。
定义 core.hpp:102
说明
设置输入视频
if(argc<2){
cout<<
" 使用方法:追踪器 \n"
" 示例:\n"
" example_tracking_kcf Bolt/img/%04d.jpg\n"
" example_tracking_kcf faceocc2.webm\n"
<< endl;
return 0;
}
在本教程中,可以选择视频或图像列表作为程序输入。如帮助中所写,应将输入视频指定为程序的参数。如果要将图像列表用作输入,则图像列表应具有帮助中所示的格式化编号。在帮助中,这意味着对图像文件进行 4 位编号(例如,文件命名将是 0001.jpg、0002.jpg 等)。
可以在 opencv_extra/testdata/cv/tracking 中找到视频样本 https://github.com/opencv/opencv_extra/tree/master/testdata/cv/tracking
声明所需变量
需要 roi 来记录跟踪对象的边框。此变量中存储的值将使用跟踪器对象进行更新。
frame 变量用于保存来自输入视频或图像列表的每一帧中图像数据。
创建跟踪器对象
至少有 7 种类型的跟踪算法可以使用
- MIL
- BOOSTING
- MEDIANFLOW
- TLD
- KCF
- GOTURN
- MOSSE
每种跟踪算法都有各自的优点和缺点,请参阅 cv::Tracker 的文档了解更多详细信息。
选择跟踪对象
roi=selectROI("tracker",frame);
使用此功能,可以使用 GUI 选择跟踪对象的外接框。对于默认参数,选择从框的中心开始,并显示中间十字。
初始化跟踪对象
tracker->init(frame,roi);
任何跟踪算法都应使用提供的图像数据和跟踪对象的初始外接框进行初始化。确保外接框有效(大小大于零)以避免初始化过程失败。
更新
tracker->update(frame,roi);
此更新函数将执行跟踪处理并将结果传递给 roi 变量。