diff -urNB a/extra/libkface/CMakeLists.txt b/extra/libkface/CMakeLists.txt --- a/extra/libkface/CMakeLists.txt 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/CMakeLists.txt 2016-03-04 07:53:19.390177947 +0100 @@ -29,8 +29,33 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) +# OpenCV detection include(MacroOpenCV) -DETECT_OPENCV(2.4.9 core highgui objdetect contrib legacy imgproc) + +if(ENABLE_OPENCV3) + + set(OPENCV_MIN_VERSION "3.0.0") + DETECT_OPENCV(${OPENCV_MIN_VERSION} core face highgui objdetect imgproc) + + if(${OpenCV_FOUND}) + if(${OpenCV_VERSION} VERSION_LESS 3.0.0) + message(STATUS "ENABLE_OPENCV3 option is enabled and OpenCV < 3.0.0 have been found. Disabled ENABLE_OPENCV3") + set(OpenCV_FOUND FALSE) + endif() + endif() + +else() + set(OPENCV_MIN_VERSION "2.4.9") + DETECT_OPENCV(${OPENCV_MIN_VERSION} core highgui objdetect contrib legacy imgproc) + + if(${OpenCV_FOUND}) + if(${OpenCV_VERSION} VERSION_GREATER 2.4.99) + message(STATUS "ENABLE_OPENCV3 option is disabled and OpenCV >= 3.0.0 have been found. Enabled ENABLE_OPENCV3") + set(OpenCV_FOUND FALSE) + endif() + endif() + +endif() include_directories(${OpenCV_INCLUDE_DIRS}) diff -urNB a/extra/libkface/libkface/CMakeLists.txt b/extra/libkface/libkface/CMakeLists.txt --- a/extra/libkface/libkface/CMakeLists.txt 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/libkface/CMakeLists.txt 2016-03-04 08:17:38.604392033 +0100 @@ -1,5 +1,5 @@ # -# Copyright (c) 2010-2014, Gilles Caulier, +# Copyright (c) 2010-2015, Gilles Caulier, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. diff -urNB a/extra/libkface/libkface/detection/opencvfacedetector.cpp b/extra/libkface/libkface/detection/opencvfacedetector.cpp --- a/extra/libkface/libkface/detection/opencvfacedetector.cpp 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/libkface/detection/opencvfacedetector.cpp 2016-03-04 09:00:03.837203004 +0100 @@ -136,13 +136,14 @@ cv::Size getOriginalWindowSize() const { +#if OPENCV_VERSION <= OPENCV_MAKE_VERSION(2,4,99) // This is a HACK which may break any time. Work around the fact that getOriginalWindowSize() // always returns (0,0) and we need these values. if (oldCascade) { return oldCascade->orig_window_size; } - +#endif return cv::Size(0, 0); } diff -urNB a/extra/libkface/libkface/libopencv.h.cmake.in b/extra/libkface/libkface/libopencv.h.cmake.in --- a/extra/libkface/libkface/libopencv.h.cmake.in 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/libkface/libopencv.h.cmake.in 2016-03-04 08:17:46.260398775 +0100 @@ -7,7 +7,7 @@ * @date 2010-06-16 * @brief Wrapper for OpenCV header files * - * @author Copyright (C) 2012-2014 by Gilles Caulier + * @author Copyright (C) 2012-2015 by Gilles Caulier * caulier dot gilles at gmail dot com * * This program is free software; you can redistribute it @@ -31,16 +31,16 @@ // Pragma directives to reduce warnings from OpenCV header files. #if not defined(__APPLE__) && defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" -#pragma GCC diagnostic ignored "-Woverloaded-virtual" +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnon-virtual-dtor" +# pragma GCC diagnostic ignored "-Woverloaded-virtual" #endif #if defined(__APPLE__) && defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnon-virtual-dtor" -#pragma clang diagnostic ignored "-Woverloaded-virtual" -#pragma clang diagnostic ignored "-Wcast-align" +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wnon-virtual-dtor" +# pragma clang diagnostic ignored "-Woverloaded-virtual" +# pragma clang diagnostic ignored "-Wcast-align" #endif // OpenCV includes @@ -49,15 +49,22 @@ #define OPENCV_MAKE_VERSION(major,minor,patch) (((major) << 16) | ((minor) << 8) | (patch)) #define OPENCV_VERSION OPENCV_MAKE_VERSION(CV_MAJOR_VERSION,CV_MINOR_VERSION,CV_SUBMINOR_VERSION) -#define OPENCV_TEST_VERSION(major,minor,patch) ( OPENCV_VERSION >= OPENCV_MAKE_VERSION(major,minor,patch) ) +#define OPENCV_TEST_VERSION(major,minor,patch) ( OPENCV_VERSION < OPENCV_MAKE_VERSION(major,minor,patch) ) -#include -#include -#include +#if(ENABLE_OPENCV3) +# include +# include +# include +#else +# include +# include +#endif // for old-style code +#if OPENCV_VERSION <= OPENCV_MAKE_VERSION(2,4,99) +# include +#endif #include -#include #include #include diff -urNB a/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.cpp b/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.cpp --- a/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.cpp 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.cpp 2016-03-04 11:03:01.968939437 +0100 @@ -36,6 +36,8 @@ * * ============================================================ */ +#define QT_NO_EMIT + #include "facerec_borrowed.h" // C++ includes @@ -375,7 +377,11 @@ } } +#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 @@ 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 @@ { 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 @@ // 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 @@ double mean = sum / it->second.size(); s += QString("%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 } kDebug() << s; @@ -462,7 +487,7 @@ // 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 @@ 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 @@ 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 @@ predict(_src, label, dummy); return label; } +#endif // Static method ---------------------------------------------------- @@ -531,14 +568,15 @@ return ptr; } -CV_INIT_ALGORITHM(LBPHFaceRecognizer, "FaceRecognizer.LBPH-KFaceIface", - obj.info()->addParam(obj, "radius", obj.m_radius); - obj.info()->addParam(obj, "neighbors", obj.m_neighbors); - obj.info()->addParam(obj, "grid_x", obj.m_grid_x); - obj.info()->addParam(obj, "grid_y", obj.m_grid_y); - obj.info()->addParam(obj, "threshold", obj.m_threshold); - obj.info()->addParam(obj, "histograms", obj.m_histograms); // modification: Make Read/Write - obj.info()->addParam(obj, "labels", obj.m_labels); // modification: Make Read/Write - obj.info()->addParam(obj, "statistic", obj.m_statisticsMode)); // modification: Add parameter - +#if OPENCV_VERSION <= OPENCV_MAKE_VERSION(2,4,99) + CV_INIT_ALGORITHM(LBPHFaceRecognizer, "FaceRecognizer.LBPH-KFaceIface", + obj.info()->addParam(obj, "radius", obj.m_radius); + obj.info()->addParam(obj, "neighbors", obj.m_neighbors); + obj.info()->addParam(obj, "grid_x", obj.m_grid_x); + obj.info()->addParam(obj, "grid_y", obj.m_grid_y); + obj.info()->addParam(obj, "threshold", obj.m_threshold); + obj.info()->addParam(obj, "histograms", obj.m_histograms); // modification: Make Read/Write + obj.info()->addParam(obj, "labels", obj.m_labels); // modification: Make Read/Write + obj.info()->addParam(obj, "statistic", obj.m_statisticsMode)) // modification: Add parameter +#endif } // namespace KFaceIface diff -urNB a/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.h b/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.h --- a/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.h 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/libkface/recognition-opencv-lbph/facerec_borrowed.h 2016-03-04 10:59:51.244576351 +0100 @@ -45,7 +45,11 @@ namespace KFaceIface { +#if OPENCV_TEST_VERSION(3,0,0) class LBPHFaceRecognizer : public cv::FaceRecognizer +#else +class LBPHFaceRecognizer : public cv::face::FaceRecognizer +#endif { public: @@ -99,8 +103,13 @@ ~LBPHFaceRecognizer() {} +#if OPENCV_TEST_VERSION(3,0,0) using cv::FaceRecognizer::save; using cv::FaceRecognizer::load; +#else + using cv::face::FaceRecognizer::save; + using cv::face::FaceRecognizer::load; +#endif static cv::Ptr create(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8, double threshold = DBL_MAX, PredictionStatistics statistics = NearestNeighbor); @@ -116,6 +125,8 @@ */ void update(cv::InputArrayOfArrays src, cv::InputArray labels); + +#if OPENCV_TEST_VERSION(3,1,0) /** * Predicts the label of a query image in src. */ @@ -125,6 +136,13 @@ * 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(). @@ -139,6 +157,8 @@ /** * Getter functions. */ +#if OPENCV_TEST_VERSION(3,0,0) + int neighbors() const { return m_neighbors; } int radius() const { return m_radius; } int grid_x() const { return m_grid_x; } @@ -147,6 +167,34 @@ // NOTE: Implementation done through CV_INIT_ALGORITHM macro from OpenCV. cv::AlgorithmInfo* info() const; +#else + + int getNeighbors() const { return m_neighbors; } + void setNeighbors(int _neighbors) { m_neighbors = _neighbors; } + + int getRadius() const { return m_radius; } + void setRadius(int radius) { m_radius = radius; } + + int getGrid_x() const { return m_grid_x; } + void setGrid_x(int _grid_x) { m_grid_x = _grid_x; } + + int getGrid_y() const { return m_grid_y; } + void setGrid_y(int _grid_y) { m_grid_y = _grid_y; } + + double getThreshold() const { return m_threshold; } + void setThreshold(double _threshold) { m_threshold = _threshold; } + + void setHistograms(std::vector _histograms) { m_histograms = _histograms; } + std::vector getHistograms() const { return m_histograms; } + + void setLabels(cv::Mat _labels) { m_labels = _labels; } + cv::Mat getLabels() const { return m_labels; } + + void setStatistic(int _statistic) { m_statisticsMode = _statistic; } + int getStatistic() const { return m_statisticsMode; } + +#endif + private: /** Computes a LBPH model with images in src and diff -urNB a/extra/libkface/libkface/recognition-opencv-lbph/lbphfacemodel.cpp b/extra/libkface/libkface/recognition-opencv-lbph/lbphfacemodel.cpp --- a/extra/libkface/libkface/recognition-opencv-lbph/lbphfacemodel.cpp 2015-09-03 23:22:44.000000000 +0200 +++ b/extra/libkface/libkface/recognition-opencv-lbph/lbphfacemodel.cpp 2016-03-04 08:17:46.260398775 +0100 @@ -61,7 +61,11 @@ : cv::Ptr(LBPHFaceRecognizer::create()), databaseId(0) { +#if OPENCV_TEST_VERSION(3,0,0) ptr()->set("threshold", 100.0); +#else + ptr()->setThreshold(100.0); +#endif } LBPHFaceModel::~LBPHFaceModel() @@ -80,7 +84,11 @@ const LBPHFaceRecognizer* LBPHFaceModel::ptr() const { +#if OPENCV_TEST_VERSION(3,0,0) const LBPHFaceRecognizer* const ptr = cv::Ptr::operator const KFaceIface::LBPHFaceRecognizer*(); +#else + const LBPHFaceRecognizer* const ptr = cv::Ptr::operator KFaceIface::LBPHFaceRecognizer*(); +#endif if (!ptr) kWarning() << "LBPHFaceRecognizer pointer is null"; @@ -90,47 +98,83 @@ int LBPHFaceModel::radius() const { +#if OPENCV_TEST_VERSION(3,0,0) return ptr()->get("radius"); +#else + return ptr()->getRadius(); +#endif } void LBPHFaceModel::setRadius(int radius) { +#if OPENCV_TEST_VERSION(3,0,0) ptr()->set("radius", radius); +#else + ptr()->setRadius(radius); +#endif } int LBPHFaceModel::neighbors() const { +#if OPENCV_TEST_VERSION(3,0,0) return ptr()->get("neighbors"); +#else + return ptr()->getNeighbors(); +#endif } void LBPHFaceModel::setNeighbors(int neighbors) { +#if OPENCV_TEST_VERSION(3,0,0) ptr()->set("neighbors", neighbors); +#else + ptr()->setNeighbors(neighbors); +#endif } int LBPHFaceModel::gridX() const { +#if OPENCV_TEST_VERSION(3,0,0) return ptr()->get("grid_x"); +#else + return ptr()->getGrid_x(); +#endif } void LBPHFaceModel::setGridX(int grid_x) { +#if OPENCV_TEST_VERSION(3,0,0) ptr()->set("grid_x", grid_x); +#else + ptr()->setGrid_x(grid_x); +#endif } int LBPHFaceModel::gridY() const { +#if OPENCV_TEST_VERSION(3,0,0) return ptr()->get("grid_y"); +#else + return ptr()->getGrid_y(); +#endif } void LBPHFaceModel::setGridY(int grid_y) { +#if OPENCV_TEST_VERSION(3,0,0) ptr()->set("grid_y", grid_y); +#else + ptr()->setGrid_y(grid_y); +#endif } OpenCVMatData LBPHFaceModel::histogramData(int index) const { +#if OPENCV_TEST_VERSION(3,0,0) return OpenCVMatData(ptr()->get >("histograms").at(index)); +#else + return OpenCVMatData(ptr()->getHistograms().at(index)); +#endif } QList LBPHFaceModel::histogramMetadata() const @@ -168,12 +212,24 @@ m_histogramMetadata << metadata; } +#if OPENCV_TEST_VERSION(3,0,0) std::vector currentHistograms = ptr()->get >("histograms"); cv::Mat currentLabels = ptr()->get("labels"); +#else + std::vector currentHistograms = ptr()->getHistograms(); + cv::Mat currentLabels = ptr()->getLabels(); +#endif + currentHistograms.insert(currentHistograms.end(), newHistograms.begin(), newHistograms.end()); currentLabels.push_back(newLabels); + +#if OPENCV_TEST_VERSION(3,0,0) ptr()->set("histograms", currentHistograms); - ptr()->set("labels", currentLabels); + ptr()->set("labels", currentLabels); +#else + ptr()->setHistograms(currentHistograms); + ptr()->setLabels(currentLabels); +#endif /* //Most cumbersome and inefficient way through a file storage which we were forced to use if we used standard OpenCV @@ -215,7 +271,11 @@ // Update local information // We assume new labels are simply appended +#if OPENCV_TEST_VERSION(3,0,0) cv::Mat currentLabels = ptr()->get("labels"); +#else + cv::Mat currentLabels = ptr()->getLabels(); +#endif for (int i = m_histogramMetadata.size() ; i < currentLabels.rows ; i++) {