From 95d92c099c76e43e59bc6017c35231c62290bd31 Mon Sep 17 00:00:00 2001 From: lluis Date: Fri, 13 Sep 2013 12:54:23 +0200 Subject: [PATCH 1/3] functions getDefaultClassifierNM1() and getDefaultClassifierNM2() allow to implicitly load the default classifiers when creating a ERFilter object --- .../include/opencv2/objdetect/erfilter.hpp | 21 +++++++++++++++++ modules/objdetect/src/erfilter.cpp | 23 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp index 78b584766..0abb0465d 100644 --- a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp +++ b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp @@ -164,6 +164,7 @@ public: \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 getDefaultClassifierNM1() \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 @@ -188,12 +189,32 @@ CV_EXPORTS Ptr createERFilterNM1(const Ptr& cb = P \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 getDefaultClassifierNM2() \param minProbability The minimum probability P(er|character) allowed for retreived ER's */ CV_EXPORTS Ptr createERFilterNM2(const Ptr& cb = Ptr(), float minProbability = 0.3); +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes no parameters and returns a pointer to ERFilter::Callback. + The dafault classifier is loaded from file trained_classifierNM1.xml + if it's found in current directory. +*/ + +CV_EXPORTS Ptr getDefaultClassifierNM1(); + +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes no parameters and returns a pointer to ERFilter::Callback. + The dafault classifier is loaded from file trained_classifierNM2.xml + if it's found in current directory. +*/ + +CV_EXPORTS Ptr getDefaultClassifierNM2(); + + // 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 c231a513c..9365eabf4 100644 --- a/modules/objdetect/src/erfilter.cpp +++ b/modules/objdetect/src/erfilter.cpp @@ -1142,6 +1142,29 @@ Ptr createERFilterNM2(const Ptr& cb, float minProb return (Ptr)filter; } +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes no parameters and returns a pointer to ERFilter::Callback. + The dafault classifier is loaded from file trained_classifierNM1.xml + if it's found in current directory. +*/ +Ptr getDefaultClassifierNM1() + +{ + return makePtr(); +} + +/*! + Allow to implicitly load the default classifier when creating an ERFilter object. + The function takes no parameters and returns a pointer to ERFilter::Callback. + The dafault classifier is loaded from file trained_classifierNM2.xml + if it's found in current directory. +*/ +Ptr getDefaultClassifierNM2() +{ + return makePtr(); +} + /* ------------------------------------------------------------------------------------*/ /* -------------------------------- Compute Channels NM -------------------------------*/ From 75fdfba281e171510f4f7eb7abfba374d291f0e3 Mon Sep 17 00:00:00 2001 From: lluis Date: Fri, 13 Sep 2013 16:19:52 +0200 Subject: [PATCH 2/3] renamed getDefaultClassifierNM{1,2}() to loadClassifierNM{1,2}() and added "const std::string& filename" parameter (mandatory). --- .../include/opencv2/objdetect/erfilter.hpp | 19 +++-- modules/objdetect/src/erfilter.cpp | 71 +++++++------------ 2 files changed, 34 insertions(+), 56 deletions(-) diff --git a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp index 0abb0465d..6f45a88b0 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 { @@ -164,7 +165,7 @@ public: \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 getDefaultClassifierNM1() + default classifier can be implicitly load with function loadClassifierNM1() \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 @@ -189,7 +190,7 @@ CV_EXPORTS Ptr createERFilterNM1(const Ptr& cb = P \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 getDefaultClassifierNM2() + default classifier can be implicitly load with function loadClassifierNM2() \param minProbability The minimum probability P(er|character) allowed for retreived ER's */ CV_EXPORTS Ptr createERFilterNM2(const Ptr& cb = Ptr(), @@ -198,21 +199,19 @@ CV_EXPORTS Ptr createERFilterNM2(const Ptr& cb = P /*! Allow to implicitly load the default classifier when creating an ERFilter object. - The function takes no parameters and returns a pointer to ERFilter::Callback. - The dafault classifier is loaded from file trained_classifierNM1.xml - if it's found in current directory. + 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 getDefaultClassifierNM1(); +CV_EXPORTS Ptr loadClassifierNM1(const std::string& filename); /*! Allow to implicitly load the default classifier when creating an ERFilter object. - The function takes no parameters and returns a pointer to ERFilter::Callback. - The dafault classifier is loaded from file trained_classifierNM2.xml - if it's found in current directory. + 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 getDefaultClassifierNM2(); +CV_EXPORTS Ptr loadClassifierNM2(const std::string& filename); // computeNMChannels operation modes diff --git a/modules/objdetect/src/erfilter.cpp b/modules/objdetect/src/erfilter.cpp index 9365eabf4..dc3b30bfe 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) @@ -1080,6 +1057,7 @@ double ERClassifierNM2::eval(const ERStat& stat) \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() \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 @@ -1100,9 +1078,11 @@ Ptr createERFilterNM1(const Ptr& cb, int threshold Ptr filter = makePtr(); if (cb == NULL) - filter->setCallback(makePtr()); - else + filter->setCallback(makePtr("trained_classifierNM1.xml")); + else filter->setCallback(cb); + + filter->setThresholdDelta(thresholdDelta); filter->setMinArea(minArea); @@ -1124,6 +1104,7 @@ Ptr createERFilterNM1(const Ptr& cb, int threshold \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() \param minProbability The minimum probability P(er|character) allowed for retreived ER's */ Ptr createERFilterNM2(const Ptr& cb, float minProbability) @@ -1134,7 +1115,7 @@ Ptr createERFilterNM2(const Ptr& cb, float minProb Ptr filter = makePtr(); if (cb == NULL) - filter->setCallback(makePtr()); + filter->setCallback(makePtr("trained_classifierNM2.xml")); else filter->setCallback(cb); @@ -1144,25 +1125,23 @@ Ptr createERFilterNM2(const Ptr& cb, float minProb /*! Allow to implicitly load the default classifier when creating an ERFilter object. - The function takes no parameters and returns a pointer to ERFilter::Callback. - The dafault classifier is loaded from file trained_classifierNM1.xml - if it's found in current directory. + 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 getDefaultClassifierNM1() +Ptr loadClassifierNM1(const std::string& filename) { - return makePtr(); + return makePtr(filename); } /*! Allow to implicitly load the default classifier when creating an ERFilter object. - The function takes no parameters and returns a pointer to ERFilter::Callback. - The dafault classifier is loaded from file trained_classifierNM2.xml - if it's found in current directory. + 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 getDefaultClassifierNM2() +Ptr loadClassifierNM2(const std::string& filename) { - return makePtr(); + return makePtr(filename); } From d25309f82e1bb67ea17dfdabe01a2de1dfc13ec0 Mon Sep 17 00:00:00 2001 From: lluis Date: Fri, 13 Sep 2013 16:29:21 +0200 Subject: [PATCH 3/3] first parameter of createERFilterNM1/createERFilterNM2 is now mandatory. changed the sample program to use the new prototypes --- .../include/opencv2/objdetect/erfilter.hpp | 8 ++++---- modules/objdetect/src/erfilter.cpp | 16 ++++------------ samples/cpp/erfilter.cpp | 4 ++-- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp index 6f45a88b0..69809a8d1 100644 --- a/modules/objdetect/include/opencv2/objdetect/erfilter.hpp +++ b/modules/objdetect/include/opencv2/objdetect/erfilter.hpp @@ -164,8 +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 @@ -173,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, @@ -189,11 +189,11 @@ 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); diff --git a/modules/objdetect/src/erfilter.cpp b/modules/objdetect/src/erfilter.cpp index dc3b30bfe..6e19b34ba 100644 --- a/modules/objdetect/src/erfilter.cpp +++ b/modules/objdetect/src/erfilter.cpp @@ -1056,8 +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 @@ -1077,12 +1077,7 @@ Ptr createERFilterNM1(const Ptr& cb, int threshold Ptr filter = makePtr(); - if (cb == NULL) - filter->setCallback(makePtr("trained_classifierNM1.xml")); - else - filter->setCallback(cb); - - + filter->setCallback(cb); filter->setThresholdDelta(thresholdDelta); filter->setMinArea(minArea); @@ -1103,8 +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) @@ -1114,10 +1109,7 @@ Ptr createERFilterNM2(const Ptr& cb, float minProb Ptr filter = makePtr(); - if (cb == NULL) - filter->setCallback(makePtr("trained_classifierNM2.xml")); - else - filter->setCallback(cb); + filter->setCallback(cb); filter->setMinProbability(minProbability); return (Ptr)filter; diff --git a/samples/cpp/erfilter.cpp b/samples/cpp/erfilter.cpp index 8a2a45f9c..69009b82a 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;