Skip to content

Commit 888eb3e

Browse files
committed
Distance from pixels to velocity
1 parent fbd1099 commit 888eb3e

10 files changed

Lines changed: 109 additions & 100 deletions

File tree

async_detector/AsyncDetector.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,10 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f
305305
trackerSettings.m_filterGoal = tracking::FilterRect;
306306
trackerSettings.m_lostTrackType = tracking::TrackNone; // Use KCF tracker for collisions resolving
307307
trackerSettings.m_matchType = tracking::MatchHungrian;
308-
trackerSettings.m_dt = 0.2f; // Delta time for Kalman filter
309-
trackerSettings.m_accelNoiseMag = 0.3f; // Accel noise magnitude for Kalman filter
310-
trackerSettings.m_distThres = frameHeight / 10.f; // Distance threshold between region and object on two frames
308+
trackerSettings.m_dt = 0.2f; // Delta time for Kalman filter
309+
trackerSettings.m_accelNoiseMag = 0.3f; // Accel noise magnitude for Kalman filter
310+
trackerSettings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
311+
trackerSettings.m_minAreaRadius = frameHeight / 20.f;
311312

312313
trackerSettings.m_useAbandonedDetection = false;
313314
if (trackerSettings.m_useAbandonedDetection)

cars_counting/CarsCounting.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,10 @@ bool CarsCounting::InitTracker(cv::UMat frame)
264264
settings.m_filterGoal = tracking::FilterRect;
265265
settings.m_lostTrackType = tracking::TrackCSRT; // Use KCF tracker for collisions resolving
266266
settings.m_matchType = tracking::MatchHungrian;
267-
settings.m_dt = 0.5f; // Delta time for Kalman filter
268-
settings.m_accelNoiseMag = 0.5f; // Accel noise magnitude for Kalman filter
269-
settings.m_distThres = frame.rows / 15.f; // Distance threshold between region and object on two frames
267+
settings.m_dt = 0.5f; // Delta time for Kalman filter
268+
settings.m_accelNoiseMag = 0.5f; // Accel noise magnitude for Kalman filter
269+
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
270+
settings.m_minAreaRadius = frame.rows / 20.f;
270271

271272
settings.m_useAbandonedDetection = false;
272273
if (settings.m_useAbandonedDetection)

example/MouseExample.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ void MouseTracking(cv::CommandLineParser parser)
5454
settings.m_matchType = tracking::MatchHungrian;
5555
settings.m_dt = 0.2f;
5656
settings.m_accelNoiseMag = 0.5f;
57-
settings.m_distThres = 100.0f;
57+
settings.m_distThres = 0.8f;
58+
settings.m_minAreaRadius = frame.rows / 20.f;
5859
settings.m_maximumAllowedSkippedFrames = 25;
5960
settings.m_maxTraceLength = 25;
6061

