Add multitracker and metrics
authorPeng Li <seudut@gmail.com>
Tue, 10 Jul 2018 11:06:13 +0000 (19:06 +0800)
committerPeng Li <seudut@gmail.com>
Tue, 10 Jul 2018 11:06:13 +0000 (19:06 +0800)
src/Engine.cpp
src/Engine.h
src/Metrics.cpp [new file with mode: 0644]
src/Metrics.h [new file with mode: 0644]
src/MultiTracker.cpp [new file with mode: 0644]
src/MultiTracker.h [new file with mode: 0644]
src/Tracker.cpp
src/Tracker.h
src/VideoReader.cpp

index c044ab7..82fed4a 100644 (file)
@@ -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);
     }
 }
index a0da903..ebf65c5 100644 (file)
@@ -25,7 +25,7 @@ private:
     Engine();
     virtual ~Engine();
     void run();
-    Tracker* tracker;
+//    Tracker* tracker;
     Detector* detector;
     std::set<EngineObserver *> observer_list;
     std::string videoSrc;
diff --git a/src/Metrics.cpp b/src/Metrics.cpp
new file mode 100644 (file)
index 0000000..37a3f9f
--- /dev/null
@@ -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 (file)
index 0000000..dbfca55
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _METRICS_H_
+#define _METRICS_H_
+
+#include <string>
+#include <opencv2/opencv.hpp>
+
+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 (file)
index 0000000..2206af3
--- /dev/null
@@ -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 (file)
index 0000000..5fc13f9
--- /dev/null
@@ -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<Tracker*> trackers;
+    int max_id = 0;
+};
+
+
+}
+
+#endif /* _MULTI_TRACKER_H_ */
index 79fd941..2d353a7 100644 (file)
@@ -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;
+    }
+}
index 57fe765..c87f465 100644 (file)
@@ -1,15 +1,39 @@
 #ifndef _TRACKER_H_
 #define _TRACKER_H_
 
+#include <opencv2/opencv.hpp>
+#include <string>
+#include <vector>
+#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<Patch *> patches;
 };
 
+
 }
 
 #endif /* _TRACKER_H_ */
index 90e3d8a..0945527 100644 (file)
@@ -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)