OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
使用 MultiTracker

目标

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

  • 创建一个 MultiTracker 对象。
  • 使用 MultiTracker 对象同时跟踪多个对象。

源代码

1/*----------------------------------------------
2 * 用法:
3 * example_tracking_multitracker <视频名称> [算法]
4 *
5 * 例子:
6 * example_tracking_multitracker Bolt/img/%04d.jpg
7 * example_tracking_multitracker faceocc2.webm KCF
8 *--------------------------------------------------*/
9
11#include <opencv2/tracking.hpp>
12#include <opencv2/videoio.hpp>
13#include <opencv2/highgui.hpp>
14#include <iostream>
15#include <cstring>
16#include <ctime>
17#include "samples_utility.hpp"
18
19using namespace std;
20using namespace cv;
21
22int main( int argc, char** argv ){
23 // 显示帮助
24 if(argc<2){
25 cout<<
26 " 用法: example_tracking_multitracker <视频名称> [算法]\n"
27 " 例子:\n"
28 " example_tracking_multitracker Bolt/img/%04d.jpg\n"
29 " example_tracking_multitracker faceocc2.webm MEDIANFLOW\n"
30 << endl;
31 return 0;
32 }
33
34 // 设置默认的跟踪算法
35 std::string trackingAlg = "KCF";
36
37 // 从参数设置跟踪算法
38 if(argc>2)
39 trackingAlg = argv[2];
40
41 // 创建跟踪器
43 legacy::MultiTracker trackers;
45
46 // 跟踪对象的容器
48 vector<Rect2d> objects;
50
51 // 设置输入视频
52 std::string video = argv[1];
53 VideoCapture cap(video);
54
55 Mat frame;
56
57 // 获取边界框
58 cap >> frame;
60 vector<Rect> ROIs;
61 selectROIs("tracker",frame,ROIs);
63
64 //当未提供被跟踪对象时退出
65 if(ROIs.size()<1)
66 return 0;
67
68 // 初始化跟踪器
70 std::vector<Ptr<legacy::Tracker> > algorithms;
71 for (size_t i = 0; i < ROIs.size(); i++)
72 {
73 algorithms.push_back(createTrackerByName_legacy(trackingAlg));
74 objects.push_back(ROIs[i]);
75 }
76
77 trackers.add(algorithms,frame,objects);
79
80 // 开始跟踪
81 printf("开始跟踪过程,按 ESC 键退出。\n");
82 for ( ;; ){
83 // 从视频获取帧
84 cap >> frame;
85
86 // 如果没有更多图像,则停止程序
87 if(frame.rows==0 || frame.cols==0)
88 break;
89
90 //更新跟踪结果
92 trackers.update(frame);
94
96 // 绘制跟踪对象
97 for(unsigned i=0;i<trackers.getObjects().size();i++)
98 rectangle( frame, trackers.getObjects()[i], Scalar( 255, 0, 0 ), 2, 1 );
100
101 // 显示带有跟踪对象的图像
102 imshow("tracker",frame);
103
104 //按 ESC 键退出
105 if(waitKey(1)==27)break;
106 }
107
108}
n 维密集数组类
定义 mat.hpp:830
用于从视频文件、图像序列或摄像头捕获视频的类。
Definition videoio.hpp:772
此类用于使用指定的跟踪器算法跟踪多个对象。
定义 tracking_legacy.hpp:352
const std::vector< Rect2d > & getObjects() const
返回对跟踪对象的存储的引用,每个对象对应于一个跟踪器算法...
bool add(Ptr< cv::legacy::Tracker > newTracker, InputArray image, const Rect2d &boundingBox)
添加要跟踪的新对象。
bool update(InputArray image)
更新当前的跟踪状态。结果将保存在内部存储中。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL 命名空间。

说明

  1. 创建 MultiTracker 对象

    您可以创建 MultiTracker 对象,并对所有被跟踪对象使用相同的跟踪算法,如代码片段所示。 如果您想为每个被跟踪对象使用不同类型的跟踪算法,则每当向 MultiTracker 对象添加新对象时,都应定义跟踪算法。

  2. 选择多个对象

    vector<Rect> ROIs;
    selectROIs("tracker",frame,ROIs);

    您可以使用 selectROI 选择多个对象,结果存储在 cv::Rect2d 向量中,如代码所示。

  3. 将被跟踪对象添加到 MultiTracker

    std::vector<Ptr<legacy::Tracker> > algorithms;
    for (size_t i = 0; i < ROIs.size(); i++)
    {
    algorithms.push_back(createTrackerByName_legacy(trackingAlg));
    objects.push_back(ROIs[i]);
    }
    trackers.add(algorithms,frame,objects);

    您可以一次将所有被跟踪对象添加到 MultiTracker,如代码所示。 在这种情况下,所有对象都将使用 MultiTracker 对象的声明中指定的相同跟踪算法进行跟踪。 如果要为每个被跟踪对象使用不同的跟踪器算法,则应逐个添加被跟踪对象,并使用 cv::legacy::MultiTracker::add 的变体指定它们的跟踪算法。

    另请参见
    cv::legacy::MultiTracker::add( const String& trackerType, const Mat& image, const Rect2d& boundingBox )
  4. 获取结果

    // 绘制跟踪对象
    for(unsigned i=0;i<trackers.getObjects().size();i++)
    rectangle( frame, trackers.getObjects()[i], Scalar( 255, 0, 0 ), 2, 1 );

    您可以从 MultiTracker 类提供的公共变量 cv::legacy::MultiTracker::objects 中访问结果,如代码所示。