Fix nan issue in features
[trackerpp.git] / include / Engine.h
1 #ifndef _ENGINE_H_
2 #define _ENGINE_H_
3
4 #include<string>
5 #include<sstream>
6 #include<set>
7 #include "Tracker.h"
8 #include "Detector.h"
9 #include "MultiTracker.h"
10 #include "VideoReader.h"
11 #include "SharedPtr.h"
12 #include "WorkerThread.h"
13
14 namespace suanzi{
15
16 class EngineObserver;
17
18 TK_DECLARE_PTR(Engine);
19 TK_DECLARE_PTR(MultiTracker);
20
21 struct Person;
22
23 class Engine
24 {
25 public:
26     static EnginePtr create();
27     void destroy();
28     virtual ~Engine();
29
30     virtual void start();
31     //virtual void getCurrentCount();
32     // virtual void capture(bool bb = false);
33     void addObserver(EngineObserver* o);
34     void setVideoSrc(VideoSrcType type, const std::string& url);
35     // stream the video source as http, return the url
36     std::string setPreview(bool isPreview, bool showBB = false){return "";} 
37
38 protected:
39     friend class MultiTracker;
40     void onPersonsIn(const std::vector<Person>& p);
41     void onPersonsOut(const std::vector<Person>& p);
42
43 private:
44     Engine();
45     void run();
46     WorkerThread eventThread {"EventThread"};
47     WorkerThread writeImgThread {"WriteImgThread"};
48     DetectorPtr detector;
49     MultiTrackerPtr multiTracker;
50     std::set<EngineObserver *> observer_list;
51     VideoReaderPtr reader;
52 };
53
54 struct Person
55 {
56     typedef enum {
57         Male,
58         Female
59     } Gender;
60
61     typedef enum {
62         Kid,        // < 10
63         Teenager,   // 12 ~ 19
64         Adult_2,    // 20 - 30
65         Adult_3,    // 30 - 40
66         Adult_4,    // 40 - 50
67         Adult_5,    // 50 - 60
68         Elder       // > 60
69     } Ages;
70
71     unsigned long id = 0x001;
72     Gender gender = Female;
73     Ages age = Kid;
74
75     std::string ageToString (Ages age) const {
76         switch (age){
77         case Kid: return "Kid";
78         case Teenager: return "Teenager";
79         default: return "no";
80         }
81     }
82
83     std::string toString() const {
84         std::stringstream ss;
85         ss << "Person: id=" << id << ". Gender:" << (gender == Gender::Male ? "Male" : "Female" ) <<
86             ". Age: " << ageToString(age);
87         return ss.str();
88     }
89 };
90
91 class EngineObserver
92 {
93 public:
94     virtual void onPersonsIn(const std::vector<Person>& p) = 0;
95     virtual void onPersonsOut(const std::vector<Person>& p) = 0;
96 };
97
98 } // namespace suanzi
99
100 #endif /* _ENGINE_H_ */