OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
没有匹配项
OpenCV 跟踪器简介

目标

在本教程中,你将学习如何

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

源代码

#include <iostream>
#include <cstring>
using namespace std;
using namespace cv;
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;
}
// 声明所有需要的变量
Rect roi;
Mat frame;
// 创建一个跟踪器对象
Ptr<Tracker> tracker = TrackerKCF::create();
// 设置输入视频
std::string video = argv[1];
VideoCapture cap(video);
// 获取边界框
cap >> frame;
roi=selectROI("tracker",frame);
// 如果没有选择感兴趣区域,则退出
if(roi.width==0 || roi.height==0)
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);
// 在 ESC 按钮上退出
if(waitKey(1)==27)break;
}
return 0;
}
n 维密集阵类
定义 mat.hpp:812
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
STL 名称空间。

说明

  1. 设置输入视频

    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

  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 变量。