OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
使用MultiTracker

目标

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

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

源代码

1/*----------------------------------------------
2 * 用法:
3 * example_tracking_multitracker <video_name> [algorithm]
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 <video_name> [algorithm]\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:829
用于从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:766
此类用于使用指定的跟踪算法跟踪多个对象。
定义 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 中的结果,如代码所示。