Commit f1cfe8e83da14b21d35c703cd71f47aab90718c7

Authored by Josh Klontz
1 parent 9c26431f

removed nt4

openbr/plugins/classification/nt4.cpp deleted
1   -#include <QDebug>
2   -#include <QFileInfo>
3   -#include <QProcess>
4   -#include <QString>
5   -#include <QStringList>
6   -#include <NCore.h>
7   -#include <NImages.h>
8   -#include <NLExtractor.h>
9   -#include <NMatcher.h>
10   -#include <NMatcherParams.h>
11   -#include <NTemplate.h>
12   -#include <NLicensing.h>
13   -#include "openbr_internal.h"
14   -
15   -//IRIS
16   -#include <NEExtractor.h>
17   -#include <NEExtractorParams.h>
18   -#include <NERecord.h>
19   -#include <NETemplate.h>
20   -#include <Bmp.h>
21   -#include <NGrayscaleImage.h>
22   -
23   -#include <openbr/core/resource.h>
24   -#include <openbr/core/opencvutils.h>
25   -
26   -using namespace cv;
27   -using namespace br;
28   -
29   -/*!
30   - * \ingroup initializers
31   - * \brief Initialize Neurotech SDK 4
32   - * \author Josh Klontz \cite jklontz
33   - * \author E. Taborsky \cite mmtaborsky
34   - */
35   -class NT4Initializer : public Initializer
36   -{
37   - Q_OBJECT
38   -
39   - static void manageLicenses(bool obtain)
40   - {
41   - const NChar *components = { N_T("Biometrics.FaceExtraction,Biometrics.FaceMatching,Biometrics.IrisExtraction,Biometrics.IrisMatching") };
42   - if (obtain) {
43   - NBool available;
44   - if (!Globals->contains("NT4_SERVER_IP")) Globals->set("NT4_SERVER_IP", "128.29.70.34");
45   - NResult result = NLicenseObtainComponents(N_T(qPrintable(Globals->property("NT4_SERVER_IP").toString())), N_T("5000"), components, &available);
46   - if (NFailed(result)) qWarning("NLicenseObtainComponents() failed, result=%i.", result);
47   - if (!available) qWarning("NT4 components not available.");
48   - } else /* release */ {
49   - NResult result = NLicenseReleaseComponents(components);
50   - if (NFailed(result)) qWarning("NLicenseReleaseComponents() failed, result=%i.", result);
51   - }
52   - }
53   -
54   - void initialize() const
55   - {
56   - NCoreOnStart();
57   - Globals->abbreviations.insert("NT4Face", "Open+NT4DetectFace!NT4EnrollFace:NT4Compare");
58   - Globals->abbreviations.insert("NT4Iris", "Open+NT4EnrollIris:NT4Compare");
59   - manageLicenses(true);
60   - }
61   -
62   - void finalize() const
63   - {
64   - manageLicenses(false);
65   - NCoreOnExitEx(false);
66   - }
67   -};
68   -
69   -BR_REGISTER(Initializer, NT4Initializer)
70   -
71   -/*!
72   - * \brief Neurotech context
73   - * \author Josh Klontz \cite jklontz
74   - * \author E. Taborsky \cite mmtaborsky
75   - */
76   -struct NT4Context
77   -{
78   - HNLExtractor extractor; // Face extractor.
79   - HNEExtractor irisExtractor; // Iris extractor.
80   - HNMatcher matcher; // Template matcher.
81   -
82   - NT4Context()
83   - {
84   - NResult result;
85   -
86   - // Face
87   - // Create extractor
88   - result = NleCreate(&extractor);
89   - if (NFailed(result)) qFatal("NleCreate() failed, result=%i.", result);
90   -
91   - NBool detectAllFeaturePoints = true;
92   - NObjectSetParameter(extractor, NLEP_DETECT_ALL_FEATURE_POINTS, &detectAllFeaturePoints);
93   -
94   - NDouble faceConfidence = 1;
95   - NObjectSetParameter(extractor, NLEP_FACE_CONFIDENCE_THRESHOLD, &faceConfidence);
96   -
97   - NByte faceQuality = 1;
98   - NObjectSetParameter(extractor, NLEP_FACE_QUALITY_THRESHOLD, &faceQuality);
99   -
100   - NByte favorLargestFace = 0;
101   - NObjectSetParameter(extractor, NLEP_FAVOR_LARGEST_FACE, &favorLargestFace);
102   -
103   - NByte useLivenessCheck = 0;
104   - NObjectSetParameter(extractor, NLEP_USE_LIVENESS_CHECK, &useLivenessCheck);
105   -
106   - NleTemplateSize templSize = nletsLarge;
107   - NObjectSetParameter(extractor, NLEP_TEMPLATE_SIZE, &templSize);
108   -
109   - // Iris
110   - // Create extractor
111   -
112   - result = NeeCreate(&irisExtractor);
113   - if (NFailed(result)) qFatal("NeeCreate() failed, result=%i.", result);
114   -
115   - NInt boundaryPointCount = 32;
116   - NObjectSetParameter(irisExtractor, NEE_BOUNDARY_POINT_COUNT, &boundaryPointCount);
117   -
118   - NBool interlace = false;
119   - NObjectSetParameter(irisExtractor, NEEP_DEINTERLACE, &interlace);
120   -
121   -
122   - NInt innerBoundaryFrom = 40;
123   - NObjectSetParameter(irisExtractor, NEEP_INNER_BOUNDARY_FROM, &innerBoundaryFrom);
124   -
125   - NInt innerBoundaryTo = 160;
126   - NObjectSetParameter(irisExtractor, NEEP_INNER_BOUNDARY_TO, &innerBoundaryTo);
127   -
128   - NInt outerBoundaryFrom = 140;
129   - NObjectSetParameter(irisExtractor, NEEP_OUTER_BOUNDARY_FROM, &outerBoundaryFrom);
130   -
131   - NInt outerBoundaryTo = 255;
132   - NObjectSetParameter(irisExtractor, NEEP_OUTER_BOUNDARY_TO, &outerBoundaryTo);
133   -
134   -
135   - // Face
136   - // Create matcher
137   - result = NMCreate(&matcher);
138   - if (NFailed(result)) qFatal("NMCreate() failed, result=%i.",result);
139   -
140   - NInt matchingThreshold = 0;
141   - NObjectSetParameter(matcher, NMP_MATCHING_THRESHOLD, &matchingThreshold);
142   - }
143   -
144   - ~NT4Context()
145   - {
146   - NObjectFree(extractor);
147   - NObjectFree(irisExtractor);
148   - NObjectFree(matcher);
149   - }
150   -
151   - // to NT image
152   - static void toImage(const Mat &src, HNGrayscaleImage *grayscaleImage)
153   - {
154   - Mat gray;
155   - OpenCVUtils::cvtGray(src, gray);
156   - assert(gray.isContinuous());
157   -
158   - HNImage image;
159   - NResult result;
160   - result = NImageCreateFromDataEx(npfGrayscale, gray.cols, gray.rows, 0, gray.cols, gray.data, gray.rows*gray.cols, 0, &image);
161   - if (NFailed(result)) qFatal("NT4Context::toImage NImageCreateFromDataEx() failed, result=%i.", result);
162   -
163   - result = NImageToGrayscale(image, grayscaleImage);
164   - if (NFailed(result)) qFatal("NT4Context::toImage NImageToGrayscale() failed, result=%i.", result);
165   - NObjectFree(image);
166   - }
167   -
168   - // to OpenCV matrix
169   - static Mat toMat(const HNLTemplate &templ)
170   - {
171   - NSizeType bufferSize;
172   - NLTemplateGetSize(templ, 0, &bufferSize);
173   -
174   - Mat buffer(1, bufferSize, CV_8UC1);
175   - NLTemplateSaveToMemory(templ, buffer.data, bufferSize, 0, &bufferSize);
176   -
177   - return buffer;
178   - }
179   -
180   - // extract metadata
181   - static File toMetadata(const NleDetectionDetails &detectionDetails)
182   - {
183   - File metadata;
184   -
185   - metadata.insert("NT4_FaceAvailable", detectionDetails.FaceAvailable);
186   - metadata.insert("NT4_Face_Rectangle_X", detectionDetails.Face.Rectangle.X);
187   - metadata.insert("NT4_Face_Rectangle_Y", detectionDetails.Face.Rectangle.Y);
188   - metadata.insert("NT4_Face_Rectangle_Width", detectionDetails.Face.Rectangle.Width);
189   - metadata.insert("NT4_Face_Rectangle_Height", detectionDetails.Face.Rectangle.Height);
190   - metadata.insert("NT4_Face_Rotation_Roll", detectionDetails.Face.Rotation.Roll);
191   - metadata.insert("NT4_Face_Rotation_Pitch", detectionDetails.Face.Rotation.Pitch);
192   - metadata.insert("NT4_Face_Rotation_Yaw", detectionDetails.Face.Rotation.Yaw);
193   - metadata.insert("NT4_Face_Confidence", detectionDetails.Face.Confidence);
194   -
195   - metadata.insert("NT4_RightEyeCenter_X", detectionDetails.RightEyeCenter.X);
196   - metadata.insert("NT4_RightEyeCenter_Y", detectionDetails.RightEyeCenter.Y);
197   - metadata.insert("NT4_RightEyeCenter_Code", detectionDetails.RightEyeCenter.Code);
198   - metadata.insert("NT4_RightEyeCenter_Confidence", detectionDetails.RightEyeCenter.Confidence);
199   -
200   - metadata.insert("NT4_LeftEyeCenter_X", detectionDetails.LeftEyeCenter.X);
201   - metadata.insert("NT4_LeftEyeCenter_Y", detectionDetails.LeftEyeCenter.Y);
202   - metadata.insert("NT4_LeftEyeCenter_Code", detectionDetails.LeftEyeCenter.Code);
203   - metadata.insert("NT4_LeftEyeCenter_Confidence", detectionDetails.LeftEyeCenter.Confidence);
204   -
205   - metadata.insert("NT4_MouthCenter_X", detectionDetails.MouthCenter.X);
206   - metadata.insert("NT4_MouthCenter_Y", detectionDetails.MouthCenter.Y);
207   - metadata.insert("NT4_MouthCenter_Code", detectionDetails.MouthCenter.Code);
208   - metadata.insert("NT4_MouthCenter_Confidence", detectionDetails.MouthCenter.Confidence);
209   -
210   - metadata.insert("NT4_NoseTip_X", detectionDetails.NoseTip.X);
211   - metadata.insert("NT4_NoseTip_Y", detectionDetails.NoseTip.Y);
212   - metadata.insert("NT4_NoseTip_Code", detectionDetails.NoseTip.Code);
213   - metadata.insert("NT4_NoseTip_Confidence", detectionDetails.NoseTip.Confidence);
214   -
215   - return metadata;
216   - }
217   -
218   - // Initialize from metadata
219   - static NleDetectionDetails fromMetadata(const File &metadata)
220   - {
221   - NleDetectionDetails detectionDetails;
222   -
223   - detectionDetails.FaceAvailable = metadata.value("NT4_FaceAvailable").toBool();
224   - detectionDetails.Face.Rectangle.X = metadata.value("NT4_Face_Rectangle_X").toInt();
225   - detectionDetails.Face.Rectangle.Y = metadata.value("NT4_Face_Rectangle_Y").toInt();
226   - detectionDetails.Face.Rectangle.Width = metadata.value("NT4_Face_Rectangle_Width").toInt();
227   - detectionDetails.Face.Rectangle.Height = metadata.value("NT4_Face_Rectangle_Height").toInt();
228   - detectionDetails.Face.Rotation.Roll = metadata.value("NT4_Face_Rotation_Roll").toInt();
229   - detectionDetails.Face.Rotation.Pitch = metadata.value("NT4_Face_Rotation_Pitch").toInt();
230   - detectionDetails.Face.Rotation.Yaw = metadata.value("NT4_Face_Rotation_Yaw").toInt();
231   - detectionDetails.Face.Confidence = metadata.value("NT4_Face_Confidence").toDouble();
232   -
233   - detectionDetails.RightEyeCenter.X = metadata.value("NT4_RightEyeCenter_X").toInt();
234   - detectionDetails.RightEyeCenter.Y = metadata.value("NT4_RightEyeCenter_Y").toInt();
235   - detectionDetails.RightEyeCenter.Code = metadata.value("NT4_RightEyeCenter_Code").toInt();
236   - detectionDetails.RightEyeCenter.Confidence = metadata.value("NT4_RightEyeCenter_Confidence").toDouble();
237   -
238   - detectionDetails.LeftEyeCenter.X = metadata.value("NT4_LeftEyeCenter_X").toInt();
239   - detectionDetails.LeftEyeCenter.Y = metadata.value("NT4_LeftEyeCenter_Y").toInt();
240   - detectionDetails.LeftEyeCenter.Code = metadata.value("NT4_LeftEyeCenter_Code").toInt();
241   - detectionDetails.LeftEyeCenter.Confidence = metadata.value("NT4_LeftEyeCenter_Confidence").toDouble();
242   -
243   - detectionDetails.MouthCenter.X = metadata.value("NT4_MouthCenter_X").toInt();
244   - detectionDetails.MouthCenter.Y = metadata.value("NT4_MouthCenter_Y").toInt();
245   - detectionDetails.MouthCenter.Code = metadata.value("NT4_MouthCenter_Code").toInt();
246   - detectionDetails.MouthCenter.Confidence = metadata.value("NT4_MouthCenter_Confidence").toDouble();
247   -
248   - detectionDetails.NoseTip.X = metadata.value("NT4_NoseTip_X").toInt();
249   - detectionDetails.NoseTip.Y = metadata.value("NT4_NoseTip_Y").toInt();
250   - detectionDetails.NoseTip.Code = metadata.value("NT4_NoseTip_Code").toInt();
251   - detectionDetails.NoseTip.Confidence = metadata.value("NT4_NoseTip_Confidence").toDouble();
252   -
253   - return detectionDetails;
254   - }
255   -};
256   -
257   -/*!
258   - * \ingroup transforms
259   - * \brief Neurotech face detection
260   - * \author Josh Klontz \cite jklontz
261   - * \author E. Taborsky \cite mmtaborsky
262   - */
263   -class NT4DetectFace : public UntrainableTransform
264   -{
265   - Q_OBJECT
266   -
267   - Resource<NT4Context> contexts;
268   -
269   -public:
270   - NT4DetectFace() : UntrainableTransform(true) {}
271   -
272   -private:
273   - void project(const Template &src, Template &dst) const
274   - {
275   - HNGrayscaleImage grayscaleImage;
276   - NT4Context::toImage(src, &grayscaleImage);
277   -
278   - NT4Context *context = contexts.acquire();
279   -
280   - NInt faceCount;
281   - NleFace *faces;
282   - NResult result = NleDetectFaces(context->extractor, grayscaleImage, &faceCount, &faces);
283   - if (NFailed(result)) qFatal("NT4DetectFace::project NleDetectFaces() failed, result=%i.", result);
284   - for (int i=0; i<faceCount; i++) {
285   - NleDetectionDetails detectionDetails;
286   - result = NleDetectFacialFeatures(context->extractor, grayscaleImage, &faces[i], &detectionDetails);
287   - if (NFailed(result)) qFatal("NT4DetectFace::project NleDetectFacialFeatures() failed, result=%i.", result);
288   -
289   - dst.file.append(NT4Context::toMetadata(detectionDetails));
290   - dst += src;
291   - //if (!Globals.EnrollAll) break;
292   - }
293   -
294   - contexts.release(context);
295   - NObjectFree(grayscaleImage);
296   -
297   - //if (!Globals.EnrollAll && dst.isEmpty()) dst = Mat();
298   - if (dst.isEmpty()) dst = Mat();
299   - }
300   -};
301   -
302   -BR_REGISTER(Transform, NT4DetectFace)
303   -
304   -/*!
305   - * \ingroup transforms
306   - * \brief Enroll face in Neurotech SDK 4
307   - * \author Josh Klontz \cite jklontz
308   - */
309   -class NT4EnrollFace : public UntrainableTransform
310   -{
311   - Q_OBJECT
312   -
313   - Resource<NT4Context> contexts;
314   -
315   -public:
316   - NT4EnrollFace() : UntrainableTransform(true) {}
317   -
318   -private:
319   - void project(const Template &src, Template &dst) const
320   - {
321   - if (!src.m().data) {
322   - dst = Mat();
323   - return;
324   - }
325   -
326   - HNGrayscaleImage grayscaleImage;
327   - NT4Context::toImage(src, &grayscaleImage);
328   -
329   - NT4Context *context = contexts.acquire();
330   -
331   - NleDetectionDetails detectionDetails = NT4Context::fromMetadata(src.file);
332   - NleExtractionStatus extractionStatus;
333   - HNLTemplate templ;
334   -
335   - NResult result = NleExtract(context->extractor, grayscaleImage, &detectionDetails, &extractionStatus, &templ);
336   - contexts.release(context);
337   -
338   - if (NFailed(result) || (extractionStatus != nleesTemplateCreated))
339   - dst = Mat();
340   - else
341   - dst = NT4Context::toMat(templ);
342   -
343   - NObjectFree(templ);
344   - NObjectFree(grayscaleImage);
345   - }
346   -};
347   -
348   -BR_REGISTER(Transform, NT4EnrollFace)
349   -
350   -/*!
351   - * \ingroup transforms
352   - * \brief Enroll iris in Neurotech SDK 4
353   - * \author E. Taborsky \cite mmtaborsky
354   - */
355   -class NT4EnrollIris : public UntrainableTransform
356   -{
357   - Q_OBJECT
358   -
359   - Resource<NT4Context> contexts;
360   -
361   -public:
362   - NT4EnrollIris() : UntrainableTransform(true) {}
363   -
364   -private:
365   - void project(const Template &src, Template &dst) const
366   - {
367   - HNGrayscaleImage grayscaleImage;
368   - NT4Context::toImage(src, &grayscaleImage);
369   -
370   - NeeSegmentationDetails segmentationDetails;
371   - NeeExtractionStatus extractionStatus;
372   - HNERecord hRecord;
373   -
374   - NResult result = NERecordCreate((NUShort)src.m().cols,(NUShort)src.m().rows, 0, &hRecord); // This seems wrong...
375   - assert(!NFailed(result));
376   -
377   - NT4Context *context = contexts.acquire();
378   -
379   -
380   - result = NeeExtract(context->irisExtractor, grayscaleImage, nepUnknown, &segmentationDetails, &extractionStatus, &hRecord);
381   -
382   - if (!(segmentationDetails.OuterBoundaryAvailable)){
383   - qDebug("NT4EnrollIris::project Outer Boundary not available");
384   - }
385   -
386   - if (NFailed(result)) qFatal("NT4EnrollIris::project NeeExtract() failed, result=%i.", result);
387   - else if (extractionStatus == neeesTemplateCreated){
388   - NSizeType bufferSize;
389   - NERecordGetSize(hRecord, 0, &bufferSize);
390   -
391   - Mat buffer(1, bufferSize, CV_8UC1);
392   - NERecordSaveToMemory(hRecord, buffer.data, bufferSize, 0, &bufferSize);
393   -
394   - dst = Template(src.file, buffer);
395   - }
396   -
397   - contexts.release(context);
398   - NObjectFree(grayscaleImage);
399   -
400   - //if (!Globals.EnrollAll && dst.isEmpty()) dst.append(Template(src.file, Mat()));
401   - if (dst.isEmpty()) dst.append(Template(src.file, Mat()));
402   - }
403   -};
404   -
405   -BR_REGISTER(Transform, NT4EnrollIris)
406   -
407   -/*!
408   - * \ingroup distances
409   - * \brief Compare templates with Neurotech SDK 4
410   - * \author Josh Klontz \cite jklontz
411   - * \author E. Taborsky \cite mmtaborsky
412   - */
413   -class NT4Compare : public Distance
414   -{
415   - Q_OBJECT
416   -
417   - Resource<NT4Context> contexts;
418   -
419   - float compare(const br::Template &a, const br::Template &b) const
420   - {
421   - NT4Context *context = contexts.acquire();
422   -
423   - NResult result;
424   -
425   - const Mat &srcA = a;
426   - if (srcA.data) {
427   - result = NMIdentifyStartEx(context->matcher, srcA.data, srcA.rows*srcA.cols, NULL);
428   - if (NFailed(result)) qFatal("NT4Compare::compare NMIdentifyStart() failed, result=%i.", result);
429   - }
430   -
431   - const Mat &srcB = b;
432   - float score = -std::numeric_limits<float>::max();
433   - if (srcA.data && srcB.data) {
434   - NInt pScore;
435   - result = NMIdentifyNextEx(context->matcher, srcB.data, srcB.rows*srcB.cols, NULL, &pScore);
436   - if (NFailed(result)) qFatal("NT4Compare::compare NMIdentifyNext() failed, result=%i.",result);
437   - score = float(pScore);
438   - }
439   -
440   - if (srcA.data) {
441   - result = NMIdentifyEnd(context->matcher);
442   - if (NFailed(result)) qFatal("NT4Compare::compare NMIdentifyEnd() failed, result=%i.", result);
443   - }
444   -
445   - contexts.release(context);
446   - return score;
447   - }
448   -};
449   -
450   -BR_REGISTER(Distance, NT4Compare)
451   -
452   -#include "classification/nt4.moc"
openbr/plugins/cmake/nt4.cmake deleted
1   -set(BR_WITH_NT4 OFF CACHE BOOL "Build with Neurotec Biometric 4")
2   -
3   -if(${BR_WITH_NT4})
4   - find_package(NT4 REQUIRED)
5   - set(BR_THIRDPARTY_LIBS ${BR_THIRDPARTY_LIBS} ${NT4_LIBS})
6   - install(DIRECTORY ${NT4_DIR_LIB}/ DESTINATION lib)
7   -else()
8   - set(BR_EXCLUDED_PLUGINS ${BR_EXCLUDED_PLUGINS} plugins/classification/nt4.cpp)
9   -endif()