middleware/Tracking/Postures/CorrectPosture.cs
author bastiena
Mon, 24 Sep 2012 15:20:10 +0200
changeset 124 d2b4682dc9cc
parent 39 15b11d291417
permissions -rw-r--r--
Étiquette V00.17 ajoutée à la révision 57a65edde708
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39
bastiena
parents: 37
diff changeset
     1
/*
37
bastiena
parents:
diff changeset
     2
* This file is part of the TraKERS\Middleware package.
bastiena
parents:
diff changeset
     3
*
bastiena
parents:
diff changeset
     4
* (c) IRI <http://www.iri.centrepompidou.fr/>
bastiena
parents:
diff changeset
     5
*
bastiena
parents:
diff changeset
     6
* For the full copyright and license information, please view the LICENSE
bastiena
parents:
diff changeset
     7
* file that was distributed with this source code.
bastiena
parents:
diff changeset
     8
*/
bastiena
parents:
diff changeset
     9
bastiena
parents:
diff changeset
    10
/*
bastiena
parents:
diff changeset
    11
 * Projet : TraKERS
bastiena
parents:
diff changeset
    12
 * Module : MIDDLEWARE
bastiena
parents:
diff changeset
    13
 * Sous-Module : Tracking/Postures
bastiena
parents:
diff changeset
    14
 * Classe : BendDetector
bastiena
parents:
diff changeset
    15
 * 
bastiena
parents:
diff changeset
    16
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
bastiena
parents:
diff changeset
    17
 * 
bastiena
parents:
diff changeset
    18
 * Fonctionnalités : Permet de détecter si l'utilisateur est bien tracké.
bastiena
parents:
diff changeset
    19
 */
bastiena
parents:
diff changeset
    20
bastiena
parents:
diff changeset
    21
using System;
bastiena
parents:
diff changeset
    22
using System.Collections.Generic;
bastiena
parents:
diff changeset
    23
using System.Linq;
bastiena
parents:
diff changeset
    24
using Microsoft.Kinect;
bastiena
parents:
diff changeset
    25
using Trakers.Debug;
bastiena
parents:
diff changeset
    26
bastiena
parents:
diff changeset
    27
namespace Trakers.Tracking.Postures
bastiena
parents:
diff changeset
    28
{
bastiena
parents:
diff changeset
    29
    public class CorrectPosture : PostureDetector
bastiena
parents:
diff changeset
    30
    {
bastiena
parents:
diff changeset
    31
        public CorrectPosture(DebugWindow _debug)
bastiena
parents:
diff changeset
    32
            : base(_debug)
bastiena
parents:
diff changeset
    33
        {
bastiena
parents:
diff changeset
    34
        }
bastiena
parents:
diff changeset
    35
bastiena
parents:
diff changeset
    36
        /*
bastiena
parents:
diff changeset
    37
         * Méthode de détection du penché.
bastiena
parents:
diff changeset
    38
         */
bastiena
parents:
diff changeset
    39
        public bool CheckForCorrectPosture()
bastiena
parents:
diff changeset
    40
        {
bastiena
parents:
diff changeset
    41
            //Crée un état local afin de pouvoir analyser s'il y a une posture.
bastiena
parents:
diff changeset
    42
            List<Joint> localState = new List<Joint>(currentState);
bastiena
parents:
diff changeset
    43
bastiena
parents:
diff changeset
    44
            bool c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13;
bastiena
parents:
diff changeset
    45
bastiena
parents:
diff changeset
    46
            //Si les genoux sont plus hauts que le centre
bastiena
parents:
diff changeset
    47
            //OU si les pieds sont plus hauts que le centre
bastiena
parents:
diff changeset
    48
            //OU si la tête est plus basse que les hanches
bastiena
parents:
diff changeset
    49
            //OU si les épaules sont plus basses que les genoux
bastiena
parents:
diff changeset
    50
            //OU si les épaules droites et gauches sont trop proches
bastiena
parents:
diff changeset
    51
            //OU si les genoux droites et gauches sont trop proches
bastiena
parents:
diff changeset
    52
            //OU si les pieds sont plus hauts que les genoux, les genoux étant plus bas que le bassin
bastiena
parents:
diff changeset
    53
            //OU si les genoux sont inversés par rapport aux épaules
bastiena
parents:
diff changeset
    54
            //Alors on ne s'est pas tracké.
bastiena
parents:
diff changeset
    55
            c1 = localState[(int)JointType.KneeLeft].Position.Y < localState[(int)JointType.Spine].Position.Y;
bastiena
parents:
diff changeset
    56
            c2 = localState[(int)JointType.KneeRight].Position.Y < localState[(int)JointType.Spine].Position.Y;
bastiena
parents:
diff changeset
    57
            c3 = localState[(int)JointType.FootLeft].Position.Y < localState[(int)JointType.Spine].Position.Y;
bastiena
parents:
diff changeset
    58
            c4 = localState[(int)JointType.FootRight].Position.Y < localState[(int)JointType.Spine].Position.Y;
bastiena
parents:
diff changeset
    59
            c5 = localState[(int)JointType.Head].Position.Y > localState[(int)JointType.HipCenter].Position.Y;
bastiena
parents:
diff changeset
    60
            c6 = localState[(int)JointType.ShoulderCenter].Position.Y > localState[(int)JointType.KneeLeft].Position.Y;
bastiena
parents:
diff changeset
    61
            c7 = localState[(int)JointType.ShoulderCenter].Position.Y > localState[(int)JointType.KneeRight].Position.Y;
bastiena
parents:
diff changeset
    62
            c8 = Math.Abs(localState[(int)JointType.ShoulderLeft].Position.X - localState[(int)JointType.ShoulderRight].Position.X) < 0.20;
bastiena
parents:
diff changeset
    63
            c9 = Math.Abs(localState[(int)JointType.KneeLeft].Position.X - localState[(int)JointType.KneeRight].Position.X) < 0.20;
bastiena
parents:
diff changeset
    64
            c10 = localState[(int)JointType.FootLeft].Position.Y < localState[(int)JointType.KneeLeft].Position.Y && localState[(int)JointType.KneeLeft].Position.Y > localState[(int)JointType.HipCenter].Position.Y;
bastiena
parents:
diff changeset
    65
            c11 = localState[(int)JointType.FootRight].Position.Y < localState[(int)JointType.KneeRight].Position.Y && localState[(int)JointType.KneeRight].Position.Y > localState[(int)JointType.HipCenter].Position.Y;
bastiena
parents:
diff changeset
    66
            c12 = localState[(int)JointType.ShoulderRight].Position.X < localState[(int)JointType.ShoulderLeft].Position.X && localState[(int)JointType.KneeRight].Position.X > localState[(int)JointType.KneeLeft].Position.X;
bastiena
parents:
diff changeset
    67
            c13 = localState[(int)JointType.ShoulderRight].Position.X > localState[(int)JointType.ShoulderLeft].Position.X && localState[(int)JointType.KneeRight].Position.X < localState[(int)JointType.KneeLeft].Position.X;
bastiena
parents:
diff changeset
    68
            if (c1 || c2 || c3 || c4 || c5 || c6 || c7 || c8 || c9 || c10 || c11 || c12 || c13)
bastiena
parents:
diff changeset
    69
            {
bastiena
parents:
diff changeset
    70
                return false;
bastiena
parents:
diff changeset
    71
            }
bastiena
parents:
diff changeset
    72
            return true;
bastiena
parents:
diff changeset
    73
        }
bastiena
parents:
diff changeset
    74
    }
bastiena
parents:
diff changeset
    75
}