diff --git a/modules/contrib/doc/facerec/facerec_api.rst b/modules/contrib/doc/facerec/facerec_api.rst index edb6edb1d5..3da37bdd17 100644 --- a/modules/contrib/doc/facerec/facerec_api.rst +++ b/modules/contrib/doc/facerec/facerec_api.rst @@ -79,7 +79,7 @@ Moreover every :ocv:class:`FaceRecognizer` supports the: * **Loading/Saving** the model state from/to a given XML or YAML. -* **Setting/Getting labels info**, that is storaged as a string. +* **Setting/Getting labels info**, that is storaged as a string. String labels info is useful for keeping names of the recognized people. .. note:: When using the FaceRecognizer interface in combination with Python, please stick to Python 2. Some underlying scripts like create_csv will not work in other versions, like Python 3. diff --git a/modules/contrib/include/opencv2/contrib/contrib.hpp b/modules/contrib/include/opencv2/contrib/contrib.hpp index 5684ee2422..f74d9ca49f 100644 --- a/modules/contrib/include/opencv2/contrib/contrib.hpp +++ b/modules/contrib/include/opencv2/contrib/contrib.hpp @@ -958,6 +958,26 @@ namespace cv vector getLabelsByString(const string& str); }; + // The FaceRecognizerBase class is introduced to keep the FaceRecognizer binary backward compatibility in 2.4 + // In master setLabelInfo/getLabelInfo/getLabelsByString should be virtual and _labelsInfo should be moved to FaceRecognizer + // that allows to avoid FaceRecognizer2 in master + class FaceRecognizer2 : public FaceRecognizer + { + protected: + // Stored pairs "label id - string info" + std::map _labelsInfo; + + public: + // Sets additional information as pairs label - info. + virtual void setLabelsInfo(const std::map& labelsInfo); + + // Gets string information by label + virtual string getLabelInfo(int label) const; + + // Gets labels by string + virtual vector getLabelsByString(const string& str); + }; + CV_EXPORTS_W Ptr createEigenFaceRecognizer(int num_components = 0, double threshold = DBL_MAX); CV_EXPORTS_W Ptr createFisherFaceRecognizer(int num_components = 0, double threshold = DBL_MAX); CV_EXPORTS_W Ptr createLBPHFaceRecognizer(int radius=1, int neighbors=8, diff --git a/modules/contrib/src/facerec.cpp b/modules/contrib/src/facerec.cpp index 170f636687..f24e3ff4c4 100644 --- a/modules/contrib/src/facerec.cpp +++ b/modules/contrib/src/facerec.cpp @@ -133,37 +133,18 @@ inline vector<_Tp> remove_dups(const vector<_Tp>& src) { return elems; } -// This class was introduced to avoid an addition of new virtual functions in FaceRecognizer class. -// It is safe for a binary compatibility. -class FaceRecognizerBase : public FaceRecognizer -{ -protected: - // Stored pairs "label id - string info" - std::map _labelsInfo; - -public: - // Sets additional information as pairs label - info. - virtual void setLabelsInfo(const std::map& labelsInfo); - - // Gets string information by label - virtual string getLabelInfo(int label) const; - - // Gets labels by string - virtual vector getLabelsByString(const string& str); -}; - -void FaceRecognizerBase::setLabelsInfo(const std::map& labelsInfo) +void FaceRecognizer2::setLabelsInfo(const std::map& labelsInfo) { _labelsInfo = labelsInfo; } -string FaceRecognizerBase::getLabelInfo(int label) const +string FaceRecognizer2::getLabelInfo(int label) const { std::map::const_iterator iter(_labelsInfo.find(label)); return iter != _labelsInfo.end() ? iter->second : ""; } -vector FaceRecognizerBase::getLabelsByString(const string& str) +vector FaceRecognizer2::getLabelsByString(const string& str) { vector labels; for(std::map::const_iterator it = _labelsInfo.begin(); it != _labelsInfo.end(); it++) @@ -177,7 +158,7 @@ vector FaceRecognizerBase::getLabelsByString(const string& str) // Turk, M., and Pentland, A. "Eigenfaces for recognition.". Journal of // Cognitive Neuroscience 3 (1991), 71–86. -class Eigenfaces : public FaceRecognizerBase +class Eigenfaces : public FaceRecognizer2 { private: int _num_components; @@ -230,7 +211,7 @@ public: // faces: Recognition using class specific linear projection.". IEEE // Transactions on Pattern Analysis and Machine Intelligence 19, 7 (1997), // 711–720. -class Fisherfaces: public FaceRecognizerBase +class Fisherfaces: public FaceRecognizer2 { private: int _num_components; @@ -287,7 +268,7 @@ public: // patterns: Application to face recognition." IEEE Transactions on Pattern // Analysis and Machine Intelligence, 28(12):2037-2041. // -class LBPH : public FaceRecognizerBase +class LBPH : public FaceRecognizer2 { private: int _grid_x; @@ -404,21 +385,21 @@ void FaceRecognizer::load(const string& filename) { void FaceRecognizer::setLabelsInfo(const std::map& labelsInfo) { - FaceRecognizerBase* base = dynamic_cast(this); + FaceRecognizer2* base = dynamic_cast(this); CV_Assert(base != 0); base->setLabelsInfo(labelsInfo); } string FaceRecognizer::getLabelInfo(const int &label) { - FaceRecognizerBase* base = dynamic_cast(this); + FaceRecognizer2* base = dynamic_cast(this); CV_Assert(base != 0); return base->getLabelInfo(label); } vector FaceRecognizer::getLabelsByString(const string& str) { - FaceRecognizerBase* base = dynamic_cast(this); + FaceRecognizer2* base = dynamic_cast(this); CV_Assert(base != 0); return base->getLabelsByString(str); }