ebd512166aa43328c6ffca82a2bfa2c13a1733af
[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     DetectorPtr detector;
48     MultiTrackerPtr multiTracker;
49     std::set<EngineObserver *> observer_list;
50     VideoReaderPtr reader;
51 };
52
53 struct Person
54 {
55     typedef enum {
56         Male,
57         Female
58     } Gender;
59
60     typedef enum {
61         Kid,        // < 10
62         Teenager,   // 12 ~ 19
63         Adult_2,    // 20 - 30
64         Adult_3,    // 30 - 40
65         Adult_4,    // 40 - 50
66         Adult_5,    // 50 - 60
67         Elder       // > 60
68     } Ages;
69
70     unsigned long id = 0x001;
71     Gender gender = Female;
72     Ages age = Kid;
73
74     std::string ageToString (Ages age) const {
75         switch (age){
76         case Kid: return "Kid";
77         case Teenager: return "Teenager";
78         default: return "no";
79         }
80     }
81
82     std::string toString() const {
83         std::stringstream ss;
84         ss << "Person: id=" << id << ". Gender:" << (gender == Gender::Male ? "Male" : "Female" ) <<
85             ". Age: " << ageToString(age);
86         return ss.str();
87     }
88 };
89
90 class EngineObserver
91 {
92 public:
93     virtual void onPersonsIn(const std::vector<Person>& p) = 0;
94     virtual void onPersonsOut(const std::vector<Person>& p) = 0;
95 };
96
97 } // namespace suanzi
98
99 #endif /* _ENGINE_H_ */