diff --git a/modules/xobjdetect/include/opencv2/xobjdetect.hpp b/modules/xobjdetect/include/opencv2/xobjdetect.hpp index 7d6fa238a..ffb922037 100644 --- a/modules/xobjdetect/include/opencv2/xobjdetect.hpp +++ b/modules/xobjdetect/include/opencv2/xobjdetect.hpp @@ -108,56 +108,10 @@ struct CV_EXPORTS WaldBoostParams }; -class CV_EXPORTS Stump -{ -public: - - /* Initialize zero stump */ - Stump(): threshold_(0), polarity_(1), pos_value_(1), neg_value_(-1) {} - - /* Initialize stump with given threshold, polarity - and classification values */ - Stump(int threshold, int polarity, float pos_value, float neg_value): - threshold_(threshold), polarity_(polarity), - pos_value_(pos_value), neg_value_(neg_value) {} - - /* Train stump for given data - - data — matrix of feature values, size M x N, one feature per row - - labels — matrix of sample class labels, size 1 x N. Labels can be from - {-1, +1} - - weights — matrix of sample weights, size 1 x N - - Returns chosen feature index. Feature enumeration starts from 0 - */ - int train(const Mat& data, const Mat& labels, const Mat& weights); - - /* Predict object class given - - value — feature value. Feature must be the same as was chosen - during training stump - - Returns real value, sign(value) means class - */ - float predict(int value) const; - -private: - /* Stump decision threshold */ - int threshold_; - /* Stump polarity, can be from {-1, +1} */ - int polarity_; - /* Classification values for positive and negative classes */ - float pos_value_, neg_value_; -}; class CV_EXPORTS WaldBoost : public Algorithm { public: - /* Initialize WaldBoost cascade with default of specified parameters */ - WaldBoost(const WaldBoostParams& params = WaldBoostParams()); - /* Train WaldBoost cascade for given data data — matrix of feature values, size M x N, one feature per row @@ -168,8 +122,8 @@ public: Returns feature indices chosen for cascade. Feature enumeration starts from 0 */ - std::vector train(const Mat& data, - const Mat& labels); + virtual std::vector train(const Mat& data, + const Mat& labels) = 0; /* Predict object class given object that can compute object features @@ -178,17 +132,14 @@ public: Returns confidence_value — measure of confidense that object is from class +1 */ - float predict(const Ptr& feature_evaluator); + virtual float predict( + const Ptr& feature_evaluator) const = 0; -private: - /* Parameters for cascade training */ - WaldBoostParams params_; - /* Stumps in cascade */ - std::vector stumps_; - /* Rejection thresholds for linear combination at every stump evaluation */ - std::vector thresholds_; }; +CV_EXPORTS Ptr +createWaldBoost(const WaldBoostParams& params = WaldBoostParams()); + struct CV_EXPORTS ICFDetectorParams { int feature_count; diff --git a/modules/xobjdetect/src/icfdetector.cpp b/modules/xobjdetect/src/icfdetector.cpp index d29484056..9859ec2eb 100644 --- a/modules/xobjdetect/src/icfdetector.cpp +++ b/modules/xobjdetect/src/icfdetector.cpp @@ -137,8 +137,8 @@ void ICFDetector::train(const vector& image_filenames, wparams.weak_count = params.weak_count; wparams.alpha = 0.001f; - WaldBoost waldboost(wparams); - waldboost.train(data, labels); + Ptr waldboost = createWaldBoost(wparams); + waldboost->train(data, labels); } bool ICFDetector::save(const string&) diff --git a/modules/xobjdetect/src/precomp.hpp b/modules/xobjdetect/src/precomp.hpp index 842645e67..70b240951 100644 --- a/modules/xobjdetect/src/precomp.hpp +++ b/modules/xobjdetect/src/precomp.hpp @@ -43,6 +43,7 @@ the use of this software, even if advised of the possibility of such damage. #define __OPENCV_XOBJDETECT_PRECOMP_HPP__ #include +#include #include #include diff --git a/modules/xobjdetect/src/waldboost.cpp b/modules/xobjdetect/src/waldboost.cpp index 86e84d5f2..e7da5dd85 100644 --- a/modules/xobjdetect/src/waldboost.cpp +++ b/modules/xobjdetect/src/waldboost.cpp @@ -41,7 +41,6 @@ the use of this software, even if advised of the possibility of such damage. #include "precomp.hpp" - using std::swap; using std::vector; @@ -51,11 +50,30 @@ namespace cv namespace xobjdetect { -WaldBoost::WaldBoost(const WaldBoostParams& params): params_(params) +class WaldBoostImpl : public WaldBoost { -} +public: + /* Initialize WaldBoost cascade with default of specified parameters */ + WaldBoostImpl(const WaldBoostParams& params): + params_(params) + {} -vector WaldBoost::train(const Mat& data, const Mat& labels) + virtual std::vector train(const Mat& data, + const Mat& labels); + + virtual float predict( + const Ptr& feature_evaluator) const; + +private: + /* Parameters for cascade training */ + WaldBoostParams params_; + /* Stumps in cascade */ + std::vector stumps_; + /* Rejection thresholds for linear combination at every stump evaluation */ + std::vector thresholds_; +}; + +vector WaldBoostImpl::train(const Mat& data, const Mat& labels) { CV_Assert(labels.rows == 1 && labels.cols == data.cols); @@ -144,7 +162,8 @@ vector WaldBoost::train(const Mat& data, const Mat& labels) return feature_indices; } -float WaldBoost::predict(const Ptr& feature_evaluator) +float WaldBoostImpl::predict( + const Ptr& feature_evaluator) const { float trace = 0; for( size_t i = 0; i < stumps_.size(); ++i ) @@ -157,5 +176,12 @@ float WaldBoost::predict(const Ptr& feature_evaluator) return trace; } +Ptr +createWaldBoost(const WaldBoostParams& params) +{ + return Ptr(new WaldBoostImpl(params)); +} + + } /* namespace xobjdetect */ } /* namespace cv */