diff --git a/libkface/recognition-opencv-lbph/facerec_borrowed.h b/libkface/recognition-opencv-lbph/facerec_borrowed.h index 27ad77a..f197d22 100644 --- a/libkface/recognition-opencv-lbph/facerec_borrowed.h +++ b/libkface/recognition-opencv-lbph/facerec_borrowed.h @@ -125,6 +125,8 @@ public: */ void update(cv::InputArrayOfArrays src, cv::InputArray labels); + +#if OPENCV_TEST_VERSION(3,1,0) /** * Predicts the label of a query image in src. */ @@ -134,6 +136,13 @@ public: * Predicts the label and confidence for a given sample. */ void predict(cv::InputArray _src, int &label, double &dist) const; +#else + using cv::face::FaceRecognizer::predict; + /* + * Predict + */ + void predict(cv::InputArray src, cv::Ptr collector, const int state = 0) const override; +#endif /** * See FaceRecognizer::load(). diff --git a/libkface/recognition-opencv-lbph/facerec_borrowed.cpp b/libkface/recognition-opencv-lbph/facerec_borrowed.cpp index 748691e..3c37ce2 100644 --- a/libkface/recognition-opencv-lbph/facerec_borrowed.cpp +++ b/libkface/recognition-opencv-lbph/facerec_borrowed.cpp @@ -36,6 +36,8 @@ * * ============================================================ */ +#define QT_NO_EMIT + #include "facerec_borrowed.h" // C++ includes @@ -375,7 +377,11 @@ void LBPHFaceRecognizer::train(InputArrayOfArrays _in_src, InputArray _inm_label } } +#if OPENCV_TEST_VERSION(3,1,0) void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist) const +#else +void LBPHFaceRecognizer::predict(cv::InputArray _src, cv::Ptr collector, const int state) const +#endif { if(m_histograms.empty()) { @@ -394,8 +400,12 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist m_grid_y, /* grid size y */ true /* normed histograms */ ); +#if OPENCV_TEST_VERSION(3,1,0) minDist = DBL_MAX; minClass = -1; +#else + collector->init((int)m_histograms.size(), state); +#endif // This is the standard method @@ -406,11 +416,19 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist { double dist = compareHist(m_histograms[sampleIdx], query, CV_COMP_CHISQR); +#if OPENCV_TEST_VERSION(3,1,0) if((dist < minDist) && (dist < m_threshold)) { minDist = dist; minClass = m_labels.at((int) sampleIdx); } +#else + int label = m_labels.at((int) sampleIdx); + if (!collector->emit(label, dist, state)) + { + return; + } +#endif } } @@ -422,7 +440,7 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist // Create map "label -> vector of distances to all histograms for this label" std::map > distancesMap; - for(size_t sampleIdx = 0; sampleIdx < m_histograms.size(); sampleIdx++) + for(size_t sampleIdx = 0; sampleIdx < m_histograms.size(); sampleIdx++) { double dist = compareHist(m_histograms[sampleIdx], query, CV_COMP_CHISQR); std::vector& distances = distancesMap[m_labels.at((int) sampleIdx)]; @@ -445,11 +463,18 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist double mean = sum / it->second.size(); s += QString::fromLatin1("%1: %2 - ").arg(it->first).arg(mean); +#if OPENCV_TEST_VERSION(3,1,0) if((mean < minDist) && (mean < m_threshold)) { minDist = mean; minClass = it->first; } +#else + if (!collector->emit(it->first, mean, state)) + { + return; + } +#endif } qCDebug(LIBKFACE_LOG) << s; @@ -462,7 +487,7 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist // map "label -> number of histograms" std::map countMap; - for(size_t sampleIdx = 0; sampleIdx < m_histograms.size(); sampleIdx++) + for(size_t sampleIdx = 0; sampleIdx < m_histograms.size(); sampleIdx++) { int label = m_labels.at((int) sampleIdx); double dist = compareHist(m_histograms[sampleIdx], query, CV_COMP_CHISQR); @@ -480,7 +505,9 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist scoreMap[it->second]++; } +#if OPENCV_TEST_VERSION(3,1,0) minDist = 0; +#endif QString s("Nearest Neighbor score: "); for (std::map::iterator it = scoreMap.begin(); it != scoreMap.end(); ++it) @@ -488,17 +515,26 @@ void LBPHFaceRecognizer::predict(InputArray _src, int &minClass, double &minDist double score = double(it->second) / countMap.at(it->first); s += QString("%1/%2 %3 ").arg(it->second).arg(countMap.at(it->first)).arg(score); +#if OPENCV_TEST_VERSION(3,1,0) if (score > minDist) { minDist = score; minClass = it->first; } +#else + // large is better thus it is -score. + if (!collector->emit(it->first, -score, state)) + { + return; + } +#endif } kDebug() << s; } } +#if OPENCV_TEST_VERSION(3,1,0) int LBPHFaceRecognizer::predict(InputArray _src) const { int label; @@ -506,6 +542,7 @@ int LBPHFaceRecognizer::predict(InputArray _src) const predict(_src, label, dummy); return label; } +#endif // Static method ----------------------------------------------------