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