landmarks.h 4.7 KB
// landmarks.h: code for manipulating landmarks
//
// Copyright (C) 2005-2013, Stephen Milborrow

#ifndef STASM_LANDMARKS_H
#define STASM_LANDMARKS_H

namespace stasm
{
struct LANDMARK_INFO  // landmark information
{
    int   partner;    // symmetrical partner point, -1 means no partner

    int   prev, next; // previous and next point
                      // special val -1 means prev=current-1 and next=current+1

    double weight;    // weight of landmark relative to others (for shape mod)
};

static const LANDMARK_INFO LANDMARK_INFO_TAB[stasm_NLANDMARKS] = // stasm77 points
{
    //  par pre next weight
    {    12,  1, 15,  1. }, // 00 L_LTemple
    {    11, -1, -1,  1. }, // 01 L_LJaw01
    {    10, -1, -1,  1. }, // 02 L_LJawNoseline
    {     9, -1, -1,  1. }, // 03 L_LJawMouthline
    {     8, -1, -1,  1. }, // 04 L_LJaw04
    {     7, -1, -1,  1. }, // 05 L_LJaw05
    {    -1, -1, -1,  1. }, // 06 L_CTipOfChin
    {     5, -1, -1,  1. }, // 07 L_RJaw07
    {     4, -1, -1,  1. }, // 08 L_RJaw08
    {     3, -1, -1,  1. }, // 09 L_RJawMouthline
    {     2, -1, -1,  1. }, // 10 L_RJawNoseline
    {     1, -1, -1,  1. }, // 11 L_RJaw11
    {     0, 11, 13,  1. }, // 12 L_RTemple
    {    15, -1, -1,  0. }, // 13 L_RForehead point is virtually useless
    {    -1, -1, -1,  0. }, // 14 L_CForehead point is virtually useless
    {    13, -1, -1,  0. }, // 15 L_LForehead point is virtually useless
    {    23, -1, -1,  0. }, // 16 L_LEyebrowTopInner
    {    24, -1, -1,  0. }, // 17 L_LEyebrowTopOuter
    {    25,  0, 17,  0. }, // 18 L_LEyebrowOuter
    {    26, -1, -1,  0. }, // 19 L_LEyebrowBotOuter
    {    27, -1, -1,  0. }, // 20 L_LEyebrowBotInner
    {    22,  0, 12,  0. }, // 21 L_LEyebrowInner
    {    21,  0, 12,  0. }, // 22 L_REyebrowInner
    {    16, -1, -1,  0. }, // 23 L_REyebrowTopInner
    {    17, -1, -1,  0. }, // 24 L_REyebrowTopOuter
    {    18, 12, 24,  0. }, // 25 L_REyebrowOuter
    {    19, -1, -1,  0. }, // 26 L_REyebrowBotOuter
    {    20, -1, -1,  0. }, // 27 L_REyebrowBotInner
    {    29, 26, 39,  1. }, // 28 L_REyelid
    {    28, 20, 38,  1. }, // 29 L_LEyelid
    {    40, 32, 36,  1. }, // 30 L_LEyeInner
    {    41, -1, -1,  1. }, // 31 L_LEye31
    {    42, -1, -1,  1. }, // 32 L_LEyeTop
    {    43, -1, -1,  1. }, // 33 L_LEye33
    {    44, 32, 36,  1. }, // 34 L_LEyeOuter
    {    45, -1, -1,  1. }, // 35 L_LEye35
    {    46, -1, -1,  1. }, // 36 L_LEyeBot
    {    47, 30, 36,  1. }, // 37 L_LEye37
    {    39, -1, -1,  1. }, // 38 L_LPupil
    {    38, -1, -1,  1. }, // 39 L_RPupil
    {    30, 42, 46,  1. }, // 40 L_REyeInner
    {    31, -1, -1,  1. }, // 41 L_REye41
    {    32, -1, -1,  1. }, // 42 L_REyeTop
    {    33, -1, -1,  1. }, // 43 L_REye43
    {    34, 42, 46,  1. }, // 44 L_REyeOuter
    {    35, -1, -1,  1. }, // 45 L_REye45
    {    36, -1, -1,  1. }, // 46 L_REyeBot
    {    37, 40, 46,  1. }, // 47 L_REye47
    {    50,  0, 12,  1. }, // 48 L_RNoseMid
    {    -1, -1, -1,  1. }, // 49 L_CNoseMid
    {    48,  0, 12,  1. }, // 50 L_LNoseMid
    {    53,  0, 12,  1. }, // 51 L_LNostrilTop
    {    -1,  0, 12,  1. }, // 52 L_CNoseTip
    {    51,  0, 12,  1. }, // 53 L_RNostrilTop
    {    58,  0, 12,  1. }, // 54 L_RNoseSide
    {    57, 60, 62,  1. }, // 55 L_RNostrilBot
    {    -1, -1, -1,  1. }, // 56 L_CNoseBase
    {    55, 30, 62,  1. }, // 57 L_LNostrilBot
    {    54,  0, 12,  1. }, // 58 L_LNoseSide
    {    65, 61, 74,  1. }, // 59 L_LMouthCorner
    {    64, 59, 61,  1. }, // 60 L_LMouth60
    {    63, -1, -1,  1. }, // 61 L_LMouthCupid
    {    -1, -1, -1,  1. }, // 62 L_CTopOfTopLip
    {    61, -1, -1,  1. }, // 63 L_RMouthCupid
    {    60, 63, 65,  1. }, // 64 L_RMouth64
    {    59, 61, 74,  1. }, // 65 L_RMouthCorner
    {    68, 65, 67,  1. }, // 66 L_RMouth66
    {    -1, -1, -1,  1. }, // 67 L_CBotOfTopLip
    {    66, 59, 67,  1. }, // 68 L_LMouth68
    {    71, 59, 70,  1. }, // 69 L_LMouth69
    {    -1, -1, -1,  1. }, // 70 L_CTopOfBotLip
    {    69, 65, 70,  1. }, // 71 L_RMouth71
    {    76, 65, 73,  1. }, // 72 L_RMouth72
    {    75, 72, 74,  1. }, // 73 L_RMouth73
    {    -1, -1, -1,  1. }, // 74 L_CBotOfBotLip
    {    73, 74, 76,  1. }, // 75 L_LMouth75
    {    72, 59, 75,  1. }, // 76 L_LMouth76
};

double MeanPoint(
    const Shape& shape,       // in
    int          ipoint1,     // in
    int          ipoint2,     // in
    int          ix);         // in: IX or IY

void PrevAndNextLandmarks(
    int&         prev,        // out
    int&         next,        // out
    int          ipoint,      // in
    const Shape& shape);      // in

Shape FlipShape(              // flip shape horizontally
    const Shape& shape,       // in
    int          imgwidth);   // in

} // namespace stasm
#endif // STASM_LANDMARKS_H