diff --git a/include/detection.hpp b/include/detection.hpp index 46930d3..dc73401 100644 --- a/include/detection.hpp +++ b/include/detection.hpp @@ -3,7 +3,7 @@ #include #include -#include "opencv2/core/core.hpp" +#include "opencv2/opencv.hpp" class Detector { public: @@ -12,3 +12,13 @@ class Detector { virtual void Detect(const cv::Mat& frame, std::vector& objects, std::vector& scores) = 0; }; + +class CascadeDetector : public Detector { +public: + virtual bool Init(const std::string& model_file_path); + virtual void Detect(const cv::Mat& frame, std::vector& objects, + std::vector& scores); + +protected: + cv::CascadeClassifier detector; +}; diff --git a/src/detection.cpp b/src/detection.cpp index 15e7fd1..03bea7a 100644 --- a/src/detection.cpp +++ b/src/detection.cpp @@ -7,7 +7,31 @@ using std::shared_ptr; using namespace cv; shared_ptr Detector::CreateDetector(const string& name) { + if (name == "cascade") { + return std::make_shared(); + } std::cerr << "Failed to create detector with name '" << name << "'" << std::endl; return nullptr; + +} + +bool CascadeDetector::Init(const std::string& model_file_path) +{ + if (detector.load(model_file_path)==true) + { + return true; + } + else return false; } + +void CascadeDetector::Detect(const cv::Mat& frame, std::vector& objects, + std::vector& scores) +{ + std::vector scores_int; + detector.detectMultiScale(frame, objects, scores_int); + scores.resize(scores_int.size()); + for (std::vector::size_type i = 0; i < scores_int.size(); ++i) { + scores[i] = scores_int[i]; + } +} \ No newline at end of file