diff --git a/openbr/plugins/neclatent1.cpp b/openbr/plugins/neclatent1.cpp index a84142a..60c5bf7 100644 --- a/openbr/plugins/neclatent1.cpp +++ b/openbr/plugins/neclatent1.cpp @@ -1,8 +1,7 @@ #include #include -// necessary to allocate a large memory though the actual template size -// may be much smaller +// Necessary to allocate a large memory though the actual template size may be much smaller #define MAX_TEMPLATE_SIZE 400000 namespace br @@ -21,6 +20,7 @@ class NECLatent1Initialier : public Initializer { Globals->abbreviations.insert("NECTenprint1", "Open+Cvt(Gray)+NECLatent1Enroll:NECLatent1Compare"); Globals->abbreviations.insert("NECLatent1", "Open+Cvt(Gray)+NECLatent1Enroll(true):NECLatent1Compare"); + Globals->abbreviations.insert("NECLatentLFFS1", "Open+NECLatent1Enroll(true,ELFT_M):NECLatent1Compare(ELFT_M)"); } }; @@ -41,7 +41,8 @@ class NECLatent1EnrollTransform : public UntrainableTransform public: enum Algorithm { LFML, - ELFT }; + ELFT, + ELFT_M }; private: BR_PROPERTY(bool, latent, false) @@ -50,27 +51,35 @@ private: void project(const Template &src, Template &dst) const { if (src.m().type() != CV_8UC1) qFatal("Requires 8UC1 data!"); - unsigned char data[MAX_TEMPLATE_SIZE]; + uchar *data = src.m().data; + const int rows = src.m().rows; + const int columns = src.m().cols; + uchar buff[MAX_TEMPLATE_SIZE]; + uchar* pBuff = NULL; int size = 0; int error; if (latent) { - if (algorithm == LFML) error = NEC_LFML_ExtractLatent(src.m().data, src.m().rows, src.m().cols, 500, data, &size); - else error = NEC_ELFT_ExtractLatent(src.m().data, src.m().rows, src.m().cols, 500, 4, data, &size); + if (algorithm == LFML) error = NEC_LFML_ExtractLatent(data, rows, columns, 500, buff, &size); + else if (algorithm == ELFT) error = NEC_ELFT_ExtractLatent(data, rows, columns, 500, 4, buff, &size); + else error = NEC_ELFT_M_ExtractLatent(data, columns, 1, &pBuff, &size); } else { - if (algorithm == LFML) error = NEC_LFML_ExtractTenprint(src.m().data, src.m().rows, src.m().cols, 500, data, &size); - else error = NEC_ELFT_ExtractTenprint(src.m().data, src.m().rows, src.m().cols, 500, 2, data, &size); + if (algorithm == LFML) error = NEC_LFML_ExtractTenprint(data, rows, columns, 500, buff, &size); + else if (algorithm == ELFT) error = NEC_ELFT_ExtractTenprint(data, rows, columns, 500, 2, buff, &size); + else qFatal("ELFT_M Tenprint not implemented."); } if (!error) { cv::Mat n(1, size, CV_8UC1); - memcpy(n.data, data, size); + memcpy(n.data, buff, size); dst.m() = n; } else { qWarning("NECLatent1EnrollTransform error %d for file %s.", error, qPrintable(src.file.flat())); dst.m() = cv::Mat(); dst.file.set("FTE", true); } + + if (pBuff != NULL) NEC_ELFT_M_FreeTemplate(&pBuff); } }; @@ -89,17 +98,21 @@ class NECLatent1CompareDistance : public Distance public: enum Algorithm { LFML, - ELFT }; + ELFT, + ELFT_M }; private: BR_PROPERTY(Algorithm, algorithm, LFML) float compare(const Template &a, const Template &b) const { + uchar *aData = a.m().data; + uchar *bData = b.m().data; if (!a.m().data || !b.m().data) return -std::numeric_limits::max(); int score; - if (algorithm == LFML) NEC_LFML_Verify(b.m().data, b.m().total(), a.m().data, a.m().total(), &score); - else NEC_ELFT_Verify(b.m().data, a.m().data, &score, 2); + if (algorithm == LFML) NEC_LFML_Verify(bData, b.m().total(), aData, a.m().total(), &score); + else if (algorithm == ELFT) NEC_ELFT_Verify(bData, aData, &score, 1); + else NEC_ELFT_M_Verify(bData, aData, &score, 1); return score; } };