From 0e3565052ce6db176c34c448a7368b463d318558 Mon Sep 17 00:00:00 2001 From: Peng Li Date: Tue, 17 Jul 2018 14:45:50 +0800 Subject: [PATCH] unify the interface with detector --- src/Detector.cpp | 1 + src/Detector.h | 20 +++++++++++++++++++- src/Engine.cpp | 7 +++++-- src/Engine.h | 2 +- src/Metrics.cpp | 3 ++- src/Metrics.h | 4 ++-- src/MultiTracker.cpp | 40 +++++++++++++++++++++++++++++++++++++++- src/MultiTracker.h | 14 +++++++++----- src/Tracker.cpp | 16 ++++++++++++++++ src/Tracker.h | 14 +++++++++++++- src/VideoReader.cpp | 21 ++++++++------------- 11 files changed, 115 insertions(+), 27 deletions(-) diff --git a/src/Detector.cpp b/src/Detector.cpp index c2a1e20..ec4f8b0 100644 --- a/src/Detector.cpp +++ b/src/Detector.cpp @@ -1,6 +1,7 @@ #include "Detector.h" using namespace suanzi; +using namespace cv; Detector::Detector() { diff --git a/src/Detector.h b/src/Detector.h index 5cf08c1..edf875c 100644 --- a/src/Detector.h +++ b/src/Detector.h @@ -6,13 +6,31 @@ namespace suanzi { + struct Detection; + TK_DECLARE_PTR(Detector); class Detector { public: Detector(); virtual ~Detector(); - void detect(cv::Mat& frame){}; + unsigned int detect(cv::Mat& frame, Detection* detections){return 1;} + }; + + struct Detection + { + // 检测目标的类型,目前只有一个类human,默认等于0。为以后可以检测的更多类别预留 + unsigned int object_type; + // 检测目标的分数,可以不填 + float score; + // 检测目标的坐标,包括物体中心的x、y坐标,物体的高和宽 + unsigned int center_x; + unsigned int center_y; + unsigned int height; + unsigned int width; + // 检测目标的特征向量 + unsigned int feature_size; + float * feature; }; } diff --git a/src/Engine.cpp b/src/Engine.cpp index be5ceda..49a17da 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -42,7 +42,7 @@ void Engine::destroy() void Engine::setVideoSrc(VideoSrcType type, const std::string& url) { - videoSrc = url; +// videoSrc = url; reader = VideoReaderFactory::createVideoReader(type, url); } @@ -50,9 +50,12 @@ void Engine::run() { LOG_DEBUG(TAG, "run"); cv::Mat frame; + Detection detections[128]; while (reader->read(frame)){ LOG_DEBUG(TAG, "Size: " << frame.cols << "x" << frame.rows); - detector->detect(frame); + // TODO + int total = detector->detect(frame, detections); + multiTracker->update(total, detections, frame); } } diff --git a/src/Engine.h b/src/Engine.h index bcfc786..5405539 100644 --- a/src/Engine.h +++ b/src/Engine.h @@ -33,7 +33,7 @@ private: DetectorPtr detector; MultiTrackerPtr multiTracker; std::set observer_list; - std::string videoSrc; + //std::string videoSrc; VideoReaderPtr reader; }; diff --git a/src/Metrics.cpp b/src/Metrics.cpp index 37a3f9f..7c451f1 100644 --- a/src/Metrics.cpp +++ b/src/Metrics.cpp @@ -5,8 +5,9 @@ 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 index a436321..c991d9f 100644 --- a/src/Metrics.h +++ b/src/Metrics.h @@ -14,11 +14,11 @@ namespace suanzi { public: Metrics(const std::string& cl_path = ""); ~Metrics(){} - long int MaxCost = 100000; + const static long int MaxCost = 100000; const static int MaxPatch = 5; private: - cv::HOGDescriptor descriptor; + cv::HOGDescriptor descriptor = {cv::Size(64, 128), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9}; }; class Patch diff --git a/src/MultiTracker.cpp b/src/MultiTracker.cpp index e52b8e2..8df378f 100644 --- a/src/MultiTracker.cpp +++ b/src/MultiTracker.cpp @@ -1,7 +1,9 @@ #include "MultiTracker.h" #include "Metrics.h" +#include using namespace suanzi; +using namespace cv; MultiTracker::MultiTracker(MetricsPtr m) : metrics(m) { @@ -30,8 +32,44 @@ void MultiTracker::removeTracker(TrackerPtr t) trackers.erase(t); } +void MultiTracker::initNewTrackers(cv::Mat& iamge) +{ +} + -void MultiTracker::update() +void MultiTracker::correctTrackers(MetricsPtr m, Mat& image) { +} + + +void MultiTracker::update(unsigned int total, const Detection* d, const Mat& image) +{ + + // correct_trackers + + + // + + + + + + + + + // Delete long lost trackers; +// for (auto& t : trackers){ +// if (t->status == TrackerStatus::Delete) +// trackers.erase(t); +// } +// + // Update trackers using kalman filter +// for(auto& t: trackers){ +// //t.bb_ltrb = +// } +// + // associate trackers with detections +// correctTrackers(this->metric, image); + // create new trackers for new detections } diff --git a/src/MultiTracker.h b/src/MultiTracker.h index 28ab685..0fd1d3a 100644 --- a/src/MultiTracker.h +++ b/src/MultiTracker.h @@ -2,8 +2,10 @@ #define _MULTI_TRACKER_H_ #include "Tracker.h" +#include "Detector.h" #include "Metrics.h" #include "SharedPtr.h" +#include namespace suanzi { @@ -14,15 +16,17 @@ namespace suanzi { public: MultiTracker(MetricsPtr m); virtual ~MultiTracker(); - void addTracker(TrackerPtr t); - void removeTracker(TrackerPtr t); - TrackerPtr createTracker(int id = 0); - void update(); - + void update(unsigned int total, const Detection* d, const cv::Mat& image); + private: MetricsPtr metrics; std::set trackers; int max_id = 0; + void addTracker(TrackerPtr t); + TrackerPtr createTracker(int id = 0); + void removeTracker(TrackerPtr t); + void correctTrackers(MetricsPtr m, cv::Mat& image); + void initNewTrackers(cv::Mat& iamge); }; diff --git a/src/Tracker.cpp b/src/Tracker.cpp index 2d353a7..27dd400 100644 --- a/src/Tracker.cpp +++ b/src/Tracker.cpp @@ -9,6 +9,22 @@ Tracker::Tracker(int id) : id(id) { status = TrackerStatus::Fire; preStatus = TrackerStatus::Fire; + + // TODO + // init KalmanFilter + this->kf.transitionMatrix = (Mat_(4, 4) << + 1, 0, 1, 0, + 0, 1, 0, 1, + 0, 0, 1, 0, + 0, 0, 0, 1); + + this->kf.measurementMatrix = (Mat_(2, 2) << + 1, 0, 0, 0, + 0, 1, 0, 0); + + this->kf.processNoiseCov = 1e-5 * Mat_::eye(4, 4); + this->kf.measurementNoiseCov = 1e-1 * Mat_::ones(2, 2); + this->kf.errorCovPost = 1. * Mat_::ones(4, 4); } Tracker::~Tracker() diff --git a/src/Tracker.h b/src/Tracker.h index 262ae5f..490201a 100644 --- a/src/Tracker.h +++ b/src/Tracker.h @@ -18,6 +18,7 @@ namespace suanzi { } TrackerStatus; TK_DECLARE_PTR(Tracker); +// TK_DECLARE_PTR(KalmanFilter); class Tracker { public: @@ -25,16 +26,27 @@ namespace suanzi { virtual ~Tracker(); void updateState(const cv::Mat& image); void addPatch(Patch* p); + TrackerStatus status; private: - TrackerStatus status; TrackerStatus preStatus; int id; int age; int last_active; std::vector patches; + cv::KalmanFilter kf = {4,2}; }; +// class KalmanFilter +// { +// public: +// KalmanFilter(); +// ~KalmanFilter(); +// private: +// cv::KalmanFilter +// +// }; + } diff --git a/src/VideoReader.cpp b/src/VideoReader.cpp index 17d5518..b965fa1 100644 --- a/src/VideoReader.cpp +++ b/src/VideoReader.cpp @@ -8,26 +8,21 @@ const static std::string TAG = "VideoReader"; VideoReaderPtr VideoReaderFactory::createVideoReader(VideoSrcType type, const std::string& url) { + VideoReaderPtr v; switch(type){ case VideoSrcType::URL: - { - VideoReaderPtr v (new UrlReader(type, url)); - return v; - } + v = std::make_shared(type, url); + break; case VideoSrcType::File: - { - VideoReaderPtr v (new FileReader(type, url)); - return v; - } + v = std::make_shared(type, url); + break; case VideoSrcType::USB: - { - VideoReaderPtr v (new UsbReader(type, url)); - return v; - } + v = std::make_shared(type, url); + break; default: break; } - return nullptr; + return v; } VideoReader::~VideoReader() -- 2.11.0