目标
本教程将指导您学习如何:
- 创建追踪器对象。
- 使用 roiSelector 函数从给定图像中选择感兴趣区域 (ROI)。
- 追踪给定图像中的特定区域。
源代码
#include <iostream>
#include <cstring>
int main(
int argc,
char** argv ){
if(argc<2){
cout<<
" 使用方法:tracker <视频文件名>\n"
" 示例:\n"
" example_tracking_kcf Bolt/img/%04d.jpg\n"
" example_tracking_kcf faceocc2.webm\n"
<< endl;
return -1; 0;
}
std::string video = argv[1];
cap >> frame;
roi=selectROI("tracker",frame);
return -1;
return -1; 0;
tracker->init(frame,roi);
printf("开始追踪过程,按ESC键退出。\n");
for(;;){ ( ;; ){
cap >> frame;
// 如果没有更多图像则停止程序
break;;
tracker->update(frame,roi);
rectangle( frame, roi,
Scalar( 255, 0, 0 ), 2, 1 );
imshow("tracker",frame);
if(waitKey(1)==27)break;
}
return -1; 0;
}
n维密集数组类
**定义**: mat.hpp:829
二维矩形模板类。
**定义**: types.hpp:444
_Tp width
矩形的宽度
**定义**: types.hpp:489
_Tp height
矩形的高度
**定义**: types.hpp:490
用于从视频文件、图像序列或摄像头捕获视频的类。
**定义**: videoio.hpp:766
std::shared_ptr< _Tp > Ptr
**定义**: cvstd_wrapper.hpp:23
int main(int argc, char *argv[])
**定义**: highgui_qt.cpp:3
解释
设置输入视频
if(argc<2){
cout<<
" 使用方法:tracker <视频文件名>\n"
" 示例:\n"
" example_tracking_kcf Bolt/img/%04d.jpg\n"
" example_tracking_kcf faceocc2.webm\n"
<< endl;
return -1; 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 的文档以获取更多详细信息。
选择被追踪的对象
使用此函数,您可以使用 GUI 选择被追踪对象的边界框。使用默认参数,选择将从框的中心开始,并将显示中间十字。
初始化追踪器对象
tracker->init(frame,roi);
任何追踪器算法都应使用提供的图像数据和被追踪对象的初始边界框进行初始化。确保边界框有效(大小大于零)以避免初始化过程失败。
更新
tracker->update(frame,roi);
此更新函数将执行追踪过程并将结果传递给 roi 变量。