Skip to content

Commit fb61f38

Browse files
author
Sergey Nuzhny
committed
Experimental support of the variable distances between detections
1 parent 10f149f commit fb61f38

3 files changed

Lines changed: 58 additions & 13 deletions

File tree

Tracker/Ctracker.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ CTracker::CTracker(
2424
// ---------------------------------------------------------------------------
2525
void CTracker::Update(
2626
const std::vector<Point_t>& detections,
27-
const std::vector<cv::Rect>& rects)
27+
const std::vector<cv::Rect>& rects,
28+
DistType distType
29+
)
2830
{
2931
assert(detections.size() == rects.size());
3032

@@ -53,15 +55,29 @@ void CTracker::Update(
5355
// -----------------------------------
5456
// Треки уже есть, составим матрицу расстояний
5557
// -----------------------------------
56-
for (size_t i = 0; i < tracks.size(); i++)
58+
switch (distType)
5759
{
58-
for (size_t j = 0; j < detections.size(); j++)
60+
case CentersDist:
61+
for (size_t i = 0; i < tracks.size(); i++)
5962
{
60-
Point_t diff = tracks[i]->prediction - detections[j];
61-
track_t dist = sqrtf(diff.x*diff.x + diff.y*diff.y);
62-
Cost[i + j * N] = dist;
63+
for (size_t j = 0; j < detections.size(); j++)
64+
{
65+
Cost[i + j * N] = tracks[i]->CalcDist(detections[j]);
66+
}
67+
}
68+
break;
69+
70+
case RectsDist:
71+
for (size_t i = 0; i < tracks.size(); i++)
72+
{
73+
for (size_t j = 0; j < detections.size(); j++)
74+
{
75+
Cost[i + j * N] = tracks[i]->CalcDist(rects[j]);
76+
}
6377
}
78+
break;
6479
}
80+
6581
// -----------------------------------
6682
// Solving assignment problem (tracks and predictions of Kalman filter)
6783
// -----------------------------------

Tracker/Ctracker.h

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <iostream>
66
#include <vector>
77
#include <memory>
8+
#include <array>
89

910
// --------------------------------------------------------------------------
1011
class CTrack
@@ -20,6 +21,30 @@ class CTrack
2021
{
2122
}
2223

24+
track_t CalcDist(const Point_t& p)
25+
{
26+
Point_t diff = prediction - p;
27+
return sqrtf(diff.x * diff.x + diff.y * diff.y);
28+
}
29+
30+
track_t CalcDist(const cv::Rect& r)
31+
{
32+
cv::Rect rect = GetLastRect();
33+
34+
std::array<track_t, 4> diff;
35+
diff[0] = prediction.x - lastRect.width / 2 - r.x;
36+
diff[1] = prediction.y - lastRect.height / 2 - r.y;
37+
diff[2] = static_cast<track_t>(lastRect.width - r.width);
38+
diff[3] = static_cast<track_t>(lastRect.height - r.height);
39+
40+
track_t dist = 0;
41+
for (size_t i = 0; i < diff.size(); ++i)
42+
{
43+
dist += diff[i] * diff[i];
44+
}
45+
return sqrtf(dist);
46+
}
47+
2348
void Update(const Point_t& p, const cv::Rect& rect, bool dataCorrect, size_t max_trace_length)
2449
{
2550
KF.GetPrediction();
@@ -41,8 +66,6 @@ class CTrack
4166
std::vector<Point_t> trace;
4267
size_t track_id;
4368
size_t skipped_frames;
44-
45-
Point_t prediction;
4669

4770
cv::Rect GetLastRect()
4871
{
@@ -54,6 +77,7 @@ class CTrack
5477
}
5578

5679
private:
80+
Point_t prediction;
5781
cv::Rect lastRect;
5882
TKalmanFilter KF;
5983
};
@@ -65,8 +89,14 @@ class CTracker
6589
CTracker(track_t dt_, track_t Accel_noise_mag_, track_t dist_thres_ = 60, size_t maximum_allowed_skipped_frames_ = 10, size_t max_trace_length_ = 10);
6690
~CTracker(void);
6791

92+
enum DistType
93+
{
94+
CentersDist = 0,
95+
RectsDist = 1
96+
};
97+
6898
std::vector<std::unique_ptr<CTrack>> tracks;
69-
void Update(const std::vector<Point_t>& detections, const std::vector<cv::Rect>& rects);
99+
void Update(const std::vector<Point_t>& detections, const std::vector<cv::Rect>& rects, DistType distType);
70100

71101
private:
72102
// Шаг времени опроса фильтра
@@ -84,4 +114,3 @@ class CTracker
84114

85115
size_t NextTrackID;
86116
};
87-

main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void mv_MouseCallback(int event, int x, int y, int /*flags*/, void* param)
2727
// set to 0 for Bugs tracking example
2828
// set to 1 for mouse tracking example
2929
// ----------------------------------------------------------------------
30-
#define ExampleNum 0
30+
#define ExampleNum 1
3131

3232
int main(int ac, char** av)
3333
{
@@ -76,7 +76,7 @@ int main(int ac, char** av)
7676
const std::vector<Point_t>& centers = detector.Detect(gray);
7777
const std::vector<cv::Rect>& rects = detector.GetDetects();
7878

79-
tracker.Update(centers, rects);
79+
tracker.Update(centers, rects, CTracker::RectsDist);
8080

8181
int64 t2 = cv::getTickCount();
8282

@@ -155,7 +155,7 @@ int main(int ac, char** av)
155155
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, CV_AA);
156156
}
157157

158-
tracker.Update(pts, rects);
158+
tracker.Update(pts, rects, CTracker::CentersDist);
159159

160160
std::cout << tracker.tracks.size() << std::endl;
161161

0 commit comments

Comments
 (0)