diff --git a/modules/contrib/doc/facerec/facerec_api.rst b/modules/contrib/doc/facerec/facerec_api.rst index 2aa3dcfa00..8de4359c52 100644 --- a/modules/contrib/doc/facerec/facerec_api.rst +++ b/modules/contrib/doc/facerec/facerec_api.rst @@ -46,6 +46,15 @@ a unified access to all face recongition algorithms in OpenCV. :: // Deserializes this object from a given cv::FileStorage. virtual void load(const FileStorage& fs) = 0; + + // Sets additional information as pairs label - info. + virtual void setLabelsInfo(const std::map& labelsInfo) = 0; + + // Gets string information by label + virtual string getLabelInfo(int label) const = 0; + + // Gets labels by string + virtual vector getLabelsByString(const string& str) = 0; }; @@ -70,6 +79,8 @@ 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. + .. 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. Setting the Thresholds @@ -293,6 +304,30 @@ to enable loading the model state. ``FaceRecognizer::load(FileStorage& fs)`` in turn gets called by ``FaceRecognizer::load(const string& filename)``, to ease saving a model. +FaceRecognizer::setLabelsInfo +----------------------------- + +Sets string information about labels into the model. +.. ocv:function:: void FaceRecognizer::setLabelsInfo(const std::map& labelsInfo) = 0 + +Information about the label loads as a pair label-its info. + +FaceRecognizer::getLabelInfo +---------------------------- + +Gets string information by label. +.. ocv:function:: string FaceRecognizer::getLabelInfo(int label) const = 0 + +If there is no such label in the model or there is no information about the label it will return an empty string. + +FaceRecognizer::getLabelsByString +--------------------------------- +Gets vector of labels by string. + +.. ocv:function:: vector FaceRecognizer::getLabelsByString(const string& str) = 0 + +If the string contained in a string information for a label, this label will be pushed into the vector. + createEigenFaceRecognizer ------------------------- @@ -319,6 +354,7 @@ Model internal data: * ``mean`` The sample mean calculated from the training data. * ``projections`` The projections of the training data. * ``labels`` The threshold applied in the prediction. If the distance to the nearest neighbor is larger than the threshold, this method returns -1. +* ``labelsInfo`` The string information about the labels. createFisherFaceRecognizer -------------------------- @@ -346,6 +382,7 @@ Model internal data: * ``mean`` The sample mean calculated from the training data. * ``projections`` The projections of the training data. * ``labels`` The labels corresponding to the projections. +* ``labelsInfo`` The string information about the labels. createLBPHFaceRecognizer @@ -375,3 +412,4 @@ Model internal data: * ``threshold`` see :ocv:func:`createLBPHFaceRecognizer`. * ``histograms`` Local Binary Patterns Histograms calculated from the given training data (empty if none was given). * ``labels`` Labels corresponding to the calculated Local Binary Patterns Histograms. +* ``labelsInfo`` The string information about the labels. diff --git a/modules/contrib/include/opencv2/contrib/contrib.hpp b/modules/contrib/include/opencv2/contrib/contrib.hpp index b3b4f330db..e6e11d816a 100644 --- a/modules/contrib/include/opencv2/contrib/contrib.hpp +++ b/modules/contrib/include/opencv2/contrib/contrib.hpp @@ -948,8 +948,8 @@ namespace cv // Deserializes this object from a given cv::FileStorage. virtual void load(const FileStorage& fs) = 0; - // Sets additions information as pairs label - info. - virtual void setLabelsInfo(const std::map& additionalInfo) = 0; + // Sets additional information as pairs label - info. + virtual void setLabelsInfo(const std::map& labelsInfo) = 0; // Gets string information by label virtual string getLabelInfo(int label) const = 0; diff --git a/modules/contrib/src/facerec.cpp b/modules/contrib/src/facerec.cpp index 9c310e0316..ef32b5273a 100644 --- a/modules/contrib/src/facerec.cpp +++ b/modules/contrib/src/facerec.cpp @@ -182,10 +182,10 @@ public: // See FaceRecognizer::save. void save(FileStorage& fs) const; - // Sets additions information as pairs label - info. + // Sets additional information as pairs label - info. void setLabelsInfo(const std::map& labelsInfo); - // Gets additional information by label + // Gets string information by label string getLabelInfo(int label) const; // Gets labels by string @@ -247,10 +247,10 @@ public: // See FaceRecognizer::save. void save(FileStorage& fs) const; - // Sets additions information as pairs label - info. + // Sets additional information as pairs label - info. void setLabelsInfo(const std::map& labelsInfo); - // Gets additional information by label + // Gets string information by label string getLabelInfo(int label) const; // Gets labels by string @@ -342,10 +342,10 @@ public: // See FaceRecognizer::save. void save(FileStorage& fs) const; - // Sets additions information as pairs label - info. + // Sets additional information as pairs label - info. void setLabelsInfo(const std::map& labelsInfo); - // Gets additional information by label + // Gets string information by label string getLabelInfo(int label) const; // Gets labels by string @@ -487,7 +487,7 @@ void Eigenfaces::load(const FileStorage& fs) { // read sequences readFileNodeList(fs["projections"], _projections); fs["labels"] >> _labels; - const FileNode& fn = fs["info"]; + const FileNode& fn = fs["labelsInfo"]; if (fn.type() == FileNode::SEQ) { _labelsInfo.clear(); @@ -509,7 +509,7 @@ void Eigenfaces::save(FileStorage& fs) const { // write sequences writeFileNodeList(fs, "projections", _projections); fs << "labels" << _labels; - fs << "info" << "["; + fs << "labelsInfo" << "["; for (std::map::const_iterator it = _labelsInfo.begin(); it != _labelsInfo.end(); it++) fs << LabelInfo(it->first, it->second); fs << "]"; @@ -522,9 +522,8 @@ void Eigenfaces::setLabelsInfo(const std::map& labelsInfo) string Eigenfaces::getLabelInfo(int label) const { - if(_labelsInfo.count(label) > 0) - return _labelsInfo.at(label); - return ""; + std::map::const_iterator iter(_labelsInfo.find(label)); + return iter != _labelsInfo.end() ? iter->second : ""; } vector Eigenfaces::getLabelsByString(const string& str) @@ -647,7 +646,7 @@ void Fisherfaces::load(const FileStorage& fs) { // read sequences readFileNodeList(fs["projections"], _projections); fs["labels"] >> _labels; - const FileNode& fn = fs["info"]; + const FileNode& fn = fs["labelsInfo"]; if (fn.type() == FileNode::SEQ) { _labelsInfo.clear(); @@ -670,7 +669,7 @@ void Fisherfaces::save(FileStorage& fs) const { // write sequences writeFileNodeList(fs, "projections", _projections); fs << "labels" << _labels; - fs << "info" << "["; + fs << "labelsInfo" << "["; for (std::map::const_iterator it = _labelsInfo.begin(); it != _labelsInfo.end(); it++) fs << LabelInfo(it->first, it->second); fs << "]"; @@ -683,9 +682,8 @@ void Fisherfaces::setLabelsInfo(const std::map& labelsInfo) string Fisherfaces::getLabelInfo(int label) const { - if(_labelsInfo.count(label) > 0) - return _labelsInfo.at(label); - return ""; + std::map::const_iterator iter(_labelsInfo.find(label)); + return iter != _labelsInfo.end() ? iter->second : ""; } vector Fisherfaces::getLabelsByString(const string& str) @@ -885,7 +883,7 @@ void LBPH::load(const FileStorage& fs) { //read matrices readFileNodeList(fs["histograms"], _histograms); fs["labels"] >> _labels; - const FileNode& fn = fs["info"]; + const FileNode& fn = fs["labelsInfo"]; if (fn.type() == FileNode::SEQ) { _labelsInfo.clear(); @@ -907,7 +905,7 @@ void LBPH::save(FileStorage& fs) const { // write matrices writeFileNodeList(fs, "histograms", _histograms); fs << "labels" << _labels; - fs << "info" << "["; + fs << "labelsInfo" << "["; for (std::map::const_iterator it = _labelsInfo.begin(); it != _labelsInfo.end(); it++) fs << LabelInfo(it->first, it->second); fs << "]"; @@ -920,9 +918,8 @@ void LBPH::setLabelsInfo(const std::map& labelsInfo) string LBPH::getLabelInfo(int label) const { - if(_labelsInfo.count(label) > 0) - return _labelsInfo.at(label); - return ""; + std::map::const_iterator iter(_labelsInfo.find(label)); + return iter != _labelsInfo.end() ? iter->second : ""; } vector LBPH::getLabelsByString(const string& str)