Skip to content

Commit ab77315

Browse files
committed
Max speed threshold for static objects
1 parent bbbe0e4 commit ab77315

6 files changed

Lines changed: 36 additions & 24 deletions

File tree

data/settings.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,5 @@ detect_abandoned = 0
8383
min_static_time = 5
8484
# After this time (in seconds) the abandoned object will be removed
8585
max_static_time = 25
86+
# Speed in pixels. If speed of object is more that this value than object is non static
87+
max_speed_for_static = 10

example/VideoExample.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ bool VideoExample::ParseTrackerSettings(const std::string& settingsFile)
7878
m_trackerSettings.m_useAbandonedDetection = reader.GetInteger("tracking", "detect_abandoned", 0) != 0;
7979
m_trackerSettings.m_minStaticTime = reader.GetInteger("tracking", "min_static_time", 5);
8080
m_trackerSettings.m_maxStaticTime = reader.GetInteger("tracking", "max_static_time", 25);
81+
m_trackerSettings.m_maxSpeedForStatic = reader.GetInteger("tracking", "max_speed_for_static", 10);
8182

8283
return true;
8384
}

src/Tracker/Ctracker.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,16 @@ void CTracker::UpdateTrackingState(const regions_t& regions,
150150
m_tracks[i]->Update(regions[assignment[i]],
151151
true, m_settings.m_maxTraceLength,
152152
m_prevFrame, currFrame,
153-
m_settings.m_useAbandonedDetection ? cvRound(m_settings.m_minStaticTime * fps) : 0);
153+
m_settings.m_useAbandonedDetection ? cvRound(m_settings.m_minStaticTime * fps) : 0, m_settings.m_maxSpeedForStatic);
154154
else
155155
m_tracks[i]->Update(regions[assignment[i]], regionEmbeddings[assignment[i]],
156156
true, m_settings.m_maxTraceLength,
157157
m_prevFrame, currFrame,
158-
m_settings.m_useAbandonedDetection ? cvRound(m_settings.m_minStaticTime * fps) : 0);
158+
m_settings.m_useAbandonedDetection ? cvRound(m_settings.m_minStaticTime * fps) : 0, m_settings.m_maxSpeedForStatic);
159159
}
160160
else // if not continue using predictions
161161
{
162-
m_tracks[i]->Update(CRegion(), false, m_settings.m_maxTraceLength, m_prevFrame, currFrame, 0);
162+
m_tracks[i]->Update(CRegion(), false, m_settings.m_maxTraceLength, m_prevFrame, currFrame, 0, m_settings.m_maxSpeedForStatic);
163163
}
164164
}
165165
}

