From 5675c1a74ffcb95725eb11463e51cfebbc88a15e Mon Sep 17 00:00:00 2001 From: Peng Li Date: Tue, 10 Jul 2018 19:06:13 +0800 Subject: [PATCH] Add multitracker and metrics --- src/Engine.cpp | 4 ++-- src/Engine.h | 2 +- src/Metrics.cpp | 12 ++++++++++++ src/Metrics.h | 30 ++++++++++++++++++++++++++++++ src/MultiTracker.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/MultiTracker.h | 29 +++++++++++++++++++++++++++++ src/Tracker.cpp | 30 +++++++++++++++++++++++++++++- src/Tracker.h | 26 +++++++++++++++++++++++++- src/VideoReader.cpp | 3 ++- 9 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/Metrics.cpp create mode 100644 src/Metrics.h create mode 100644 src/MultiTracker.cpp create mode 100644 src/MultiTracker.h diff --git a/src/Engine.cpp b/src/Engine.cpp index c044ab7..82fed4a 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -13,7 +13,6 @@ static Engine* g_instance = nullptr; Engine::Engine() { detector = new Detector(); - tracker = new Tracker(); } Engine* Engine::create() @@ -36,7 +35,7 @@ void Engine::destroy() Engine::~Engine() { delete detector; - delete tracker; +// delete tracker; } void Engine::setVideoSrc(VideoSrcType type, const std::string& url) @@ -50,6 +49,7 @@ void Engine::run() LOG_DEBUG(TAG, "run"); cv::Mat frame; while (reader->read(frame)){ + LOG_DEBUG(TAG, "Size: " << frame.cols << "x" << frame.rows); detector->detect(frame); } } diff --git a/src/Engine.h b/src/Engine.h index a0da903..ebf65c5 100644 --- a/src/Engine.h +++ b/src/Engine.h @@ -25,7 +25,7 @@ private: Engine(); virtual ~Engine(); void run(); - Tracker* tracker; +// Tracker* tracker; Detector* detector; std::set observer_list; std::string videoSrc; diff --git a/src/Metrics.cpp b/src/Metrics.cpp new file mode 100644 index 0000000..37a3f9f --- /dev/null +++ b/src/Metrics.cpp @@ -0,0 +1,12 @@ +#include "Metrics.h" + +using namespace suanzi; +using namespace cv; + +Metrics::Metrics(const std::string& clf_path) +{ + descriptor = HOGDescriptor(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9); + if (clf_path.empty()){ + } else { + } +} diff --git a/src/Metrics.h b/src/Metrics.h new file mode 100644 index 0000000..dbfca55 --- /dev/null +++ b/src/Metrics.h @@ -0,0 +1,30 @@ +#ifndef _METRICS_H_ +#define _METRICS_H_ + +#include +#include + +namespace suanzi { + +class Metrics +{ +public: + Metrics(const std::string& cl_path = ""); + ~Metrics(){} + long int MaxCost = 100000; + const static int MaxPatch = 5; + +private: + cv::HOGDescriptor descriptor; +}; + +class Patch +{ +public: + Patch(){}; + ~Patch(){}; +}; + +} + +#endif /* _METRICS_H_ */ diff --git a/src/MultiTracker.cpp b/src/MultiTracker.cpp new file mode 100644 index 0000000..2206af3 --- /dev/null +++ b/src/MultiTracker.cpp @@ -0,0 +1,38 @@ +#include "MultiTracker.h" +#include "Metrics.h" + +using namespace suanzi; + +MultiTracker::MultiTracker(Metrics* m) : metrics(m) +{ +} + + +MultiTracker::~MultiTracker() +{ + delete metrics; + trackers.clear(); +} + +Tracker* MultiTracker::createTracker(int id) +{ + Tracker* t = new Tracker(id); + addTracker(t); + return t; +} + +void MultiTracker::addTracker(Tracker* t) +{ + trackers.insert(t); +} + +void MultiTracker::removeTracker(Tracker *t) +{ + trackers.erase(t); +} + + +void MultiTracker::update() +{ + +} diff --git a/src/MultiTracker.h b/src/MultiTracker.h new file mode 100644 index 0000000..5fc13f9 --- /dev/null +++ b/src/MultiTracker.h @@ -0,0 +1,29 @@ +#ifndef _MULTI_TRACKER_H_ +#define _MULTI_TRACKER_H_ + +#include "Tracker.h" +#include "Metrics.h" + +namespace suanzi { + +class MultiTracker +{ +public: + MultiTracker(Metrics* m); + virtual ~MultiTracker(); + void addTracker(Tracker *t); + void removeTracker(Tracker *t); + Tracker* createTracker(int id = 0); + void update(); + + +private: + Metrics* metrics; + std::set trackers; + int max_id = 0; +}; + + +} + +#endif /* _MULTI_TRACKER_H_ */ diff --git a/src/Tracker.cpp b/src/Tracker.cpp index 79fd941..2d353a7 100644 --- a/src/Tracker.cpp +++ b/src/Tracker.cpp @@ -1,11 +1,39 @@ #include "Tracker.h" using namespace suanzi; +using namespace cv; -Tracker::Tracker() +static const int MaxLost = 5; + +Tracker::Tracker(int id) : id(id) { + status = TrackerStatus::Fire; + preStatus = TrackerStatus::Fire; } Tracker::~Tracker() { } + +void Tracker::addPatch(Patch* p) +{ + patches.push_back(p); + if (patches.size() > Metrics::MaxPatch){ + patches.erase(patches.end()); + } +} + +void Tracker::updateState(const Mat& image) +{ + preStatus = this->status; + int lost_age = this->age - this->last_active; + int active_age = this->last_active; + + if (lost_age >= MaxLost){ + status = TrackerStatus::Delete; + } else if (lost_age >= 1 && active_age == 1){ + status = TrackerStatus::Delete; + } else if (lost_age >= 1) { + status = TrackerStatus::Lost; + } +} diff --git a/src/Tracker.h b/src/Tracker.h index 57fe765..c87f465 100644 --- a/src/Tracker.h +++ b/src/Tracker.h @@ -1,15 +1,39 @@ #ifndef _TRACKER_H_ #define _TRACKER_H_ +#include +#include +#include +#include "Metrics.h" + namespace suanzi { +typedef enum +{ + Fire = -1, + Active = 2, + Lost, + Delete +} TrackerStatus; + class Tracker { public: - Tracker(); + Tracker(int id); virtual ~Tracker(); + void updateState(const cv::Mat& image); + void addPatch(Patch* p); + +private: + TrackerStatus status; + TrackerStatus preStatus; + int id; + int age; + int last_active; + std::vector patches; }; + } #endif /* _TRACKER_H_ */ diff --git a/src/VideoReader.cpp b/src/VideoReader.cpp index 90e3d8a..0945527 100644 --- a/src/VideoReader.cpp +++ b/src/VideoReader.cpp @@ -39,11 +39,12 @@ UrlReader::UrlReader(VideoSrcType type, const std::string& url) : VideoReader(ty LOG_ERROR(TAG, "open video " + url); throw std::runtime_error("Cannot open video url " + url); } - LOG_DEBUG(TAG, "reader video sourc succeed."); + LOG_DEBUG(TAG, "reader video sourc succeed. "); } UrlReader::~UrlReader() { + vcap.release(); } bool UrlReader::read(cv::Mat& mat) -- 2.11.0