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()