diff --git a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp index 78b5847662..69809a8d17 100644 --- a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp +++ b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp @@ -47,6 +47,7 @@ #include "opencv2/core.hpp" #include #include +#include namespace cv { @@ -163,7 +164,8 @@ public: local minimum is greater than minProbabilityDiff). \param cb Callback with the classifier. - if omitted tries to load a default classifier from file trained_classifierNM1.xml + default classifier can be implicitly load with function loadClassifierNM1() + from file in samples/cpp/trained_classifierNM1.xml \param thresholdDelta Threshold step in subsequent thresholds when extracting the component tree \param minArea The minimum area (% of image size) allowed for retreived ER's \param minArea The maximum area (% of image size) allowed for retreived ER's @@ -171,7 +173,7 @@ public: \param nonMaxSuppression Whenever non-maximum suppression is done over the branch probabilities \param minProbability The minimum probability difference between local maxima and local minima ERs */ -CV_EXPORTS Ptr createERFilterNM1(const Ptr& cb = Ptr(), +CV_EXPORTS Ptr createERFilterNM1(const Ptr& cb, int thresholdDelta = 1, float minArea = 0.00025, float maxArea = 0.13, float minProbability = 0.4, bool nonMaxSuppression = true, @@ -187,13 +189,31 @@ CV_EXPORTS Ptr createERFilterNM1(const Ptr& cb = P additional features: hole area ratio, convex hull ratio, and number of outer inflexion points. \param cb Callback with the classifier - if omitted tries to load a default classifier from file trained_classifierNM2.xml + default classifier can be implicitly load with function loadClassifierNM2() + from file in samples/cpp/trained_classifierNM2.xml \param minProbability The minimum probability P(er|character) allowed for retreived ER's */ -CV_EXPORTS Ptr createERFilterNM2(const Ptr& cb = Ptr(), +CV_EXPORTS Ptr createERFilterNM2(const Ptr& cb, float minProbability = 0.3); +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes as parameter the XML or YAML file with the classifier model + (e.g. trained_classifierNM1.xml) returns a pointer to ERFilter::Callback. +*/ + +CV_EXPORTS Ptr loadClassifierNM1(const std::string& filename); + +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes as parameter the XML or YAML file with the classifier model + (e.g. trained_classifierNM1.xml) returns a pointer to ERFilter::Callback. +*/ + +CV_EXPORTS Ptr loadClassifierNM2(const std::string& filename); + + // computeNMChannels operation modes enum { ERFILTER_NM_RGBLGrad = 0, ERFILTER_NM_IHSGrad = 1 diff --git a/modules/objdetect/src/erfilter.cpp b/modules/objdetect/src/erfilter.cpp index c231a513c5..6e19b34bac 100644 --- a/modules/objdetect/src/erfilter.cpp +++ b/modules/objdetect/src/erfilter.cpp @@ -137,7 +137,7 @@ class CV_EXPORTS ERClassifierNM1 : public ERFilter::Callback { public: //Constructor - ERClassifierNM1(); + ERClassifierNM1(const std::string& filename); // Destructor ~ERClassifierNM1() {}; @@ -153,7 +153,7 @@ class CV_EXPORTS ERClassifierNM2 : public ERFilter::Callback { public: //constructor - ERClassifierNM2(); + ERClassifierNM2(const std::string& filename); // Destructor ~ERClassifierNM2() {}; @@ -988,24 +988,13 @@ int ERFilterNM::getNumRejected() // load default 1st stage classifier if found -ERClassifierNM1::ERClassifierNM1() +ERClassifierNM1::ERClassifierNM1(const std::string& filename) { - if (ifstream("./trained_classifierNM1.xml")) - { - // The file with default classifier exists - boost.load("./trained_classifierNM1.xml", "boost"); - } - else if (ifstream("./training/trained_classifierNM1.xml")) - { - // The file with default classifier exists - boost.load("./training/trained_classifierNM1.xml", "boost"); - } + if (ifstream(filename.c_str())) + boost.load( filename.c_str(), "boost" ); else - { - // File not found - CV_Error(CV_StsBadArg, "Default classifier ./trained_classifierNM1.xml not found!"); - } + CV_Error(CV_StsBadArg, "Default classifier file not found!"); }; double ERClassifierNM1::eval(const ERStat& stat) @@ -1026,24 +1015,12 @@ double ERClassifierNM1::eval(const ERStat& stat) // load default 2nd stage classifier if found -ERClassifierNM2::ERClassifierNM2() +ERClassifierNM2::ERClassifierNM2(const std::string& filename) { - - if (ifstream("./trained_classifierNM2.xml")) - { - // The file with default classifier exists - boost.load("./trained_classifierNM2.xml", "boost"); - } - else if (ifstream("./training/trained_classifierNM2.xml")) - { - // The file with default classifier exists - boost.load("./training/trained_classifierNM2.xml", "boost"); - } + if (ifstream(filename.c_str())) + boost.load( filename.c_str(), "boost" ); else - { - // File not found - CV_Error(CV_StsBadArg, "Default classifier ./trained_classifierNM2.xml not found!"); - } + CV_Error(CV_StsBadArg, "Default classifier file not found!"); }; double ERClassifierNM2::eval(const ERStat& stat) @@ -1079,7 +1056,8 @@ double ERClassifierNM2::eval(const ERStat& stat) local minimum is greater than minProbabilityDiff). \param cb Callback with the classifier. - if omitted tries to load a default classifier from file trained_classifierNM1.xml + default classifier can be implicitly load with function loadClassifierNM1() + from file in samples/cpp/trained_classifierNM1.xml \param thresholdDelta Threshold step in subsequent thresholds when extracting the component tree \param minArea The minimum area (% of image size) allowed for retreived ER's \param minArea The maximum area (% of image size) allowed for retreived ER's @@ -1099,10 +1077,7 @@ Ptr createERFilterNM1(const Ptr& cb, int threshold Ptr filter = makePtr(); - if (cb == NULL) - filter->setCallback(makePtr()); - else - filter->setCallback(cb); + filter->setCallback(cb); filter->setThresholdDelta(thresholdDelta); filter->setMinArea(minArea); @@ -1123,7 +1098,8 @@ Ptr createERFilterNM1(const Ptr& cb, int threshold additional features: hole area ratio, convex hull ratio, and number of outer inflexion points. \param cb Callback with the classifier - if omitted tries to load a default classifier from file trained_classifierNM2.xml + default classifier can be implicitly load with function loadClassifierNM1() + from file in samples/cpp/trained_classifierNM2.xml \param minProbability The minimum probability P(er|character) allowed for retreived ER's */ Ptr createERFilterNM2(const Ptr& cb, float minProbability) @@ -1133,15 +1109,33 @@ Ptr createERFilterNM2(const Ptr& cb, float minProb Ptr filter = makePtr(); - if (cb == NULL) - filter->setCallback(makePtr()); - else - filter->setCallback(cb); + filter->setCallback(cb); filter->setMinProbability(minProbability); return (Ptr)filter; } +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes as parameter the XML or YAML file with the classifier model + (e.g. trained_classifierNM1.xml) returns a pointer to ERFilter::Callback. +*/ +Ptr loadClassifierNM1(const std::string& filename) + +{ + return makePtr(filename); +} + +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes as parameter the XML or YAML file with the classifier model + (e.g. trained_classifierNM2.xml) returns a pointer to ERFilter::Callback. +*/ +Ptr loadClassifierNM2(const std::string& filename) +{ + return makePtr(filename); +} + /* ------------------------------------------------------------------------------------*/ /* -------------------------------- Compute Channels NM -------------------------------*/ diff --git a/samples/cpp/erfilter.cpp b/samples/cpp/erfilter.cpp index 8a2a45f9c4..69009b82aa 100644 --- a/samples/cpp/erfilter.cpp +++ b/samples/cpp/erfilter.cpp @@ -58,7 +58,7 @@ int main(int argc, const char * argv[]) double t = (double)getTickCount(); // Build ER tree and filter with the 1st stage default classifier - Ptr er_filter1 = createERFilterNM1(); + Ptr er_filter1 = createERFilterNM1(loadClassifierNM1("trained_classifierNM1.xml")); er_filter1->run(grey, regions); @@ -89,7 +89,7 @@ int main(int argc, const char * argv[]) t = (double)getTickCount(); // Default second stage classifier - Ptr er_filter2 = createERFilterNM2(); + Ptr er_filter2 = createERFilterNM2(loadClassifierNM2("trained_classifierNM2.xml")); er_filter2->run(grey, regions); t = (double)getTickCount() - t;