3 #include <condition_variable>
6 #include "PredictorWrapper.h"
8 using namespace suanzi;
11 static const std::string TAG = "Engine";
12 static std::mutex g_mutex;
13 static EngineWPtr g_instance;
15 typedef std::shared_ptr<std::vector<Person>> PersonsInfoPtr;
17 EnginePtr Engine::create()
19 LOG_DEBUG(TAG, "create");
20 std::lock_guard<std::mutex> lock(g_mutex);
21 if (g_instance.lock()){
22 LOG_ERROR(TAG, "already exists");
25 EnginePtr instance (new Engine());
26 g_instance = instance;
32 //detector = std::make_shared<Detector>();
33 detector = DetectorPtr(new Detector());
41 void Engine::destroy()
43 LOG_DEBUG(TAG, "destroy");
47 observer_list.clear();
50 void Engine::setVideoSrc(VideoSrcType type, const std::string& url)
52 reader = VideoReaderFactory::createVideoReader(type, url);
57 LOG_DEBUG(TAG, "run");
59 Detection detections[128];
60 while (reader->read(frame)){
61 LOG_DEBUG(TAG, "Size: " << frame.cols << "x" << frame.rows);
62 int total = detector->detect(frame, detections);
63 multiTracker->update(total, detections, frame);
69 LOG_DEBUG(TAG, "start");
70 multiTracker = std::make_shared<MultiTracker>(g_instance);
72 LOG_ERROR(TAG, "reader is null. exit");
75 std::thread t(&Engine::run, this);
79 void Engine::addObserver(EngineObserver *observer)
81 LOG_DEBUG(TAG, "addObserver");
82 observer_list.insert(observer);
86 // WorkItem class for event thread
87 class PersonInEventWorkItem : public WorkItem
90 PersonInEventWorkItem(std::set<EngineObserver*> obs, PersonsInfoPtr info) : obs(obs), info(info){
92 ~PersonInEventWorkItem(){}
95 o->onPersonsIn(*(info.get()));
99 std::set<EngineObserver*> obs;
103 class PersonOutEventWorkItem : public WorkItem
106 PersonOutEventWorkItem(std::set<EngineObserver*> obs, PersonsInfoPtr info) : obs(obs), info(info){
108 ~PersonOutEventWorkItem(){}
111 o->onPersonsIn(*(info.get()));
115 std::set<EngineObserver*> obs;
119 void Engine::onPersonsOut(const std::vector<Person>& p)
121 LOG_DEBUG(TAG, "onPersonOut");
122 PersonsInfoPtr pp = std::make_shared<std::vector<Person>>(p);
123 eventThread.enqueue(new PersonOutEventWorkItem(this->observer_list, pp));
126 void Engine::onPersonsIn(const std::vector<Person>& p)
128 LOG_DEBUG(TAG, "onPersonIn");
129 PersonsInfoPtr pp = std::make_shared<std::vector<Person>>(p);
130 eventThread.enqueue(new PersonInEventWorkItem(this->observer_list, pp));