src/Tracker/Ctracker.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct TrackerSettings
2121
{
2222
tracking::KalmanType m_kalmanType = tracking::KalmanLinear;
2323
tracking::FilterGoal m_filterGoal = tracking::FilterCenter;
24-
tracking::LostTrackType m_lostTrackType = tracking::TrackKCF;
24+
tracking::LostTrackType m_lostTrackType = tracking::TrackKCF; // Used if m_filterGoal == tracking::FilterRect
2525
tracking::MatchType m_matchType = tracking::MatchHungrian;
2626

2727
std::array<track_t, tracking::DistsCount> m_distType;
@@ -90,6 +90,12 @@ struct TrackerSettings
9090
/// After this time (in seconds) the abandoned object will be removed
9191
///
9292
int m_maxStaticTime = 25;
93+
///
94+
/// \brief m_maxSpeedForStatic
95+
/// Speed in pixels
96+
/// If speed of object is more that this value than object is non static
97+
///
98+
int m_maxSpeedForStatic = 10;
9399

94100
///
95101
/// \brief m_nearTypes

src/Tracker/track.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ void CTrack::Update(const CRegion& region,
181181
size_t max_trace_length,
182182
cv::UMat prevFrame,
183183
cv::UMat currFrame,
184-
int trajLen)
184+
int trajLen, int maxSpeedForStatic)
185185
{
186186
if (m_filterObjectSize) // Kalman filter for object coordinates and size
187187
RectUpdate(region, dataCorrect, prevFrame, currFrame);
@@ -195,7 +195,7 @@ void CTrack::Update(const CRegion& region,
195195
m_lastRegion = region;
196196
m_trace.push_back(m_predictionPoint, region.m_rrect.center);
197197

198-
CheckStatic(trajLen, currFrame, region);
198+
CheckStatic(trajLen, currFrame, region, maxSpeedForStatic);
199199
}
200200
else
201201
{
@@ -222,7 +222,7 @@ void CTrack::Update(const CRegion& region,
222222
size_t max_trace_length,
223223
cv::UMat prevFrame,
224224
cv::UMat currFrame,
225-
int trajLen)
225+
int trajLen, int maxSpeedForStatic)
226226
{
227227
m_regionEmbedding = regionEmbedding;
228228

@@ -238,7 +238,7 @@ void CTrack::Update(const CRegion& region,
238238
m_lastRegion = region;
239239
m_trace.push_back(m_predictionPoint, m_lastRegion.m_rrect.center);
240240

241-
CheckStatic(trajLen, currFrame, region);
241+
CheckStatic(trajLen, currFrame, region, maxSpeedForStatic);
242242
}
243243
else
244244
{
@@ -355,7 +355,7 @@ track_t CTrack::HeightDist(const CRegion& reg) const
355355
/// \param trajLen
356356
/// \return
357357
///
358-
bool CTrack::CheckStatic(int trajLen, cv::UMat currFrame, const CRegion& region)
358+
bool CTrack::CheckStatic(int trajLen, cv::UMat currFrame, const CRegion& region, int maxSpeedForStatic)
359359
{
360360
if (!trajLen || static_cast<int>(m_trace.size()) < trajLen)
361361
{
@@ -366,9 +366,8 @@ bool CTrack::CheckStatic(int trajLen, cv::UMat currFrame, const CRegion& region)
366366
else
367367
{
368368
auto velocity = m_kalman.GetVelocity();
369-
track_t speed = sqrt(sqr(velocity[0] * trajLen) + sqr(velocity[1] * trajLen));
370-
const track_t speedThresh = 10;
371-
if (speed < speedThresh)
369+
track_t speed = sqrt(sqr(velocity[0]) + sqr(velocity[1]));
370+
if (speed < maxSpeedForStatic)
372371
{
373372
if (!m_isStatic)
374373
{

src/Tracker/track.h

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,12 @@ class CTrack
310310
track_t WidthDist(const CRegion& reg) const;
311311
track_t HeightDist(const CRegion& reg) const;
312312

313-
void Update(const CRegion& region, bool dataCorrect, size_t max_trace_length, cv::UMat prevFrame, cv::UMat currFrame, int trajLen);
314-
void Update(const CRegion& region, const RegionEmbedding& regionEmbedding, bool dataCorrect, size_t max_trace_length, cv::UMat prevFrame, cv::UMat currFrame, int trajLen);
313+
void Update(const CRegion& region, bool dataCorrect, size_t max_trace_length, cv::UMat prevFrame, cv::UMat currFrame, int trajLen, int maxSpeedForStatic);
314+
void Update(const CRegion& region, const RegionEmbedding& regionEmbedding, bool dataCorrect, size_t max_trace_length, cv::UMat prevFrame, cv::UMat currFrame, int trajLen, int maxSpeedForStatic);
315315

316316
bool IsStatic() const;
317317
bool IsStaticTimeout(int framesTime) const;
318-
bool IsOutOfTheFrame() const;
318+
bool IsOutOfTheFrame() const;
319319

320320
cv::RotatedRect GetLastRect() const;
321321

@@ -328,9 +328,9 @@ class CTrack
328328
TrackingObject ConstructObject() const;
329329

330330
private:
331-
TKalmanFilter m_kalman;
332-
CRegion m_lastRegion;
333-
Trace m_trace;
331+
TKalmanFilter m_kalman;
332+
CRegion m_lastRegion;
333+
Trace m_trace;
334334
cv::RotatedRect m_predictionRect;
335335
Point_t m_predictionPoint;
336336

@@ -343,22 +343,26 @@ class CTrack
343343
#endif
344344
std::unique_ptr<VOTTracker> m_VOTTracker;
345345

346+
///
346347
void RectUpdate(const CRegion& region, bool dataCorrect, cv::UMat prevFrame, cv::UMat currFrame);
347348

349+
///
348350
void CreateExternalTracker(int channels);
349351

352+
///
350353
void PointUpdate(const Point_t& pt, const cv::Size& newObjSize, bool dataCorrect, const cv::Size& frameSize);
351354

352355
RegionEmbedding m_regionEmbedding;
353356

354-
bool CheckStatic(int trajLen, cv::UMat currFrame, const CRegion& region);
355-
cv::UMat m_staticFrame;
356-
cv::Rect m_staticRect;
357+
///
358+
bool CheckStatic(int trajLen, cv::UMat currFrame, const CRegion& region, int maxSpeedForStatic);
359+
cv::UMat m_staticFrame;
360+
cv::Rect m_staticRect;
357361
int m_staticFrames = 0;
358-
bool m_isStatic = false;
362+
bool m_isStatic = false;
359363

360-
bool m_filterObjectSize = false;
361-
bool m_outOfTheFrame = false;
364+
bool m_filterObjectSize = false;
365+
bool m_outOfTheFrame = false;
362366
};
363367

364368
typedef std::vector<std::unique_ptr<CTrack>> tracks_t;

0 commit comments

Comments
 (0)