OpenCV 4.12.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 <video_name>\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);
// 如果未选择 ROI,则退出
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);
// 绘制跟踪对象
rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 );
// 显示带有跟踪对象的图像
imshow("tracker",frame);
// 按 ESC 按钮退出
if(waitKey(1)==27)break;
}
return 0;
}
n 维密集数组类
定义 mat.hpp:830
2D 矩形的模板类。
定义 types.hpp:444
_Tp width
矩形的宽度
定义 types.hpp:489
_Tp height
矩形的高度
定义 types.hpp:490
用于从视频文件、图像序列或摄像头捕获视频的类。
Definition videoio.hpp:772
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL 命名空间。

说明

  1. 设置输入视频

    if(argc<2){
    cout<<
    " 用法:tracker <video_name>\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 变量。