diff --git a/async_detector/AsyncDetector.cpp b/async_detector/AsyncDetector.cpp index dee3b50c8..a3367ffeb 100644 --- a/async_detector/AsyncDetector.cpp +++ b/async_detector/AsyncDetector.cpp @@ -298,7 +298,7 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f const int minStaticTime = 5; TrackerSettings trackerSettings; - trackerSettings.SetDistances({ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }); + trackerSettings.SetDistance(tracking::DistCenters); trackerSettings.m_kalmanType = tracking::KalmanLinear; trackerSettings.m_filterGoal = tracking::FilterRect; trackerSettings.m_lostTrackType = tracking::TrackKCF; // Use KCF tracker for collisions resolving diff --git a/cars_counting/CarsCounting.cpp b/cars_counting/CarsCounting.cpp index d87652c13..29726d4d4 100644 --- a/cars_counting/CarsCounting.cpp +++ b/cars_counting/CarsCounting.cpp @@ -259,7 +259,7 @@ bool CarsCounting::InitTracker(cv::UMat frame) m_detector->SetMinObjectSize(cv::Size(m_minObjWidth, m_minObjWidth)); TrackerSettings settings; - settings.SetDistances({ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistCenters); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackCSRT; // Use KCF tracker for collisions resolving diff --git a/example/MouseExample.h b/example/MouseExample.h index e2eab7c92..5e8712719 100644 --- a/example/MouseExample.h +++ b/example/MouseExample.h @@ -47,7 +47,7 @@ void MouseTracking(cv::CommandLineParser parser) cv::setMouseCallback("Video", mv_MouseCallback, (void*)&pointXY); TrackerSettings settings; - settings.SetDistances({ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistCenters); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterCenter; settings.m_lostTrackType = tracking::TrackNone; diff --git a/example/examples.h b/example/examples.h index 61b40e4f8..0e9ed3249 100644 --- a/example/examples.h +++ b/example/examples.h @@ -60,14 +60,14 @@ class MotionDetectorExample : public VideoExample bool InitTracker(cv::UMat frame) { TrackerSettings settings; - settings.SetDistances({ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistCenters); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackKCF; // Use visual objects tracker for collisions resolving settings.m_matchType = tracking::MatchHungrian; settings.m_dt = 0.4f; // Delta time for Kalman filter settings.m_accelNoiseMag = 0.5f; // Accel noise magnitude for Kalman filter - settings.m_distThres = 0.6f; // frame.rows / 10.f; // Distance threshold between region and object on two frames + settings.m_distThres = frame.rows / 10.f; // Distance threshold between region and object on two frames settings.m_useAbandonedDetection = false; if (settings.m_useAbandonedDetection) @@ -175,7 +175,7 @@ class FaceDetectorExample : public VideoExample bool InitTracker(cv::UMat frame) { TrackerSettings settings; - settings.SetDistances({ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistJaccard); settings.m_kalmanType = tracking::KalmanUnscented; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving @@ -271,7 +271,7 @@ class PedestrianDetectorExample : public VideoExample bool InitTracker(cv::UMat frame) { TrackerSettings settings; - settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistRects); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving @@ -368,7 +368,7 @@ class SSDMobileNetExample : public VideoExample bool InitTracker(cv::UMat frame) { TrackerSettings settings; - settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistRects); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving @@ -492,7 +492,7 @@ class YoloExample : public VideoExample bool InitTracker(cv::UMat frame) { TrackerSettings settings; - settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistRects); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving @@ -616,7 +616,7 @@ class YoloDarknetExample : public VideoExample bool InitTracker(cv::UMat frame) { TrackerSettings settings; - settings.SetDistances({ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }); + settings.SetDistance(tracking::DistRects); settings.m_kalmanType = tracking::KalmanLinear; settings.m_filterGoal = tracking::FilterRect; settings.m_lostTrackType = tracking::TrackKCF; // Use visual objects tracker for collisions resolving diff --git a/src/Tracker/Ctracker.cpp b/src/Tracker/Ctracker.cpp index 2780b1b34..e9c45f927 100644 --- a/src/Tracker/Ctracker.cpp +++ b/src/Tracker/Ctracker.cpp @@ -123,9 +123,9 @@ void CTracker::UpdateTrackingState( } // Update Kalman Filters state - const ptrdiff_t stop_i = static_cast(assignment.size()); + const ptrdiff_t stop_i = static_cast(assignment.size()); #pragma omp parallel for - for (int i = 0; i < stop_i; ++i) + for (ptrdiff_t i = 0; i < stop_i; ++i) { // If track updated less than one time, than filter state is not correct. 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 const size_t N = m_tracks.size(); // Tracking objects maxCost = 0; - for (size_t i = 0; i < m_tracks.size(); i++) + for (size_t i = 0; i < m_tracks.size(); ++i) { const auto& track = m_tracks[i]; - for (size_t j = 0; j < regions.size(); j++) + for (size_t j = 0; j < regions.size(); ++j) { auto dist = maxPossibleCost; if (m_tracks[i]->CheckType(regions[j].m_type)) diff --git a/src/Tracker/Ctracker.h b/src/Tracker/Ctracker.h index f1b88b674..41e7932b1 100644 --- a/src/Tracker/Ctracker.h +++ b/src/Tracker/Ctracker.h @@ -88,8 +88,8 @@ struct TrackerSettings bool CheckDistance() const { track_t sum = std::accumulate(m_distType.begin(), m_distType.end(), 0.0f); - track_t maxOne = std::max(1.0f, std::fabs(sum)); - return std::fabs(sum - 1.0f) <= std::numeric_limits::epsilon() * maxOne; + track_t maxOne = std::max(1.0f, std::fabs(sum)); + return std::fabs(sum - 1.0f) <= std::numeric_limits::epsilon() * maxOne; } /// @@ -105,6 +105,14 @@ struct TrackerSettings } return res; } + + /// + bool SetDistance(tracking::DistType distType) + { + std::fill(m_distType.begin(), m_distType.end(), 0.0f); + m_distType[distType] = 1.f; + return true; + } }; /// @@ -114,9 +122,9 @@ class CTracker { public: CTracker(const TrackerSettings& settings); - CTracker(const CTracker&) = delete; - CTracker(CTracker&&) = delete; - CTracker& operator=(const CTracker&) = delete; + CTracker(const CTracker&) = delete; + CTracker(CTracker&&) = delete; + CTracker& operator=(const CTracker&) = delete; CTracker& operator=(CTracker&&) = delete; ~CTracker(void); diff --git a/src/Tracker/track.cpp b/src/Tracker/track.cpp index cc27febac..3f4c5f625 100644 --- a/src/Tracker/track.cpp +++ b/src/Tracker/track.cpp @@ -101,28 +101,29 @@ track_t CTrack::CalcDistHist(const CRegion& reg, cv::UMat currFrame) const { track_t res = 1; - if (reg.m_hist.empty()) - { - int bins = 64; - std::vector histSize; - std::vector ranges; - std::vector channels; - - for (int i = 0, stop = currFrame.channels(); i < stop; ++i) - { - histSize.push_back(bins); - ranges.push_back(0); - ranges.push_back(255); - channels.push_back(i); - } - - std::vector regROI = { currFrame(reg.m_brect) }; - cv::calcHist(regROI, channels, cv::Mat(), reg.m_hist, histSize, ranges, false); + if (reg.m_hist.empty()) + { + int bins = 64; + std::vector histSize; + std::vector ranges; + std::vector channels; + + for (int i = 0, stop = currFrame.channels(); i < stop; ++i) + { + histSize.push_back(bins); + ranges.push_back(0); + ranges.push_back(255); + channels.push_back(i); + } + + std::vector regROI = { currFrame(reg.m_brect) }; + cv::calcHist(regROI, channels, cv::Mat(), reg.m_hist, histSize, ranges, false); cv::normalize(reg.m_hist, reg.m_hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat()); } if (!reg.m_hist.empty() && !m_lastRegion.m_hist.empty()) { res = static_cast(cv::compareHist(reg.m_hist, m_lastRegion.m_hist, CV_COMP_BHATTACHARYYA)); + //res = 1.f - static_cast(cv::compareHist(reg.m_hist, m_lastRegion.m_hist, CV_COMP_CORREL)); } return res;