X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=src%2FEngine.cpp;h=16a704dd19eb10a5767272c535e8ac6d5533af70;hb=a80807eb35cc0ff70a9afdd6b7db2f38cb686683;hp=6d44f3c355c413517d00d8065fdd2d1eb705cfba;hpb=48adce31a0ffdb3757ee1be8a63ce7e769e87deb;p=trackerpp.git diff --git a/src/Engine.cpp b/src/Engine.cpp index 6d44f3c..16a704d 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -1,17 +1,20 @@ #include #include +#include #include "Engine.h" #include "Logger.h" #include "PredictorWrapper.h" using namespace suanzi; +using namespace std; -const static std::string TAG = "Engine"; - +static const std::string TAG = "Engine"; static std::mutex g_mutex; static EngineWPtr g_instance; +typedef std::shared_ptr> PersonsInfoPtr; +// class Engine EnginePtr Engine::create() { LOG_DEBUG(TAG, "create"); @@ -28,28 +31,26 @@ EnginePtr Engine::create() Engine::Engine() { detector = std::make_shared(); - MetricsPtr m (new Metrics("model.pkl")); - multiTracker = std::make_shared(m); } Engine::~Engine() { + destroy(); } void Engine::destroy() { + LOG_DEBUG(TAG, "destroy"); + detector.reset(); + multiTracker.reset(); + reader.reset(); + observer_list.clear(); } void Engine::setVideoSrc(VideoSrcType type, const std::string& url) { - PredictorWrapperPtr pp = PredictorWrapper::create("./python/model.pkl"); - - pp->dump(); - -// videoSrc = url; - //reader = VideoReaderFactory::createVideoReader(type, url); - + reader = VideoReaderFactory::createVideoReader(type, url); } void Engine::run() @@ -59,7 +60,6 @@ void Engine::run() Detection detections[128]; while (reader->read(frame)){ LOG_DEBUG(TAG, "Size: " << frame.cols << "x" << frame.rows); - // TODO int total = detector->detect(frame, detections); multiTracker->update(total, detections, frame); } @@ -68,6 +68,7 @@ void Engine::run() void Engine::start() { LOG_DEBUG(TAG, "start"); + multiTracker = std::make_shared(g_instance); if (!reader){ LOG_ERROR(TAG, "reader is null. exit"); return; @@ -80,3 +81,49 @@ void Engine::addObserver(EngineObserver *observer) { observer_list.insert(observer); } + + +// WorkItem class for event thread +class PersonInEventWorkItem : public WorkItem +{ +public: + PersonInEventWorkItem(std::set obs, PersonsInfoPtr info) : obs(obs), info(info){ + } + ~PersonInEventWorkItem(){} + void run (){ + for (auto o : obs){ + o->onPersonsIn(*(info.get())); + } + } +private: + std::set obs; + PersonsInfoPtr info; +}; + +class PersonOutEventWorkItem : public WorkItem +{ +public: + PersonOutEventWorkItem(std::set obs, PersonsInfoPtr info) : obs(obs), info(info){ + } + ~PersonOutEventWorkItem(){} + void run (){ + for (auto o : obs){ + o->onPersonsIn(*(info.get())); + } + } +private: + std::set obs; + PersonsInfoPtr info; +}; + +void Engine::onPersonsOut(const std::vector& p) +{ + PersonsInfoPtr pp = std::make_shared>(p); + eventThread.enqueue(new PersonOutEventWorkItem(this->observer_list, pp)); +} + +void Engine::onPersonsIn(const std::vector& p) +{ + PersonsInfoPtr pp = std::make_shared>(p); + eventThread.enqueue(new PersonInEventWorkItem(this->observer_list, pp)); +}