Skip to content

Commit 9a3a0ca

Browse files
Nuzhny007Smorodov
authored andcommitted
Add method for simple distance (Smorodov#161)
* fixed warning with variable name * Color frames as base, gray frames - optionally * Update TODO * Color tracking by default * Added complex metric between objects with histograms comparing * Default motion detector example with KCF and IoU * Fixed openmp types * Add simple method for one distance type
1 parent cb9e47e commit 9a3a0ca

7 files changed

Lines changed: 45 additions & 36 deletions

File tree

async_detector/AsyncDetector.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f
298298
const int minStaticTime = 5;
299299

300300
TrackerSettings trackerSettings;
301-
trackerSettings.SetDistances({ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f });
301+
trackerSettings.SetDistance(tracking::DistCenters);
302302
trackerSettings.m_kalmanType = tracking::KalmanLinear;
303303
trackerSettings.m_filterGoal = tracking::FilterRect;
304304
trackerSettings.m_lostTrackType = tracking::TrackKCF; // Use KCF tracker for collisions resolving

cars_counting/CarsCounting.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ bool CarsCounting::InitTracker(cv::UMat frame)
259259
m_detector->SetMinObjectSize(cv::Size(m_minObjWidth, m_minObjWidth));
260260

261261
TrackerSettings settings;
262-
settings.SetDistances({ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f });
262+
settings.SetDistance(tracking::DistCenters);
263263
settings.m_kalmanType = tracking::KalmanLinear;
264264
settings.m_filterGoal = tracking::FilterRect;
265265
settings.m_lostTrackType = tracking::TrackCSRT; // Use KCF tracker for collisions resolving

example/MouseExample.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ void MouseTracking(cv::CommandLineParser parser)
4747
cv::setMouseCallback("Video", mv_MouseCallback, (void*)&pointXY);
4848

4949
TrackerSettings settings;
50-
settings.SetDistances({ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f });
50+
settings.SetDistance(tracking::DistCenters);
5151
settings.m_kalmanType = tracking::KalmanLinear;
5252
settings.m_filterGoal = tracking::FilterCenter;
5353
settings.m_lostTrackType = tracking::TrackNone;

example/examples.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@ class MotionDetectorExample : public VideoExample
6060
bool InitTracker(cv::UMat frame)
6161
{
6262
TrackerSettings settings;
63-
settings.SetDistances({ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f });
63+
settings.SetDistance(tracking::DistCenters);
6464
settings.m_kalmanType = tracking::KalmanLinear;
6565
settings.m_filterGoal = tracking::FilterRect;
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 = 0.6f; // frame.rows / 10.f; // Distance threshold between region and object on two frames
70+
settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames
7171

7272
settings.m_useAbandonedDetection = false;
7373
if (settings.m_useAbandonedDetection)
@@ -175,7 +175,7 @@ class FaceDetectorExample : public VideoExample
175175
bool InitTracker(cv::UMat frame)
176176
{
177177
TrackerSettings settings;
178-
settings.SetDistances({ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f });
178+
settings.SetDistance(tracking::DistJaccard);
179179
settings.m_kalmanType = tracking::KalmanUnscented;
180180
settings.m_filterGoal = tracking::FilterRect;
181181
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
@@ -271,7 +271,7 @@ class PedestrianDetectorExample : public VideoExample
271271
bool InitTracker(cv::UMat frame)
272272
{
273273
TrackerSettings settings;
274-
settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f });
274+
settings.SetDistance(tracking::DistRects);
275275
settings.m_kalmanType = tracking::KalmanLinear;
276276
settings.m_filterGoal = tracking::FilterRect;
277277
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
@@ -368,7 +368,7 @@ class SSDMobileNetExample : public VideoExample
368368
bool InitTracker(cv::UMat frame)
369369
{
370370
TrackerSettings settings;
371-
settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f });
371+
settings.SetDistance(tracking::DistRects);
372372
settings.m_kalmanType = tracking::KalmanLinear;
373373
settings.m_filterGoal = tracking::FilterRect;
374374
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
@@ -492,7 +492,7 @@ class YoloExample : public VideoExample
492492
bool InitTracker(cv::UMat frame)
493493
{
494494
TrackerSettings settings;
495-
settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f });
495+
settings.SetDistance(tracking::DistRects);
496496
settings.m_kalmanType = tracking::KalmanLinear;
497497
settings.m_filterGoal = tracking::FilterRect;
498498
settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving
@@ -616,7 +616,7 @@ class YoloDarknetExample : public VideoExample
616616
bool InitTracker(cv::UMat frame)
617617
{
618618
TrackerSettings settings;
619-
settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f });
619+
settings.SetDistance(tracking::DistRects);
620620
settings.m_kalmanType = tracking::KalmanLinear;
621621
settings.m_filterGoal = tracking::FilterRect;
622622
settings.m_lostTrackType = tracking::TrackKCF; // Use visual objects tracker for collisions resolving

