Commit 6349b9cf49b5131b060c860eeb657aa01072d564
1 parent
b2d2cf68
removed NEC wrappers
Showing
6 changed files
with
0 additions
and
346 deletions
openbr/plugins/nec3.cmake deleted
openbr/plugins/nec3.cpp deleted
| 1 | -#ifdef WIN32 | |
| 2 | -#include <windows.h> | |
| 3 | -#endif | |
| 4 | - | |
| 5 | -#include <NeoFacePro.h> | |
| 6 | - | |
| 7 | -#include "openbr_internal.h" | |
| 8 | -#include "openbr/core/resource.h" | |
| 9 | - | |
| 10 | -using namespace br; | |
| 11 | - | |
| 12 | -/*! | |
| 13 | - * \ingroup initializers | |
| 14 | - * \brief Initialize NEC3 | |
| 15 | - * \author Josh Klontz \cite jklontz | |
| 16 | - * \author Scott Klum \cite sklum | |
| 17 | - * \warning Needs a maintainer | |
| 18 | - */ | |
| 19 | -class NEC3Initializer : public Initializer | |
| 20 | -{ | |
| 21 | - Q_OBJECT | |
| 22 | - | |
| 23 | - void initialize() const | |
| 24 | - { | |
| 25 | - int result = NeoFacePro::Initialize(); | |
| 26 | - if (result != NFP_SUCCESS) qWarning("NEC3 Initialize error [%d]", result); | |
| 27 | - Globals->abbreviations.insert("NEC3", "Open!NEC3Enroll:NEC3Compare"); | |
| 28 | - } | |
| 29 | - | |
| 30 | - void finalize() const | |
| 31 | - { | |
| 32 | - int result = NeoFacePro::Terminate(); | |
| 33 | - if (result != NFP_SUCCESS) qWarning("NEC3 Finalize error [%d]", result); | |
| 34 | - } | |
| 35 | -}; | |
| 36 | - | |
| 37 | -BR_REGISTER(Initializer, NEC3Initializer) | |
| 38 | - | |
| 39 | -/*! | |
| 40 | - * \brief NEC3 Context | |
| 41 | - * \author Scott Klum \cite sklum | |
| 42 | - */ | |
| 43 | - | |
| 44 | -struct NEC3Context | |
| 45 | -{ | |
| 46 | - NeoFacePro::CFaceInfo faceInfo; | |
| 47 | - NeoFacePro::CFaceFeature faceFeature; | |
| 48 | - | |
| 49 | - NEC3Context() { | |
| 50 | - faceInfo.SetParamAlgorithm(NFP_ALGORITHM003); | |
| 51 | - faceInfo.SetParamEyesRoll(15); | |
| 52 | - faceInfo.SetParamEyesMaxWidth(1000); | |
| 53 | - faceInfo.SetParamEyesMinWidth(30); | |
| 54 | - faceInfo.SetParamMaxFace(1); | |
| 55 | - faceInfo.SetParamReliability(0); | |
| 56 | - | |
| 57 | - faceFeature.SetParamFeatureType(NFP_FEATURE_S14); | |
| 58 | - } | |
| 59 | -}; | |
| 60 | - | |
| 61 | -/*! | |
| 62 | - * \ingroup transforms | |
| 63 | - * \brief Enroll a face image in NEC NeoFace 3 | |
| 64 | - * \author Josh Klontz \cite jklontz | |
| 65 | - * \author Scott Klum \cite sklum | |
| 66 | - * \warning Needs a maintainer | |
| 67 | - */ | |
| 68 | -class NEC3Enroll : public UntrainableTransform | |
| 69 | -{ | |
| 70 | - Q_OBJECT | |
| 71 | - Q_PROPERTY(bool detectOnly READ get_detectOnly WRITE set_detectOnly RESET reset_detectOnly STORED false) | |
| 72 | - BR_PROPERTY(bool, detectOnly, false) | |
| 73 | - | |
| 74 | - Resource<NEC3Context> contexts; | |
| 75 | - QSharedPointer<Transform> flip; | |
| 76 | - | |
| 77 | - void init() | |
| 78 | - { | |
| 79 | - contexts.setMaxResources(1); | |
| 80 | - flip = QSharedPointer<Transform>(Transform::make("Flip(X)")); | |
| 81 | - } | |
| 82 | - | |
| 83 | - void project(const Template &src, Template &dst) const | |
| 84 | - { | |
| 85 | - if (src.m().type() != CV_8UC3) qFatal("NEC3Enroll requires 8UC3 images."); | |
| 86 | - | |
| 87 | - // Bitmaps are stored upside down | |
| 88 | - Template flipped; | |
| 89 | - flip->project(src, flipped); | |
| 90 | - | |
| 91 | - cv::Mat input = flipped.m(); | |
| 92 | - input = input(cv::Rect(0, 0, (input.cols/4)*4, (input.rows/4)*4)).clone(); // For whatever reason, NEC requires images with 4 pixel alignment... | |
| 93 | - | |
| 94 | - BITMAPINFO binfo; | |
| 95 | - binfo.bmiHeader.biWidth = input.cols; | |
| 96 | - binfo.bmiHeader.biHeight = input.rows; | |
| 97 | - binfo.bmiHeader.biBitCount = 24; | |
| 98 | - | |
| 99 | - NEC3Context *context = contexts.acquire(); | |
| 100 | - int result = context->faceInfo.FindFace(binfo, input.data); | |
| 101 | - context->faceInfo.LocateEyes(); | |
| 102 | - | |
| 103 | - if (result == NFP_CANNOT_FIND_FACE) { | |
| 104 | - if (Globals->verbose) qDebug("NEC3Enroll face not found for file %s", qPrintable(src.file.flat())); | |
| 105 | - } else if (result != NFP_SUCCESS) { | |
| 106 | - qWarning("NEC3Enroll FindFace error %d for file %s", result, qPrintable(src.file.flat())); | |
| 107 | - } | |
| 108 | - | |
| 109 | - QList<QPointF> landmarks; | |
| 110 | - for (int i=0; i<context->faceInfo.GetFaceMax(); i++) { | |
| 111 | - if (context->faceInfo.SetFaceIndex(i) != NFP_SUCCESS) | |
| 112 | - continue; | |
| 113 | - POINT right = context->faceInfo.GetRightEye(); | |
| 114 | - POINT left = context->faceInfo.GetLeftEye(); | |
| 115 | - landmarks.append(QPointF(right.x, right.y)); | |
| 116 | - landmarks.append(QPointF(left.x, left.y)); | |
| 117 | - | |
| 118 | - if (detectOnly) { | |
| 119 | - dst += src.m(); | |
| 120 | - } else { | |
| 121 | - result = context->faceFeature.SetFeature(&context->faceInfo); | |
| 122 | - if (result != NFP_SUCCESS) { | |
| 123 | - qWarning("NEC3Enroll SetFeature error %d for file %s", result, qPrintable(src.file.flat())); | |
| 124 | - continue; | |
| 125 | - } | |
| 126 | - | |
| 127 | - void *data; | |
| 128 | - long size; | |
| 129 | - result = context->faceFeature.Serialize(&data, &size); | |
| 130 | - if (result != NFP_SUCCESS) { | |
| 131 | - qWarning("NEC3Enroll Serialize error %d for file %s", result, qPrintable(src.file.flat())); | |
| 132 | - continue; | |
| 133 | - } | |
| 134 | - | |
| 135 | - dst += cv::Mat(1, size, CV_8UC1, data).clone(); | |
| 136 | - NeoFacePro::CFaceFeature::FreeSerializeData(data); | |
| 137 | - } | |
| 138 | - | |
| 139 | - if (src.file.get<bool>("ForceEnrollment", false) && !dst.isEmpty()) break; | |
| 140 | - } | |
| 141 | - dst.file.appendPoints(landmarks); | |
| 142 | - | |
| 143 | - contexts.release(context); | |
| 144 | - | |
| 145 | - if (!src.file.get<bool>("enrollAll", false) && dst.isEmpty()) dst += cv::Mat(); | |
| 146 | - } | |
| 147 | -}; | |
| 148 | - | |
| 149 | -BR_REGISTER(Transform, NEC3Enroll) | |
| 150 | - | |
| 151 | -/*! | |
| 152 | - * \ingroup distances | |
| 153 | - * \brief Compare faces with NEC NeoFace 3 SDK | |
| 154 | - * \author Josh Klontz \cite jklontz | |
| 155 | - * \author Scott Klum \cite sklum | |
| 156 | - * \warning Needs a maintainer | |
| 157 | - */ | |
| 158 | -class NEC3Compare : public Distance | |
| 159 | -{ | |
| 160 | - Q_OBJECT | |
| 161 | - | |
| 162 | - Resource<NeoFacePro::CVerifier> verifierResource; | |
| 163 | - | |
| 164 | - float compare(const Template &a, const Template &b) const | |
| 165 | - { | |
| 166 | - float score = -std::numeric_limits<float>::max(); | |
| 167 | - if (a.m().data && b.m().data) { | |
| 168 | - NeoFacePro::CVerifier *verifier = verifierResource.acquire(); | |
| 169 | - int result = verifier->Verify(a.m().data, b.m().data, &score); | |
| 170 | - if (result != NFP_SUCCESS) qWarning("NEC3Compare verify error [%d]", result); | |
| 171 | - verifierResource.release(verifier); | |
| 172 | - } | |
| 173 | - return score; | |
| 174 | - } | |
| 175 | -}; | |
| 176 | - | |
| 177 | -BR_REGISTER(Distance, NEC3Compare) | |
| 178 | - | |
| 179 | -#include "nec3.moc" |
openbr/plugins/neclatent1.cmake deleted
| 1 | -set(BR_WITH_NECLATENT1 OFF CACHE BOOL "Build with NEC Latent SDK 1") | |
| 2 | - | |
| 3 | -if(${BR_WITH_NECLATENT1}) | |
| 4 | - find_package(NECLATENT1 REQUIRED) | |
| 5 | - set(BR_THIRDPARTY_SRC ${BR_THIRDPARTY_SRC} plugins/neclatent1.cpp) | |
| 6 | - set(BR_THIRDPARTY_LIBS ${BR_THIRDPARTY_LIBS} ${NECLATENT1_LIBS}) | |
| 7 | - install(DIRECTORY ${NECLATENT1_BIN_DIR}/ DESTINATION bin) | |
| 8 | -endif() |
openbr/plugins/neclatent1.cpp deleted
| 1 | -#include <LatentEFS.h> | |
| 2 | - | |
| 3 | -#include "openbr_internal.h" | |
| 4 | - | |
| 5 | -// Necessary to allocate a large memory though the actual template size may be much smaller | |
| 6 | -#define MAX_TEMPLATE_SIZE 400000 | |
| 7 | - | |
| 8 | -namespace br | |
| 9 | -{ | |
| 10 | - | |
| 11 | -/*! | |
| 12 | - * \ingroup initializers | |
| 13 | - * \brief Initialize the NEC Latent SDK wrapper. | |
| 14 | - * \author Josh Klontz \cite jklontz | |
| 15 | - */ | |
| 16 | -class NECLatent1Initialier : public Initializer | |
| 17 | -{ | |
| 18 | - Q_OBJECT | |
| 19 | - | |
| 20 | - void initialize() const | |
| 21 | - { | |
| 22 | - Globals->abbreviations.insert("NECTenprintLFML", "Open+Cvt(Gray)+NECLatent1Enroll(false,LFML):NECLatent1Compare(LFML)"); | |
| 23 | - Globals->abbreviations.insert("NECTenprintELFT", "Open+Cvt(Gray)+NECLatent1Enroll(false,ELFT):NECLatent1Compare(ELFT)"); | |
| 24 | - Globals->abbreviations.insert("NECTenprintELFTM", "Open+Cvt(Gray)+NECLatent1Enroll(false,ELFT_M):NECLatent1Compare(ELFT_M)"); | |
| 25 | - Globals->abbreviations.insert("NECLatentLFML", "Open+Cvt(Gray)+NECLatent1Enroll(true,LFML):NECLatent1Compare(LFML)"); | |
| 26 | - Globals->abbreviations.insert("NECLatentELFT", "Open+Cvt(Gray)+NECLatent1Enroll(true,ELFT):NECLatent1Compare(ELFT)"); | |
| 27 | - Globals->abbreviations.insert("NECLatentELFTM", "Open+NECLatent1Enroll(true,ELFT_M):NECLatent1Compare(ELFT_M)"); | |
| 28 | - } | |
| 29 | -}; | |
| 30 | - | |
| 31 | -BR_REGISTER(Initializer, NECLatent1Initialier) | |
| 32 | - | |
| 33 | -/*! | |
| 34 | - * \ingroup transforms | |
| 35 | - * \brief Enroll an NEC latent fingerprint. | |
| 36 | - * \author Josh Klontz \cite jklontz | |
| 37 | - * \warning Applications using this transform must have their working directory be the 'bin/win/32' folder of the NEC Latent SDK. | |
| 38 | - */ | |
| 39 | -class NECLatent1EnrollTransform : public UntrainableTransform | |
| 40 | -{ | |
| 41 | - Q_OBJECT | |
| 42 | - Q_ENUMS(Algorithm) | |
| 43 | - Q_PROPERTY(bool latent READ get_latent WRITE set_latent RESET reset_latent STORED false) | |
| 44 | - Q_PROPERTY(Algorithm algorithm READ get_algorithm WRITE set_algorithm RESET reset_algorithm STORED false) | |
| 45 | - | |
| 46 | -public: | |
| 47 | - enum Algorithm { LFML, | |
| 48 | - ELFT, | |
| 49 | - ELFT_M }; | |
| 50 | - | |
| 51 | -private: | |
| 52 | - BR_PROPERTY(bool, latent, false) | |
| 53 | - BR_PROPERTY(Algorithm, algorithm, LFML) | |
| 54 | - | |
| 55 | - void project(const Template &src, Template &dst) const | |
| 56 | - { | |
| 57 | - static QMutex mutex; | |
| 58 | - QMutexLocker locker(&mutex); // It seems that most of the API is not reentrant | |
| 59 | - | |
| 60 | - if (src.m().type() != CV_8UC1) qFatal("Requires 8UC1 data!"); | |
| 61 | - uchar *data = src.m().data; | |
| 62 | - const int rows = src.m().rows; | |
| 63 | - const int columns = src.m().cols; | |
| 64 | - | |
| 65 | - uchar buff[MAX_TEMPLATE_SIZE]; | |
| 66 | - uchar* pBuff = NULL; | |
| 67 | - int size, error; | |
| 68 | - if (latent) { | |
| 69 | - if (algorithm == LFML) error = NEC_LFML_ExtractLatent(data, rows, columns, 500, buff, &size); | |
| 70 | - else if (algorithm == ELFT) error = NEC_ELFT_ExtractLatent(data, rows, columns, 500, 32, buff, &size); | |
| 71 | - else error = NEC_ELFT_M_ExtractLatent(data, columns, 5, &pBuff, &size); | |
| 72 | - } else { | |
| 73 | - if (algorithm == LFML) error = NEC_LFML_ExtractTenprint(data, rows, columns, 500, buff, &size); | |
| 74 | - else if (algorithm == ELFT) error = NEC_ELFT_ExtractTenprint(data, rows, columns, 500, 8, buff, &size); | |
| 75 | - else error = NEC_ELFT_M_ExtractTenprint(data, rows, columns, 500, 5, &pBuff, &size); | |
| 76 | - } | |
| 77 | - | |
| 78 | - if (!error) { | |
| 79 | - cv::Mat n(1, size, CV_8UC1); | |
| 80 | - memcpy(n.data, pBuff ? pBuff : buff, size); | |
| 81 | - dst.m() = n; | |
| 82 | - } else { | |
| 83 | - qWarning("NECLatent1EnrollTransform error %d for file %s.", error, qPrintable(src.file.flat())); | |
| 84 | - dst.m() = cv::Mat(); | |
| 85 | - dst.file.set("FTE", true); | |
| 86 | - } | |
| 87 | - | |
| 88 | - if (pBuff != NULL) NEC_ELFT_M_FreeTemplate(&pBuff); | |
| 89 | - } | |
| 90 | -}; | |
| 91 | - | |
| 92 | -BR_REGISTER(Transform, NECLatent1EnrollTransform) | |
| 93 | - | |
| 94 | -/*! | |
| 95 | - * \ingroup distances | |
| 96 | - * \brief Compare two NEC latent fingerprints | |
| 97 | - * \author Josh Klontz \cite jklontz | |
| 98 | - */ | |
| 99 | -class NECLatent1CompareDistance : public Distance | |
| 100 | -{ | |
| 101 | - Q_OBJECT | |
| 102 | - Q_ENUMS(Algorithm) | |
| 103 | - Q_PROPERTY(Algorithm algorithm READ get_algorithm WRITE set_algorithm RESET reset_algorithm STORED false) | |
| 104 | - | |
| 105 | -public: | |
| 106 | - enum Algorithm { LFML, | |
| 107 | - ELFT, | |
| 108 | - ELFT_M }; | |
| 109 | - | |
| 110 | -private: | |
| 111 | - BR_PROPERTY(Algorithm, algorithm, LFML) | |
| 112 | - | |
| 113 | - float compare(const Template &a, const Template &b) const | |
| 114 | - { | |
| 115 | - uchar *aData = a.m().data; | |
| 116 | - uchar *bData = b.m().data; | |
| 117 | - if (!a.m().data || !b.m().data) return -std::numeric_limits<float>::max(); | |
| 118 | - int score, error; | |
| 119 | - if (algorithm == LFML) error = NEC_LFML_Verify(bData, b.m().total(), aData, a.m().total(), &score); | |
| 120 | - else if (algorithm == ELFT) error = NEC_ELFT_Verify(bData, aData, &score, 1); | |
| 121 | - else error = NEC_ELFT_M_Verify(bData, aData, &score, 1); | |
| 122 | - if (error) | |
| 123 | - qWarning("NECLatent1CompareDistance error %d", error); | |
| 124 | - return score; | |
| 125 | - } | |
| 126 | -}; | |
| 127 | - | |
| 128 | -BR_REGISTER(Distance, NECLatent1CompareDistance) | |
| 129 | - | |
| 130 | -} // namespace br | |
| 131 | - | |
| 132 | -#include "neclatent1.moc" |
share/openbr/cmake/FindNEC3.cmake deleted
share/openbr/cmake/FindNECLatent1.cmake deleted
| 1 | -find_path(NECLATENT1_DIR include/LatentEFS.h ${CMAKE_SOURCE_DIR}/3rdparty/*) | |
| 2 | - | |
| 3 | -set(NECLATENT1_SUBDIR /win/${BITNESS}) | |
| 4 | -set(NECLATENT1_LIB_DIR ${NECLATENT1_DIR}/lib${NECLATENT1_SUBDIR}) | |
| 5 | -set(NECLATENT1_BIN_DIR ${NECLATENT1_DIR}/bin${NECLATENT1_SUBDIR}) | |
| 6 | - | |
| 7 | -include_directories(${NECLATENT1_DIR}/include) | |
| 8 | -link_directories(${NECLATENT1_LIB_DIR}) | |
| 9 | - | |
| 10 | -if(MSVC) | |
| 11 | - file(GLOB NECLATENT1_LIBS ${NECLATENT1_LIB_DIR}/*.lib) | |
| 12 | -else() | |
| 13 | - file(GLOB NECLATENT1_LIBS ${NECLATENT1_BIN_DIR}/*.dll) | |
| 14 | -endif() |