OpenCV  4.10.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:812
用于从视频文件、图像序列或摄像机进行视频捕获的类。
定义 videoio.hpp:731
此类用于使用指定的跟踪器算法跟踪多个对象。
定义 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:102
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 中的结果,如代码所示。