src/Tracker/Ctracker.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ void CTracker::UpdateTrackingState(
123123
}
124124

125125
// Update Kalman Filters state
126-
const ptrdiff_t stop_i = static_cast<int>(assignment.size());
126+
const ptrdiff_t stop_i = static_cast<ptrdiff_t>(assignment.size());
127127
#pragma omp parallel for
128-
for (int i = 0; i < stop_i; ++i)
128+
for (ptrdiff_t i = 0; i < stop_i; ++i)
129129
{
130130
// If track updated less than one time, than filter state is not correct.
131131
if (assignment[i] != -1) // If we have assigned detect, then update using its coordinates,
@@ -156,11 +156,11 @@ void CTracker::CreateDistaceMatrix(const regions_t& regions, distMatrix_t& costM
156156
const size_t N = m_tracks.size(); // Tracking objects
157157
maxCost = 0;
158158

159-
for (size_t i = 0; i < m_tracks.size(); i++)
159+
for (size_t i = 0; i < m_tracks.size(); ++i)
160160
{
161161
const auto& track = m_tracks[i];
162162

163-
for (size_t j = 0; j < regions.size(); j++)
163+
for (size_t j = 0; j < regions.size(); ++j)
164164
{
165165
auto dist = maxPossibleCost;
166166
if (m_tracks[i]->CheckType(regions[j].m_type))

src/Tracker/Ctracker.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ struct TrackerSettings
8888
bool CheckDistance() const
8989
{
9090
track_t sum = std::accumulate(m_distType.begin(), m_distType.end(), 0.0f);
91-
track_t maxOne = std::max(1.0f, std::fabs(sum));
92-
return std::fabs(sum - 1.0f) <= std::numeric_limits<track_t>::epsilon() * maxOne;
91+
track_t maxOne = std::max(1.0f, std::fabs(sum));
92+
return std::fabs(sum - 1.0f) <= std::numeric_limits<track_t>::epsilon() * maxOne;
9393
}
9494

9595
///
@@ -105,6 +105,14 @@ struct TrackerSettings
105105
}
106106
return res;
107107
}
108+
109+
///
110+
bool SetDistance(tracking::DistType distType)
111+
{
112+
std::fill(m_distType.begin(), m_distType.end(), 0.0f);
113+
m_distType[distType] = 1.f;
114+
return true;
115+
}
108116
};
109117

110118
///
@@ -114,9 +122,9 @@ class CTracker
114122
{
115123
public:
116124
CTracker(const TrackerSettings& settings);
117-
CTracker(const CTracker&) = delete;
118-
CTracker(CTracker&&) = delete;
119-
CTracker& operator=(const CTracker&) = delete;
125+
CTracker(const CTracker&) = delete;
126+
CTracker(CTracker&&) = delete;
127+
CTracker& operator=(const CTracker&) = delete;
120128
CTracker& operator=(CTracker&&) = delete;
121129

122130
~CTracker(void);

src/Tracker/track.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,28 +101,29 @@ track_t CTrack::CalcDistHist(const CRegion& reg, cv::UMat currFrame) const
101101
{
102102
track_t res = 1;
103103

104-
if (reg.m_hist.empty())
105-
{
106-
int bins = 64;
107-
std::vector<int> histSize;
108-
std::vector<float> ranges;
109-
std::vector<int> channels;
110-
111-
for (int i = 0, stop = currFrame.channels(); i < stop; ++i)
112-
{
113-
histSize.push_back(bins);
114-
ranges.push_back(0);
115-
ranges.push_back(255);
116-
channels.push_back(i);
117-
}
118-
119-
std::vector<cv::UMat> regROI = { currFrame(reg.m_brect) };
120-
cv::calcHist(regROI, channels, cv::Mat(), reg.m_hist, histSize, ranges, false);
104+
if (reg.m_hist.empty())
105+
{
106+
int bins = 64;
107+
std::vector<int> histSize;
108+
std::vector<float> ranges;
109+
std::vector<int> channels;
110+
111+
for (int i = 0, stop = currFrame.channels(); i < stop; ++i)
112+
{
113+
histSize.push_back(bins);
114+
ranges.push_back(0);
115+
ranges.push_back(255);
116+
channels.push_back(i);
117+
}
118+
119+
std::vector<cv::UMat> regROI = { currFrame(reg.m_brect) };
120+
cv::calcHist(regROI, channels, cv::Mat(), reg.m_hist, histSize, ranges, false);
121121
cv::normalize(reg.m_hist, reg.m_hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
122122
}
123123
if (!reg.m_hist.empty() && !m_lastRegion.m_hist.empty())
124124
{
125125
res = static_cast<track_t>(cv::compareHist(reg.m_hist, m_lastRegion.m_hist, CV_COMP_BHATTACHARYYA));
126+
//res = 1.f - static_cast<track_t>(cv::compareHist(reg.m_hist, m_lastRegion.m_hist, CV_COMP_CORREL));
126127
}
127128

128129
return res;

0 commit comments

Comments
 (0)