example/VideoExample.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,14 @@ void VideoExample::DrawTrack(cv::Mat frame,
392392
{
393393
cv::line(frame, ResizePoint(rectPoints[i]), ResizePoint(rectPoints[(i+1) % 4]), color);
394394
}
395-
395+
#if 0
396+
float angle = 0;//atan2(track.m_velocity[0], track.m_velocity[1]);
397+
cv::RotatedRect rr(track.m_rrect.center,
398+
cv::Size2f(std::max(frame.rows / 20.f, static_cast<track_t>(3.f * fabs(track.m_velocity[0]))),
399+
std::max(frame.cols / 20.f, static_cast<track_t>(3.f * fabs(track.m_velocity[1])))),
400+
180.f * angle / CV_PI);
401+
cv::ellipse(frame, rr, cv::Scalar(100, 100, 100), 1);
402+
#endif
396403
if (drawTrajectory)
397404
{
398405
cv::Scalar cl = m_colors[track.m_ID % m_colors.size()];

example/examples.h

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@ class MotionDetectorExample : public VideoExample
6262
TrackerSettings settings;
6363
settings.SetDistance(tracking::DistCenters);
6464
settings.m_kalmanType = tracking::KalmanLinear;
65-
settings.m_filterGoal = tracking::FilterRect;
65+
settings.m_filterGoal = tracking::FilterCenter;
6666
settings.m_lostTrackType = tracking::TrackKCF; // Use visual objects tracker for collisions resolving
6767
settings.m_matchType = tracking::MatchHungrian;
6868
settings.m_dt = 0.4f; // Delta time for Kalman filter
6969
settings.m_accelNoiseMag = 0.5f; // Accel noise magnitude for Kalman filter
70-
settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames
70+
settings.m_distThres = 0.95f; // Distance threshold between region and object on two frames
71+
settings.m_minAreaRadius = frame.rows / 20.f;
7172

7273
settings.m_useAbandonedDetection = false;
7374
if (settings.m_useAbandonedDetection)
@@ -172,17 +173,18 @@ class FaceDetectorExample : public VideoExample
172173
/// \param frame
173174
/// \return
174175
///
175-
bool InitTracker(cv::UMat /*frame*/)
176+
bool InitTracker(cv::UMat frame)
176177
{
177178
TrackerSettings settings;
178179
settings.SetDistance(tracking::DistJaccard);
179180
settings.m_kalmanType = tracking::KalmanUnscented;
180181
settings.m_filterGoal = tracking::FilterRect;
181-
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
182+
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
182183
settings.m_matchType = tracking::MatchHungrian;
183-
settings.m_dt = 0.3f; // Delta time for Kalman filter
184-
settings.m_accelNoiseMag = 0.1f; // Accel noise magnitude for Kalman filter
185-
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
184+
settings.m_dt = 0.3f; // Delta time for Kalman filter
185+
settings.m_accelNoiseMag = 0.1f; // Accel noise magnitude for Kalman filter
186+
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
187+
settings.m_minAreaRadius = frame.rows / 20.f;
186188
settings.m_maximumAllowedSkippedFrames = cvRound(m_fps / 2); // Maximum allowed skipped frames
187189
settings.m_maxTraceLength = cvRound(5 * m_fps); // Maximum trace length
188190

@@ -274,11 +276,12 @@ class PedestrianDetectorExample : public VideoExample
274276
settings.SetDistance(tracking::DistRects);
275277
settings.m_kalmanType = tracking::KalmanLinear;
276278
settings.m_filterGoal = tracking::FilterRect;
277-
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
279+
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
278280
settings.m_matchType = tracking::MatchHungrian;
279281
settings.m_dt = 0.3f; // Delta time for Kalman filter
280282
settings.m_accelNoiseMag = 0.1f; // Accel noise magnitude for Kalman filter
281-
settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames
283+
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
284+
settings.m_minAreaRadius = frame.rows / 20.f;
282285
settings.m_maximumAllowedSkippedFrames = cvRound(m_fps); // Maximum allowed skipped frames
283286
settings.m_maxTraceLength = cvRound(5 * m_fps); // Maximum trace length
284287

@@ -371,11 +374,12 @@ class SSDMobileNetExample : public VideoExample
371374
settings.SetDistance(tracking::DistRects);
372375
settings.m_kalmanType = tracking::KalmanLinear;
373376
settings.m_filterGoal = tracking::FilterRect;
374-
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
377+
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
375378
settings.m_matchType = tracking::MatchHungrian;
376379
settings.m_dt = 0.3f; // Delta time for Kalman filter
377380
settings.m_accelNoiseMag = 0.1f; // Accel noise magnitude for Kalman filter
378-
settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames
381+
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
382+
settings.m_minAreaRadius = frame.rows / 20.f;
379383
settings.m_maximumAllowedSkippedFrames = cvRound(2 * m_fps); // Maximum allowed skipped frames
380384
settings.m_maxTraceLength = cvRound(5 * m_fps); // Maximum trace length
381385

@@ -495,11 +499,12 @@ class YoloExample : public VideoExample
495499
settings.SetDistance(tracking::DistRects);
496500
settings.m_kalmanType = tracking::KalmanLinear;
497501
settings.m_filterGoal = tracking::FilterRect;
498-
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
502+
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
499503
settings.m_matchType = tracking::MatchHungrian;
500504
settings.m_dt = 0.3f; // Delta time for Kalman filter
501505
settings.m_accelNoiseMag = 0.2f; // Accel noise magnitude for Kalman filter
502-
settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames
506+
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
507+
settings.m_minAreaRadius = frame.rows / 20.f;
503508
settings.m_maximumAllowedSkippedFrames = cvRound(2 * m_fps); // Maximum allowed skipped frames
504509
settings.m_maxTraceLength = cvRound(5 * m_fps); // Maximum trace length
505510

@@ -620,11 +625,12 @@ class YoloDarknetExample : public VideoExample
620625
settings.SetDistance(tracking::DistCenters);
621626
settings.m_kalmanType = tracking::KalmanLinear;
622627
settings.m_filterGoal = tracking::FilterRect;
623-
settings.m_lostTrackType = tracking::TrackNone; // Use visual objects tracker for collisions resolving
628+
settings.m_lostTrackType = tracking::TrackNone; // Use visual objects tracker for collisions resolving
624629
settings.m_matchType = tracking::MatchHungrian;
625630
settings.m_dt = 0.3f; // Delta time for Kalman filter
626631
settings.m_accelNoiseMag = 0.2f; // Accel noise magnitude for Kalman filter
627-
settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames
632+
settings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
633+
settings.m_minAreaRadius = frame.rows / 20.f;
628634
settings.m_maximumAllowedSkippedFrames = cvRound(2 * m_fps); // Maximum allowed skipped frames
629635
settings.m_maxTraceLength = cvRound(5 * m_fps); // Maximum trace length
630636

example/main.cpp

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -34,76 +34,6 @@ const char* keys =
3434

3535
int main(int argc, char** argv)
3636
{
37-
#if 0
38-
TKalmanFilter kf(tracking::KalmanLinear, 0.2f, 0.5f);
39-
cv::Mat img(1080, 1920, CV_8UC3, cv::Scalar(255, 255, 255));
40-
Point_t lastPt(10, img.rows / 2);
41-
kf.Update(lastPt, true);
42-
int xStep = 5;
43-
srand(12345);
44-
45-
cv::circle(img, lastPt, 2, cv::Scalar(0, 255, 0), 1);
46-
cv::namedWindow("img", cv::WINDOW_AUTOSIZE);
47-
track_t distR = 0;
48-
track_t distF = 0;
49-
std::vector<cv::Vec<track_t, 2>> dists;
50-
int stop_i = 200;
51-
float step = CV_2PI / stop_i;
52-
for (int i = 0; i < 2 * stop_i; ++i)
53-
{
54-
int rx = rand() % 20;
55-
int ry = rand() % 30;
56-
lastPt.x += xStep;
57-
lastPt.y = img.rows / 2 + sin(i * step) * img.rows / 4;
58-
Point_t pt(lastPt.x + ((rx % 2) ? -1 : 1) * rx,
59-
lastPt.y + ((ry % 2) ? 1 : -1) * ry);
60-
61-
Point_t upd = kf.Update(pt, true);
62-
Point_t pred = kf.GetPointPrediction();
63-
64-
distR += cv::norm(cv::Vec2f(lastPt.x, lastPt.y), cv::Vec2f(pt.x, pt.y), cv::NORM_L2);
65-
distF += cv::norm(cv::Vec2f(lastPt.x, lastPt.y), cv::Vec2f(upd.x, upd.y), cv::NORM_L2);
66-
67-
dists.push_back(cv::Vec<track_t, 2>(std::abs<track_t>(pt.x - upd.x), std::abs<track_t>(pt.y - upd.y)));
68-
if (dists.size() > 50)
69-
{
70-
dists.erase(dists.begin());
71-
}
72-
73-
cv::Scalar mean;
74-
cv::Scalar var;
75-
cv::meanStdDev(dists, mean, var);
76-
std::cout << "mean = " << mean << ", var = " << var << std::endl;
77-
78-
#if 0
79-
float angle = atan2(var[0], var[1]);
80-
cv::RotatedRect rr(pred,
81-
cv::Size2f(std::max(10.f, static_cast<track_t>(20.f * var[0])),
82-
std::max(10.f, static_cast<track_t>(20.f * var[1]))),
83-
180.f * angle / CV_PI);
84-
#else
85-
auto vel = kf.GetVelocity();
86-
std::cout << "velocity = " << vel << std::endl;
87-
float angle = atan2(vel[0], vel[1]);
88-
cv::RotatedRect rr(pred,
89-
cv::Size2f(std::max(img.rows / 20.f, static_cast<track_t>(3.f * fabs(vel[0]))),
90-
std::max(img.cols / 20.f, static_cast<track_t>(3.f * fabs(vel[1])))),
91-
180.f * angle / CV_PI);
92-
#endif
93-
cv::ellipse(img, rr, cv::Scalar(100, 100, 100), 1);
94-
95-
std::cout << "orig = " << lastPt << ", noise = " << pt << ", filtered = " << upd << std::endl;
96-
97-
cv::circle(img, lastPt, 2, cv::Scalar(0, 255, 0), 1);
98-
cv::circle(img, pt, 3, cv::Scalar(0, 0, 255), -1);
99-
cv::circle(img, upd, 4, cv::Scalar(255, 0, 0), 1);
100-
cv::imshow("img", img);
101-
cv::waitKey(0);
102-
}
103-
std::cout << "err rand = " << distR << ", err fiiltered = " << distF << std::endl;
104-
cv::waitKey(0);
105-
return 0;
106-
#endif
10737
Help();
10838

10939
cv::CommandLineParser parser(argc, argv, keys);

src/Tracker/Ctracker.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,32 @@ void CTracker::CreateDistaceMatrix(const regions_t& regions, distMatrix_t& costM
169169
size_t ind = 0;
170170
if (m_settings.m_distType[ind] > 0.0f && ind == tracking::DistCenters)
171171
{
172+
#if 1
173+
track_t ellipseDist = track->IsInsideArea(regions[j].m_rrect.center, m_settings.m_minAreaRadius);
174+
if (ellipseDist > 1)
175+
dist += m_settings.m_distType[ind];
176+
else
177+
dist += ellipseDist * m_settings.m_distType[ind];
178+
#else
172179
dist += m_settings.m_distType[ind] * track->CalcDistCenter(regions[j]);
180+
#endif
173181
}
174182
++ind;
175183
if (m_settings.m_distType[ind] > 0.0f && ind == tracking::DistRects)
176184
{
185+
#if 1
186+
track_t ellipseDist = track->IsInsideArea(regions[j].m_rrect.center, m_settings.m_minAreaRadius);
187+
if (ellipseDist > 1)
188+
ellipseDist = 1;
189+
190+
track_t dw = track->WidthDist(regions[j]);
191+
track_t dh = track->HeightDist(regions[j]);
192+
193+
constexpr track_t k = 1.f / 3.f;
194+
dist += m_settings.m_distType[ind] * (ellipseDist + dw + dh) * k;
195+
#else
177196
dist += m_settings.m_distType[ind] * track->CalcDistRect(regions[j]);
197+
#endif
178198
}
179199
++ind;
180200
if (m_settings.m_distType[ind] > 0.0f && ind == tracking::DistJaccard)

src/Tracker/Ctracker.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,15 @@ struct TrackerSettings
4040

4141
///
4242
/// \brief m_distThres
43-
/// Distance threshold for Assignment problem for tracking::DistCenters or for tracking::DistRects (for tracking::DistJaccard it need from 0 to 1)
43+
/// Distance threshold for Assignment problem: from 0 to 1
4444
///
45-
track_t m_distThres = 0.5f;
45+
track_t m_distThres = 0.8f;
46+
47+
///
48+
/// \brief m_minAreaRadius
49+
/// Minimal area radius in pixels for objects centers
50+
///
51+
track_t m_minAreaRadius = 20.f;
4652

4753
///
4854
/// \brief m_maximumAllowedSkippedFrames

src/Tracker/track.cpp

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,16 +204,43 @@ bool CTrack::IsOutOfTheFrame() const
204204

205205
///
206206
/// \brief CTrack::IsInsideArea
207+
/// If result <= 1 then center of the object is inside ellipse with prediction and velocity
207208
/// \param pt
208209
/// \return
209210
///
210-
bool CTrack::IsInsideArea(const Point_t& pt, track_t minVal) const
211+
track_t CTrack::IsInsideArea(const Point_t& pt, track_t minVal) const
211212
{
212213
auto velocity = m_kalman.GetVelocity();
213-
velocity[0] = std::max(minVal, 3 * velocity[0]);
214-
velocity[1] = std::max(minVal, 3 * velocity[1]);
214+
velocity[0] = std::max(minVal, 3 * velocity[0]);
215+
velocity[1] = std::max(minVal, 3 * velocity[1]);
215216
track_t res = sqr(pt.x - m_predictionPoint.x) / sqr(velocity[0]) + sqr(pt.y - m_predictionPoint.y) / sqr(velocity[1]);
216-
return (res <= 1.f);
217+
return res;
218+
}
219+
220+
///
221+
/// \brief CTrack::WidthDist
222+
/// \param reg
223+
/// \return
224+
///
225+
track_t CTrack::WidthDist(const CRegion& reg) const
226+
{
227+
if (m_lastRegion.m_rrect.size.width < reg.m_rrect.size.width)
228+
return 1.f - m_lastRegion.m_rrect.size.width / reg.m_rrect.size.width;
229+
else
230+
return 1.f - reg.m_rrect.size.width / m_lastRegion.m_rrect.size.width;
231+
}
232+
233+
///
234+
/// \brief CTrack::HeightDist
235+
/// \param reg
236+
/// \return
237+
///
238+
track_t CTrack::HeightDist(const CRegion& reg) const
239+
{
240+
if (m_lastRegion.m_rrect.size.height < reg.m_rrect.size.height)
241+
return 1.f - m_lastRegion.m_rrect.size.height / reg.m_rrect.size.height;
242+
else
243+
return 1.f - reg.m_rrect.size.height / m_lastRegion.m_rrect.size.height;
217244
}
218245

219246
///

src/Tracker/track.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,12 +265,22 @@ class CTrack
265265
///
266266
track_t CalcDistHist(const CRegion& reg, cv::UMat currFrame) const;
267267

268+
///
269+
/// \brief IsInsideArea
270+
/// Test point inside in prediction area: prediction area + object velocity
271+
/// \param pt
272+
/// \param minVal
273+
/// \return
274+
///
275+
track_t IsInsideArea(const Point_t& pt, track_t minVal) const;
276+
track_t WidthDist(const CRegion& reg) const;
277+
track_t HeightDist(const CRegion& reg) const;
278+
268279
void Update(const CRegion& region, bool dataCorrect, size_t max_trace_length, cv::UMat prevFrame, cv::UMat currFrame, int trajLen);
269280

270281
bool IsStatic() const;
271282
bool IsStaticTimeout(int framesTime) const;
272283
bool IsOutOfTheFrame() const;
273-
bool IsInsideArea(const Point_t& pt, track_t minVal) const; // Test point inside in prediction area: prediction area + object velocity
274284

275285
cv::RotatedRect GetLastRect() const;
276286

0 commit comments

Comments
 (0)