Skip to content

Commit 10f149f

Browse files
author
Sergey Nuzhny
committed
Add rectangle to every track
1 parent 5ebb9ee commit 10f149f

3 files changed

Lines changed: 47 additions & 24 deletions

File tree

Tracker/Ctracker.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,34 @@ CTracker::CTracker(
2222
// ---------------------------------------------------------------------------
2323
//
2424
// ---------------------------------------------------------------------------
25-
void CTracker::Update(const std::vector<Point_t>& detections)
25+
void CTracker::Update(
26+
const std::vector<Point_t>& detections,
27+
const std::vector<cv::Rect>& rects)
2628
{
29+
assert(detections.size() == rects.size());
30+
2731
// -----------------------------------
2832
// If there is no tracks yet, then every cv::Point begins its own track.
2933
// -----------------------------------
3034
if (tracks.size() == 0)
3135
{
3236
// If no tracks yet
33-
for (auto d : detections)
37+
for (size_t i = 0; i < detections.size(); ++i)
3438
{
35-
tracks.push_back(std::make_unique<CTrack>(d, dt, Accel_noise_mag, NextTrackID++));
39+
tracks.push_back(std::make_unique<CTrack>(detections[i], rects[i], dt, Accel_noise_mag, NextTrackID++));
3640
}
3741
}
3842

39-
// -----------------------------------
40-
// Здесь треки уже есть в любом случае
41-
// -----------------------------------
4243
size_t N = tracks.size(); // треки
4344
size_t M = detections.size(); // детекты
4445

45-
// Матрица расстояний от N-ного трека до M-ного детекта.
46-
distMatrix_t Cost(N * M);
4746
assignments_t assignment; // назначения
4847

4948
if (!tracks.empty())
5049
{
50+
// Матрица расстояний от N-ного трека до M-ного детекта.
51+
distMatrix_t Cost(N * M);
52+
5153
// -----------------------------------
5254
// Треки уже есть, составим матрицу расстояний
5355
// -----------------------------------
@@ -107,7 +109,7 @@ void CTracker::Update(const std::vector<Point_t>& detections)
107109
{
108110
if (find(assignment.begin(), assignment.end(), i) == assignment.end())
109111
{
110-
tracks.push_back(std::make_unique<CTrack>(detections[i], dt, Accel_noise_mag, NextTrackID++));
112+
tracks.push_back(std::make_unique<CTrack>(detections[i], rects[i], dt, Accel_noise_mag, NextTrackID++));
111113
}
112114
}
113115

@@ -120,11 +122,11 @@ void CTracker::Update(const std::vector<Point_t>& detections)
120122
if (assignment[i] != -1) // If we have assigned detect, then update using its coordinates,
121123
{
122124
tracks[i]->skipped_frames = 0;
123-
tracks[i]->Update(detections[assignment[i]], true, max_trace_length);
125+
tracks[i]->Update(detections[assignment[i]], rects[assignment[i]], true, max_trace_length);
124126
}
125127
else // if not continue using predictions
126128
{
127-
tracks[i]->Update(Point_t(0, 0), false, max_trace_length);
129+
tracks[i]->Update(Point_t(), cv::Rect(), false, max_trace_length);
128130
}
129131
}
130132

Tracker/Ctracker.h

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,30 @@
66
#include <vector>
77
#include <memory>
88

9-
//template<typename TRACK_OBJ>
9+
// --------------------------------------------------------------------------
1010
class CTrack
1111
{
1212
public:
13-
CTrack(Point_t p, track_t dt, track_t Accel_noise_mag, size_t trackID)
13+
CTrack(const Point_t& p, const cv::Rect& rect, track_t dt, track_t Accel_noise_mag, size_t trackID)
1414
:
1515
track_id(trackID),
1616
skipped_frames(0),
1717
prediction(p),
18+
lastRect(rect),
1819
KF(p, dt, Accel_noise_mag)
1920
{
2021
}
2122

22-
void Update(Point_t p, bool dataCorrect, size_t max_trace_length)
23+
void Update(const Point_t& p, const cv::Rect& rect, bool dataCorrect, size_t max_trace_length)
2324
{
2425
KF.GetPrediction();
2526
prediction = KF.Update(p, dataCorrect);
2627

28+
if (dataCorrect)
29+
{
30+
lastRect = rect;
31+
}
32+
2733
if (trace.size() > max_trace_length)
2834
{
2935
trace.erase(trace.begin(), trace.end() - max_trace_length);
@@ -35,21 +41,32 @@ class CTrack
3541
std::vector<Point_t> trace;
3642
size_t track_id;
3743
size_t skipped_frames;
44+
3845
Point_t prediction;
3946

47+
cv::Rect GetLastRect()
48+
{
49+
return cv::Rect(
50+
static_cast<int>(prediction.x - lastRect.width / 2),
51+
static_cast<int>(prediction.y - lastRect.height / 2),
52+
lastRect.width,
53+
lastRect.height);
54+
}
55+
4056
private:
57+
cv::Rect lastRect;
4158
TKalmanFilter KF;
4259
};
4360

44-
61+
// --------------------------------------------------------------------------
4562
class CTracker
4663
{
4764
public:
4865
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);
4966
~CTracker(void);
5067

5168
std::vector<std::unique_ptr<CTrack>> tracks;
52-
void Update(const std::vector<Point_t>& detections);
69+
void Update(const std::vector<Point_t>& detections, const std::vector<cv::Rect>& rects);
5370

5471
private:
5572
// Шаг времени опроса фильтра

main.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
79+
tracker.Update(centers, rects);
8080

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

@@ -86,16 +86,14 @@ int main(int ac, char** av)
8686
{
8787
cv::circle(frame, p, 3, cv::Scalar(0, 255, 0), 1, CV_AA);
8888
}
89-
for (auto r : rects)
90-
{
91-
cv::rectangle(frame, r, cv::Scalar(0, 255, 0), 1, CV_AA);
92-
}
9389

9490
std::cout << tracker.tracks.size() << std::endl;
9591

9692
for (int i = 0; i < tracker.tracks.size(); i++)
9793
{
98-
if (tracker.tracks[i]->trace.size()>1)
94+
cv::rectangle(frame, tracker.tracks[i]->GetLastRect(), cv::Scalar(0, 255, 0), 1, CV_AA);
95+
96+
if (tracker.tracks[i]->trace.size() > 1)
9997
{
10098
for (int j = 0; j < tracker.tracks[i]->trace.size() - 1; j++)
10199
{
@@ -145,21 +143,27 @@ int main(int ac, char** av)
145143
pts.push_back(Point_t(Xmeasured + 100.0f*sin(alpha / 3.0f), Ymeasured + 100.0f*cos(alpha / 1.0f)));
146144
alpha += 0.05f;
147145

146+
std::vector<cv::Rect> rects;
147+
for (auto p : pts)
148+
{
149+
rects.push_back(cv::Rect(static_cast<int>(p.x - 1), static_cast<int>(p.y - 1), 3, 3));
150+
}
151+
148152

149153
for (size_t i = 0; i < pts.size(); i++)
150154
{
151155
cv::circle(frame, pts[i], 3, cv::Scalar(0, 255, 0), 1, CV_AA);
152156
}
153157

154-
tracker.Update(pts);
158+
tracker.Update(pts, rects);
155159

156160
std::cout << tracker.tracks.size() << std::endl;
157161

158162
for (size_t i = 0; i < tracker.tracks.size(); i++)
159163
{
160164
const auto& tracks = tracker.tracks[i];
161165

162-
if (tracks->trace.size()>1)
166+
if (tracks->trace.size() > 1)
163167
{
164168
for (size_t j = 0; j < tracks->trace.size() - 1; j++)
165169
{

0 commit comments

Comments
 (0)