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