OpenCV 4.5.3(日本語機械翻訳)
tracking_by_matching.hpp
1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
4
5 #ifndef __OPENCV_TRACKING_TRACKING_BY_MATCHING_HPP__
6 #define __OPENCV_TRACKING_TRACKING_BY_MATCHING_HPP__
7
8 #include <deque>
9 #include <iostream>
10 #include <string>
11 #include <unordered_map>
12 #include <vector>
13 #include <memory>
14 #include <map>
15 #include <tuple>
16 #include <set>
17
18 #include "opencv2/core.hpp"
19 #include "opencv2/imgproc.hpp"
20
21
22 namespace cv {
23 namespace detail {
24 inline namespace tracking {
25
28
29 namespace tbm { //Tracking-by-Matching
33 struct CV_EXPORTS TrackedObject {
35 double confidence;
38 uint64_t timestamp;
39
44 : confidence(-1),
45 frame_idx(-1),
46 object_id(-1),
47 timestamp(0) {}
48
56 TrackedObject(const cv::Rect &rect, float confidence, int frame_idx,
57 int object_id)
58 : rect(rect),
59 confidence(confidence),
60 frame_idx(frame_idx),
61 object_id(object_id),
62 timestamp(0) {}
63};
64
65 using TrackedObjects = std::deque<TrackedObject>;
66
67 bool operator==(const TrackedObject& first, const TrackedObject& second);
68 bool operator!=(const TrackedObject& first, const TrackedObject& second);
70 using ObjectTracks = std::unordered_map<int, TrackedObjects>;
71
76 class CV_EXPORTS IImageDescriptor {
77 public:
82 virtual cv::Size size() const = 0;
83
89 virtual void compute(const cv::Mat &mat, CV_OUT cv::Mat& descr) = 0;
90
96 virtual void compute(const std::vector<cv::Mat> &mats,
97 CV_OUT std::vector<cv::Mat>& descrs) = 0;
98
99 virtual ~IImageDescriptor() {}
100};
101
102
106 class CV_EXPORTS ResizedImageDescriptor : public IImageDescriptor {
107 public:
113 explicit ResizedImageDescriptor(const cv::Size &descr_size,
114 const cv::InterpolationFlags interpolation)
115 : descr_size_(descr_size), interpolation_(interpolation) {
116 CV_Assert(descr_size.width > 0);
117 CV_Assert(descr_size.height > 0);
118 }
119
124 cv::Size size() const override { return descr_size_; }
125
131 void compute(const cv::Mat &mat, CV_OUT cv::Mat& descr) override {
132 CV_Assert(!mat.empty());
133 cv::resize(mat, descr, descr_size_, 0, 0, interpolation_);
134 }
135
140 //
141 void compute(const std::vector<cv::Mat> &mats,
142 CV_OUT std::vector<cv::Mat>& descrs) override {
143 descrs.resize(mats.size());
144 for (size_t i = 0; i < mats.size(); i++) {
145 compute(mats[i], descrs[i]);
146 }
147 }
148
149 private:
150 cv::Size descr_size_;
151
152 cv::InterpolationFlags interpolation_;
153};
154
155
160 class CV_EXPORTS IDescriptorDistance {
161 public:
168 virtual float compute(const cv::Mat &descr1, const cv::Mat &descr2) = 0;
169
176 virtual std::vector<float> compute(const std::vector<cv::Mat> &descrs1,
177 const std::vector<cv::Mat> &descrs2) = 0;
178
179 virtual ~IDescriptorDistance() {}
180};
181
186 class CV_EXPORTS CosDistance : public IDescriptorDistance {
187 public:
192 explicit CosDistance(const cv::Size &descriptor_size);
193
200 float compute(const cv::Mat &descr1, const cv::Mat &descr2) override;
201
208 std::vector<float> compute(
209 const std::vector<cv::Mat> &descrs1,
210 const std::vector<cv::Mat> &descrs2) override;
211
212 private:
213 cv::Size descriptor_size_;
214};
215
216
222 class CV_EXPORTS MatchTemplateDistance : public IDescriptorDistance {
223 public:
236 float scale = -1, float offset = 1)
237 : type_(type), scale_(scale), offset_(offset) {}
244 float compute(const cv::Mat &descr1, const cv::Mat &descr2) override;
251 std::vector<float> compute(const std::vector<cv::Mat> &descrs1,
252 const std::vector<cv::Mat> &descrs2) override;
253 virtual ~MatchTemplateDistance() {}
254
255 private:
256 int type_;
257 float scale_;
259 float offset_;
261};
262
266 struct CV_EXPORTS TrackerParams {
268
272
276
280
282
284
286
288
290
292
295
299
300 float reid_thr;
301
304
308
313};
314
318 class CV_EXPORTS Track {
319 public:
327 Track(const TrackedObjects &objs, const cv::Mat &last_image,
328 const cv::Mat &descriptor_fast, const cv::Mat &descriptor_strong)
329 : objects(objs),
330 predicted_rect(!objs.empty() ? objs.back().rect : cv::Rect()),
331 last_image(last_image),
332 descriptor_fast(descriptor_fast),
333 descriptor_strong(descriptor_strong),
334 lost(0),
335 length(1) {
336 CV_Assert(!objs.empty());
337 first_object = objs[0];
338 }
339
344 bool empty() const { return objects.empty(); }
345
350 size_t size() const { return objects.size(); }
351
358 const TrackedObject &operator[](size_t i) const { return objects[i]; }
359
366 TrackedObject &operator[](size_t i) { return objects[i]; }
367
372 const TrackedObject &back() const {
373 CV_Assert(!empty());
374 return objects.back();
375 }
376
382 CV_Assert(!empty());
383 return objects.back();
384 }
385
386 TrackedObjects objects;
392 size_t lost;
393
395 size_t length;
397};
398
416 class CV_EXPORTS ITrackerByMatching {
417 public:
418 using Descriptor = std::shared_ptr<IImageDescriptor>;
419 using Distance = std::shared_ptr<IDescriptorDistance>;
420
425
433 virtual void process(const cv::Mat &frame, const TrackedObjects &detections,
434 uint64_t timestamp) = 0;
435
440 virtual const TrackerParams &params() const = 0;
441
446 virtual void setParams(const TrackerParams &params) = 0;
447
452 virtual const Descriptor &descriptorFast() const = 0;
453
458 virtual void setDescriptorFast(const Descriptor &val) = 0;
459
464 virtual const Descriptor &descriptorStrong() const = 0;
465
470 virtual void setDescriptorStrong(const Descriptor &val) = 0;
471
476 virtual const Distance &distanceFast() const = 0;
477
482 virtual void setDistanceFast(const Distance &val) = 0;
483
488 virtual const Distance &distanceStrong() const = 0;
489
494 virtual void setDistanceStrong(const Distance &val) = 0;
495
500 virtual size_t count() const = 0;
501
506 virtual std::unordered_map<size_t, std::vector<cv::Point> > getActiveTracks() const = 0;
507
512 virtual TrackedObjects trackedDetections() const = 0;
513
519 virtual cv::Mat drawActiveTracks(const cv::Mat &frame) = 0;
520
526 virtual bool isTrackForgotten(size_t id) const = 0;
527
533 virtual const std::unordered_map<size_t, Track> &tracks() const = 0;
534
540 virtual bool isTrackValid(size_t track_id) const = 0;
541
546 virtual void dropForgottenTracks() = 0;
547
553 virtual void dropForgottenTrack(size_t track_id) = 0;
554};
555
559CV_EXPORTS cv::Ptr<ITrackerByMatching> createTrackerByMatching(const TrackerParams &params = TrackerParams());
560
561} // namespace tbm
562
564
565}}} // namespace
566 #endif // #ifndef __OPENCV_TRACKING_TRACKING_BY_MATCHING_HPP__
n-dimensional dense array class
Definition: mat.hpp:802
Template class for 2D rectangles
Definition: core/types.hpp:421
Template class for specifying the size of an image or rectangle.
Definition: core/types.hpp:316
_Tp height
the height
Definition: core/types.hpp:340
_Tp width
the width
Definition: core/types.hpp:339
The CosDistance class allows computing cosine distance between two reidentification descriptors.
Definition: tracking_by_matching.hpp:186
CosDistance(const cv::Size &descriptor_size)
CosDistance constructor.
float compute(const cv::Mat &descr1, const cv::Mat &descr2) override
Computes distance between two descriptors.
std::vector< float > compute(const std::vector< cv::Mat > &descrs1, const std::vector< cv::Mat > &descrs2) override
Computes distances between two descriptors in batches.
The IDescriptorDistance class declares an interface for distance computation between reidentification...
Definition: tracking_by_matching.hpp:160
virtual float compute(const cv::Mat &descr1, const cv::Mat &descr2)=0
Computes distance between two descriptors.
virtual std::vector< float > compute(const std::vector< cv::Mat > &descrs1, const std::vector< cv::Mat > &descrs2)=0
Computes distances between two descriptors in batches.
The IImageDescriptor class declares base class for image descriptor.
Definition: tracking_by_matching.hpp:76
virtual void compute(const cv::Mat &mat, CV_OUT cv::Mat &descr)=0
Computes image descriptor.
virtual void compute(const std::vector< cv::Mat > &mats, CV_OUT std::vector< cv::Mat > &descrs)=0
Computes image descriptors in batches.
virtual cv::Size size() const =0
Descriptor size getter.
Tracker-by-Matching algorithm interface.
Definition: tracking_by_matching.hpp:416
virtual size_t count() const =0
Returns number of counted people.
virtual bool isTrackValid(size_t track_id) const =0
isTrackValid Checks whether track is valid (duration > threshold).
virtual void process(const cv::Mat &frame, const TrackedObjects &detections, uint64_t timestamp)=0
Process given frame.
virtual const TrackerParams & params() const =0
Pipeline parameters getter.
virtual const Descriptor & descriptorFast() const =0
Fast descriptor getter.
virtual const std::unordered_map< size_t, Track > & tracks() const =0
tracks Returns all tracks including forgotten (lost too many frames ago).
virtual bool isTrackForgotten(size_t id) const =0
isTrackForgotten returns true if track is forgotten.
virtual TrackedObjects trackedDetections() const =0
Get tracked detections.
virtual const Distance & distanceFast() const =0
Fast distance getter.
virtual const Descriptor & descriptorStrong() const =0
Strong descriptor getter.
virtual void setDescriptorStrong(const Descriptor &val)=0
Strong descriptor setter.
virtual void setDescriptorFast(const Descriptor &val)=0
Fast descriptor setter.
virtual void dropForgottenTrack(size_t track_id)=0
dropForgottenTrack Check that the track was lost too many frames ago and removes it frm memory.
virtual void setDistanceFast(const Distance &val)=0
Fast distance setter.
virtual std::unordered_map< size_t, std::vector< cv::Point > > getActiveTracks() const =0
Get active tracks to draw
virtual ~ITrackerByMatching()
Destructor for the tracker
Definition: tracking_by_matching.hpp:424
virtual void setParams(const TrackerParams &params)=0
Pipeline parameters setter.
virtual void dropForgottenTracks()=0
dropForgottenTracks Removes tracks from memory that were lost too many frames ago.
virtual const Distance & distanceStrong() const =0
Strong distance getter.
virtual void setDistanceStrong(const Distance &val)=0
Strong distance setter.
virtual cv::Mat drawActiveTracks(const cv::Mat &frame)=0
Draws active tracks on a given frame.
Computes distance between images using MatchTemplate function from OpenCV library and its cross-corre...
Definition: tracking_by_matching.hpp:222
std::vector< float > compute(const std::vector< cv::Mat > &descrs1, const std::vector< cv::Mat > &descrs2) override
Computes distances between two descriptors in batches.
MatchTemplateDistance(int type=cv::TemplateMatchModes::TM_CCORR_NORMED, float scale=-1, float offset=1)
Constructs the distance object.
Definition: tracking_by_matching.hpp:235
float compute(const cv::Mat &descr1, const cv::Mat &descr2) override
Computes distance between image descriptors.
Uses resized image as descriptor.
Definition: tracking_by_matching.hpp:106
ResizedImageDescriptor(const cv::Size &descr_size, const cv::InterpolationFlags interpolation)
Constructor.
Definition: tracking_by_matching.hpp:113
void compute(const cv::Mat &mat, CV_OUT cv::Mat &descr) override
Computes image descriptor.
Definition: tracking_by_matching.hpp:131
void compute(const std::vector< cv::Mat > &mats, CV_OUT std::vector< cv::Mat > &descrs) override
Computes images descriptors.
Definition: tracking_by_matching.hpp:141
cv::Size size() const override
Returns descriptor size.
Definition: tracking_by_matching.hpp:124
The Track class describes tracks.
Definition: tracking_by_matching.hpp:318
cv::Mat last_image
Image of last detected object in track.
Definition: tracking_by_matching.hpp:389
cv::Mat descriptor_fast
Fast descriptor.
Definition: tracking_by_matching.hpp:390
size_t lost
How many frames ago track has been lost.
Definition: tracking_by_matching.hpp:392
TrackedObjects objects
Detected objects;
Definition: tracking_by_matching.hpp:386
bool empty() const
empty returns if track does not contain objects.
Definition: tracking_by_matching.hpp:344
TrackedObject & back()
back returns non-const reference to last object in track.
Definition: tracking_by_matching.hpp:381
size_t length
Definition: tracking_by_matching.hpp:395
const TrackedObject & operator[](size_t i) const
operator [] return const reference to detected object with specified index.
Definition: tracking_by_matching.hpp:358
cv::Rect predicted_rect
Definition: tracking_by_matching.hpp:387
const TrackedObject & back() const
back returns const reference to last object in track.
Definition: tracking_by_matching.hpp:372
TrackedObject first_object
First object in track.
Definition: tracking_by_matching.hpp:394
size_t size() const
size returns number of detected objects in a track.
Definition: tracking_by_matching.hpp:350
Track(const TrackedObjects &objs, const cv::Mat &last_image, const cv::Mat &descriptor_fast, const cv::Mat &descriptor_strong)
Track constructor.
Definition: tracking_by_matching.hpp:327
TrackedObject & operator[](size_t i)
operator [] return non-const reference to detected object with specified index.
Definition: tracking_by_matching.hpp:366
cv::Mat descriptor_strong
Strong descriptor (reid embedding).
Definition: tracking_by_matching.hpp:391
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails
Definition: base.hpp:342
@ TM_CCORR_NORMED
Definition: imgproc.hpp:3739
InterpolationFlags
interpolation algorithm
Definition: imgproc.hpp:245
CV_EXPORTS_W void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
Resizes an image.
cv
"black box" representation of the file storage associated with a file on disk.
Definition: aruco.hpp:75
Definition: cvstd_wrapper.hpp:74
The TrackedObject struct defines properties of detected object.
Definition: tracking_by_matching.hpp:33
TrackedObject(const cv::Rect &rect, float confidence, int frame_idx, int object_id)
Constructor with parameters.
Definition: tracking_by_matching.hpp:56
double confidence
Detection confidence level (-1 if N/A).
Definition: tracking_by_matching.hpp:35
cv::Rect rect
Detected object ROI (zero area if N/A).
Definition: tracking_by_matching.hpp:34
int frame_idx
Frame index where object was detected (-1 if N/A).
Definition: tracking_by_matching.hpp:36
uint64_t timestamp
Timestamp in milliseconds.
Definition: tracking_by_matching.hpp:38
int object_id
Unique object identifier (-1 if N/A).
Definition: tracking_by_matching.hpp:37
TrackedObject()
Default constructor.
Definition: tracking_by_matching.hpp:43
The TrackerParams struct stores parameters of TrackerByMatching
Definition: tracking_by_matching.hpp:266
size_t min_track_duration
Min track duration in milliseconds.
Definition: tracking_by_matching.hpp:267
float shape_affinity_w
Shape affinity weight.
Definition: tracking_by_matching.hpp:281
cv::Vec2f bbox_aspect_ratios_range
Bounding box aspect ratios range.
Definition: tracking_by_matching.hpp:289
size_t forget_delay
Definition: tracking_by_matching.hpp:269
cv::Vec2f bbox_heights_range
Bounding box heights range.
Definition: tracking_by_matching.hpp:291
float min_det_conf
Min confidence of detection.
Definition: tracking_by_matching.hpp:287
float motion_affinity_w
Motion affinity weight.
Definition: tracking_by_matching.hpp:283
int max_num_objects_in_track
Definition: tracking_by_matching.hpp:305
float strong_affinity_thr
of lost track.
Definition: tracking_by_matching.hpp:296
float aff_thr_strong
Definition: tracking_by_matching.hpp:277
float reid_thr
Affinity threshold for re-identification.
Definition: tracking_by_matching.hpp:300
bool drop_forgotten_tracks
Definition: tracking_by_matching.hpp:302
float aff_thr_fast
Definition: tracking_by_matching.hpp:273
int predict
Definition: tracking_by_matching.hpp:293
float time_affinity_w
Time affinity weight.
Definition: tracking_by_matching.hpp:285