OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
MultiTrackerの使用

目的

このチュートリアルでは、次のことを学ぶ

  • MultiTrackerオブジェクトを作成する。
  • MultiTrackerオブジェクトを使って複数のオブジェクトを一度に追跡する。

ソースコード

1/*----------------------------------------------
2 * Usage:
3 * example_tracking_multitracker <video_name> [algorithm]
4 *
5 * example:
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 // show help
24 if(argc<2){
25 cout<<
26 " Usage: example_tracking_multitracker <video_name> [algorithm]\n"
27 " examples:\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 // set the default tracking algorithm
35 std::string trackingAlg = "KCF";
36
37 // set the tracking algorithm from parameter
38 if(argc>2)
39 trackingAlg = argv[2];
40
41 // create the tracker
43 legacy::MultiTracker trackers;
45
46 // container of the tracked objects
48 vector<Rect2d> objects;
50
51 // set input video
52 std::string video = argv[1];
53 VideoCapture cap(video);
54
55 Mat frame;
56
57 // get bounding box
58 cap >> frame;
60 vector<Rect> ROIs;
61 selectROIs("tracker",frame,ROIs);
63
64 //quit when the tracked object(s) is not provided
65 if(ROIs.size()<1)
66 return 0;
67
68 // initialize the tracker
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 // do the tracking
81 printf("Start the tracking process, press ESC to quit.\n");
82 for ( ;; ){
83 // get frame from the video
84 cap >> frame;
85
86 // stop the program if no more images
87 if(frame.rows==0 || frame.cols==0)
88 break;
89
90 //update the tracking result
92 trackers.update(frame);
94
96 // draw the tracked object
97 for(unsigned i=0;i<trackers.getObjects().size();i++)
98 rectangle( frame, trackers.getObjects()[i], Scalar( 255, 0, 0 ), 2, 1 );
100
101 // show image with the tracked object
102 imshow("tracker",frame);
103
104 //quit on ESC button
105 if(waitKey(1)==27)break;
106 }
107
108}
Comma-separated Matrix Initializer.
Definition mat.hpp:964
Class for video capturing from video files, image sequences or cameras.
Definition videoio.hpp:790
This class is used to track multiple objects using the specified tracker algorithm.
Definition tracking_legacy.hpp:313
const std::vector< Rect2d > & getObjects() const
Returns a reference to a storage for the tracked objects, each object corresponds to one tracker algo...
bool add(Ptr< cv::legacy::Tracker > newTracker, InputArray image, const Rect2d &boundingBox)
Add a new object to be tracked.
bool update(InputArray image)
Update the current tracking status. The result will be saved in the internal storage.
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
Definition core.hpp:107
STL namespace.

説明

  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オブジェクトの宣言で指定された同じ追跡アルゴリズムを使ってすべてのオブジェクトが追跡される。各追跡オブジェクトに異なるトラッカーアルゴリズムを使いたい場合は、追跡オブジェクトを1つずつ追加し、cv::legacy::MultiTracker::addのバリアントを使ってそれぞれの追跡アルゴリズムを指定する必要がある。

    参照
    cv::legacy::MultiTracker::add( const String& trackerType, const Mat& image, const Rect2d& boundingBox )
  4. 結果の取得

    // draw the tracked object
    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から結果にアクセスできる。