File indexing completed on 2025-03-09 03:54:59

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2019-07-09
0007  * Description : Preprocessor for face recognition
0008  *
0009  * SPDX-FileCopyrightText: 2019      by Thanh Trung Dinh <dinhthanhtrung1996 at gmail dot com>
0010  * SPDX-FileCopyrightText: 2019-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "recognitionpreprocessor.h"
0017 
0018 // Local includes
0019 
0020 #include "openfacepreprocessor.h"
0021 #include "digikam_debug.h"
0022 
0023 namespace Digikam
0024 {
0025 
0026 class RecognitionPreprocessor::Private
0027 {
0028 
0029 public:
0030 
0031     explicit Private();
0032     ~Private();
0033 
0034     void init(PreprocessorSelection mode);
0035     cv::Mat preprocess(const cv::Mat& image) const;
0036 
0037 private:
0038 
0039     int                   preprocessingMode;
0040 
0041     OpenfacePreprocessor* ofpreprocessor;
0042 };
0043 
0044 // -------------------------------------------------------------------------------
0045 
0046 RecognitionPreprocessor::Private::Private()
0047   : preprocessingMode(-1),
0048     ofpreprocessor   (nullptr)
0049 {
0050 }
0051 
0052 RecognitionPreprocessor::Private::~Private()
0053 {
0054     delete ofpreprocessor;
0055 }
0056 
0057 void RecognitionPreprocessor::Private::init(PreprocessorSelection mode)
0058 {
0059     preprocessingMode = mode;
0060 
0061     switch (mode)
0062     {
0063         case OPENFACE:
0064         {
0065             ofpreprocessor = new OpenfacePreprocessor;
0066             ofpreprocessor->loadModels();
0067             break;
0068         }
0069 
0070         default:
0071         {
0072             qCDebug(DIGIKAM_FACEDB_LOG) << "Error unknown preprocessingMode " << preprocessingMode;
0073             preprocessingMode = -1;
0074         }
0075     }
0076 }
0077 
0078 cv::Mat RecognitionPreprocessor::Private::preprocess(const cv::Mat& image) const
0079 {
0080     switch (preprocessingMode)
0081     {
0082         case OPENFACE:
0083         {
0084             qCDebug(DIGIKAM_FACEDB_LOG) << "Align face for OpenFace neural network model";
0085 
0086             return ofpreprocessor->process(image);
0087         }
0088 
0089         default:
0090         {
0091             qCDebug(DIGIKAM_FACEDB_LOG) << "Error unknown preprocessingMode " << preprocessingMode;
0092 
0093             return image;
0094         }
0095     }
0096 }
0097 
0098 // ------------------------------------------------------------------------------------------------------
0099 
0100 RecognitionPreprocessor::RecognitionPreprocessor()
0101     : FacePreprocessor(),
0102       d               (new Private)
0103 {
0104 }
0105 
0106 RecognitionPreprocessor::~RecognitionPreprocessor()
0107 {
0108     delete d;
0109 }
0110 
0111 void RecognitionPreprocessor::init(PreprocessorSelection mode)
0112 {
0113     d->init(mode);
0114 }
0115 
0116 cv::Mat RecognitionPreprocessor::preprocess(const cv::Mat& image) const
0117 {
0118     return d->preprocess(image);
0119 }
0120 
0121 } // namespace Digikam