188 lines
7.7 KiB
C++
188 lines
7.7 KiB
C++
/*###############################################################################
|
|
#
|
|
# Copyright(c) 2019 NVIDIA CORPORATION.All Rights Reserved.
|
|
#
|
|
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
# and proprietary rights in and to this software, related documentation
|
|
# and any modifications thereto.Any use, reproduction, disclosure or
|
|
# distribution of this software and related documentation without an express
|
|
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
#
|
|
###############################################################################*/
|
|
|
|
#include "FeatureVertexName.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
|
|
// TODO: We should read this from a file
|
|
const LandmarkEOSMap LandmarkMapEOS[] = {
|
|
{ 33, "chin bottom" },
|
|
{ 225, "right eyebrow outer-corner" },
|
|
{ 229, "right eyebrow between middle and outer corner" },
|
|
{ 233, "right eyebrow middle, vertical middle" },
|
|
{ 2086, "right eyebrow between middle and inner corner" },
|
|
{ 157, "right eyebrow inner-corner" },
|
|
{ 590, "left eyebrow inner-corner" },
|
|
{ 2091, "left eyebrow between inner corner and middle" },
|
|
{ 666, "left eyebrow middle" },
|
|
{ 662, "left eyebrow between middle and outer corner" },
|
|
{ 658, "left eyebrow outer-corner" },
|
|
{ 2842, "bridge of the nose (parallel to upper eye lids)" },
|
|
{ 379, "middle of the nose, a bit below the lower eye lids" },
|
|
{ 272, "above nose-tip (1cm or so)" },
|
|
{ 114, "nose-tip" },
|
|
{ 100, "right nostril, below nose, nose-lip junction" },
|
|
{ 2794, "nose-lip junction" },
|
|
{ 270, "nose-lip junction" },
|
|
{ 2797, "nose-lip junction" },
|
|
{ 537, "left nostril, below nose, nose-lip junction" },
|
|
{ 177, "right eye outer-corner" },
|
|
{ 172, "right eye pupil top right (from subject's perspective)" },
|
|
{ 191, "right eye pupil top left" },
|
|
{ 181, "right eye inner-corner" },
|
|
{ 173, "right eye pupil bottom left" },
|
|
{ 174, "right eye pupil bottom right" },
|
|
{ 614, "left eye inner-corner" },
|
|
{ 624, "left eye pupil top right" },
|
|
{ 605, "left eye pupil top left" },
|
|
{ 610, "left eye outer-corner" },
|
|
{ 607, "left eye pupil bottom left" },
|
|
{ 606, "left eye pupil bottom right" },
|
|
{ 398, "right mouth corner" },
|
|
{ 315, "upper lip right top outer" },
|
|
{ 413, "upper lip middle top right" },
|
|
{ 329, "upper lip middle top" },
|
|
{ 825, "upper lip middle top left" },
|
|
{ 736, "upper lip left top outer" },
|
|
{ 812, "left mouth corner" },
|
|
{ 841, "lower lip left bottom outer" },
|
|
{ 693, "lower lip middle bottom left" },
|
|
{ 411, "lower lip middle bottom" },
|
|
{ 264, "lower lip middle bottom right" },
|
|
{ 431, "lower lip right bottom outer" },
|
|
{ 416, "upper lip right bottom outer" },
|
|
{ 423, "upper lip middle bottom" },
|
|
{ 828, "upper lip left bottom outer" },
|
|
{ 817, "lower lip left top outer" },
|
|
{ 442, "lower lip middle top" },
|
|
{ 404, "lower lip right top outer" },
|
|
{ 0xFFFF, nullptr }
|
|
};
|
|
|
|
static const LandmarksMap LandmarkMap[] = {
|
|
{ 0, 0, "right contour point 1" },
|
|
{ 1, 2, "right contour point 2" },
|
|
{ 2, 4, "right contour point 3" },
|
|
{ 3, 6, "right contour point 4" },
|
|
{ 4, 8, "right contour point 5" },
|
|
{ 5, 10, "right contour point 6" },
|
|
{ 6, 12, "right contour point 7" },
|
|
{ 7, 14, "right contour point 8" },
|
|
{ 8, 16, "chin bottom" },
|
|
{ 9, 18, "left contour point 1" },
|
|
{ 10, 20, "left contour point 2" },
|
|
{ 11, 22, "left contour point 3" },
|
|
{ 12, 24, "left contour point 4" },
|
|
{ 13, 26, "left contour point 5" },
|
|
{ 14, 28, "left contour point 6" },
|
|
{ 15, 30, "left contour point 7" },
|
|
{ 16, 32, "left contour point 8" },
|
|
{ 17, 33, "right eyebrow outer-corner" },
|
|
{ 18, 34, "right eyebrow between middle and outer corner" },
|
|
{ 19, 35, "right eyebrow middle, vertical middle" },
|
|
{ 20, 36, "right eyebrow between middle and inner corner" },
|
|
{ 21, 37, "right eyebrow inner-corner" },
|
|
{ 22, 42, "left eyebrow inner-corner" },
|
|
{ 23, 43, "left eyebrow between inner corner and middle" },
|
|
{ 24, 44, "left eyebrow middle" },
|
|
{ 25, 45, "left eyebrow between middle and outer corner" },
|
|
{ 26, 46, "left eyebrow outer-corner" },
|
|
{ 27, 51, "bridge of the nose (parallel to upper eye lids)" },
|
|
{ 28, 52, "middle of the nose, a bit below the lower eye lids" },
|
|
{ 29, 53, "above nose-tip (1cm or so)" },
|
|
{ 30, 54, "nose-tip" },
|
|
{ 31, 57, "right nostril, below nose, nose-lip junction" },
|
|
{ 32, 58, "nose-lip junction" },
|
|
{ 33, 59, "nose-lip junction" },
|
|
{ 34, 60, "nose-lip junction" },
|
|
{ 35, 61, "left nostril, below nose, nose-lip junction" },
|
|
{ 36, 64, "right eye outer-corner" },
|
|
{ 37, 65, "right eye pupil top right (from subject's perspective)" },
|
|
{ 38, 67, "right eye pupil top left" },
|
|
{ 39, 68, "right eye inner-corner" },
|
|
{ 40, 69, "right eye pupil bottom left" },
|
|
{ 41, 71, "right eye pupil bottom right" },
|
|
{ 42, 81, "left eye inner-corner" },
|
|
{ 43, 82, "left eye pupil top right" },
|
|
{ 44, 84, "left eye pupil top left" },
|
|
{ 45, 85, "left eye outer-corner" },
|
|
{ 46, 86, "left eye pupil bottom left" },
|
|
{ 47, 88, "left eye pupil bottom right" },
|
|
{ 48, 98, "right mouth corner" },
|
|
{ 49, 99, "upper lip right top outer" },
|
|
{ 50, 100, "upper lip middle top right" },
|
|
{ 51, 101, "upper lip middle top" },
|
|
{ 52, 102, "upper lip middle top left" },
|
|
{ 53, 103, "upper lip left top outer" },
|
|
{ 54, 104, "left mouth corner" },
|
|
{ 55, 105, "lower lip left bottom outer" },
|
|
{ 56, 106, "lower lip middle bottom left" },
|
|
{ 57, 107, "lower lip middle bottom" },
|
|
{ 58, 108, "lower lip middle bottom right" },
|
|
{ 59, 109, "lower lip right bottom outer" },
|
|
{ 60, 110, "right inner mouth corner "},
|
|
{ 61, 111, "upper lip right bottom outer" },
|
|
{ 62, 112, "upper lip middle bottom" },
|
|
{ 63, 113, "upper lip left bottom outer" },
|
|
{ 64, 114, "left inner mouth corner"},
|
|
{ 65, 115, "lower lip left top outer" },
|
|
{ 66, 116, "lower lip middle top" },
|
|
{ 67, 117, "lower lip right top outer" },
|
|
{ 0xFFFF, 0xFFFF, nullptr }
|
|
};
|
|
|
|
|
|
unsigned short FindEOSLandmarkIndexFromName(const char* name)
|
|
{
|
|
if (!name)
|
|
return 0xFFFF;
|
|
switch (name[0]) {
|
|
case '#': // 1-based index ...
|
|
return (unsigned short)(strtol(name + 1, nullptr, 10) - 1); // ... gets converted into a 0-based index
|
|
case '@': // 0-based index
|
|
return (unsigned short)strtol(name + 1, nullptr, 10);
|
|
default:
|
|
break;
|
|
}
|
|
const LandmarkEOSMap* lmList = LandmarkMapEOS;
|
|
for (; lmList->name != nullptr; ++lmList)
|
|
if (!strcmp(name, lmList->name))
|
|
break;
|
|
return lmList->index;
|
|
}
|
|
|
|
unsigned short FindLandmarkIndexFromName(const unsigned int numLandmarks, const char* name) {
|
|
if (!name)
|
|
return 0xFFFF;
|
|
switch (name[0]) {
|
|
case '#': // 1-based index ...
|
|
return (unsigned short)(strtol(name + 1, nullptr, 10) - 1); // ... gets converted into a 0-based index
|
|
case '@': // 0-based index
|
|
return (unsigned short)strtol(name + 1, nullptr, 10);
|
|
default:
|
|
break;
|
|
}
|
|
const LandmarksMap* lmList = LandmarkMap;
|
|
for (; lmList->name != nullptr; ++lmList)
|
|
if (!strcmp(name, lmList->name))
|
|
break;
|
|
if (numLandmarks == 68) {
|
|
return lmList->index_68;
|
|
} else if (numLandmarks == 126) {
|
|
return lmList->index_126;
|
|
} else {
|
|
return 0xFFFF;
|
|
}
|
|
}
|