OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
OpenCV追踪器入门

目标

本教程将指导您学习如何:

  • 创建追踪器对象。
  • 使用 roiSelector 函数从给定图像中选择感兴趣区域 (ROI)。
  • 追踪给定图像中的特定区域。

源代码

#include <iostream>
#include <cstring>
using namespace std;
using namespace cv;
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;
}
// 声明所有需要的变量
Rect roi;
Mat frame;
// 创建追踪器对象
Ptr<Tracker> tracker = TrackerKCF::create();
// 设置输入视频
std::string video = argv[1];
VideoCapture cap(video);
// 获取边界框
cap >> frame;
roi=selectROI("tracker",frame);
// 如果未选择ROI则退出
return -1;
return -1; 0;
// 初始化追踪器
tracker->init(frame,roi);
// 执行追踪过程
printf("开始追踪过程,按ESC键退出。\n");
for(;;){ ( ;; ){
// 从视频中获取帧
cap >> frame;
cap >> frame;
// 如果没有更多图像则停止程序
break;;
// 更新追踪结果
tracker->update(frame,roi);
// 绘制被追踪的对象
rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 );
// 显示带有追踪对象的图像
imshow("tracker",frame);
// 按ESC键退出
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
**定义**: core.hpp:107
STL 命名空间。

解释

  1. 设置输入视频

    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

  2. 声明所需的变量

    您需要 roi 来记录被追踪对象的边界框。此变量中存储的值将使用追踪器对象进行更新。

    Rect roi;
    Mat frame;

    frame 变量用于保存来自输入视频或图像列表每一帧的图像数据。

  3. 创建追踪器对象

    Ptr<Tracker> tracker = TrackerKCF::create();

    至少有 7 种类型的追踪器算法可用

    • MIL
    • BOOSTING
    • MEDIANFLOW
    • TLD
    • KCF
    • GOTURN
    • MOSSE

    每种追踪器算法都有其自身的优点和缺点,请参阅 cv::Tracker 的文档以获取更多详细信息。

  4. 选择被追踪的对象

    roi=selectROI("tracker",frame);

    使用此函数,您可以使用 GUI 选择被追踪对象的边界框。使用默认参数,选择将从框的中心开始,并将显示中间十字。

  5. 初始化追踪器对象

    tracker->init(frame,roi);

    任何追踪器算法都应使用提供的图像数据和被追踪对象的初始边界框进行初始化。确保边界框有效(大小大于零)以避免初始化过程失败。

  6. 更新

    tracker->update(frame,roi);

    此更新函数将执行追踪过程并将结果传递给 roi 变量。