From 0857ab536a5bb68317b315c6b3be232c4a0b8d36 Mon Sep 17 00:00:00 2001 From: "louis.dufour" Date: Wed, 7 Feb 2024 08:37:38 +0100 Subject: [PATCH] Add(CreateGestures): gesture and posture --- Sources/LibMyGesturesBank/ClapHands.cs | 44 +++++++++++++++++++ .../LibMyGesturesBank/MyGesturesBank.csproj | 5 +++ Sources/LibMyGesturesBank/PostureHandUp.cs | 10 +++-- .../LibMyGesturesBank/PostureHandsOnHead .cs | 24 +++------- Sources/LibMyGesturesBank/RightHandUp.cs | 14 +++++- Sources/LibMyGesturesBank/SwipeRightHand.cs | 36 ++++++++++++--- Sources/LibMyGesturesBank/TwoHandsDragon.cs | 15 ++++++- 7 files changed, 115 insertions(+), 33 deletions(-) create mode 100644 Sources/LibMyGesturesBank/ClapHands.cs diff --git a/Sources/LibMyGesturesBank/ClapHands.cs b/Sources/LibMyGesturesBank/ClapHands.cs new file mode 100644 index 0000000..c1b6e81 --- /dev/null +++ b/Sources/LibMyGesturesBank/ClapHands.cs @@ -0,0 +1,44 @@ +using KinectUtils; +using Microsoft.Kinect; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LibMyGesturesBank +{ + public class ClapHands : Gesture + { + protected override bool TestInitialConditions(Body body) + { + // Les conditions initiales ne sont pas strictes pour un clap, on commence donc directement avec TestPosture et TestRunningGesture + return true; + } + + protected override bool TestPosture(Body body) + { + var handRight = body.Joints[JointType.HandRight].Position; + var handLeft = body.Joints[JointType.HandLeft].Position; + + // Vérifie si les mains sont à une hauteur similaire et devant le corps + return Math.Abs(handRight.Y - handLeft.Y) < 0.1f && handRight.Z < 0.5f && handLeft.Z < 0.5f; + } + + protected override bool TestRunningGesture(Body body) + { + var handRight = body.Joints[JointType.HandRight].Position; + var handLeft = body.Joints[JointType.HandLeft].Position; + + // Vérifie si les mains se sont rencontrées au centre + return Math.Abs(handRight.X - handLeft.X) < 0.1f; + } + + protected override bool TestEndConditions(Body body) + { + // Le clap est un geste instantané, donc si les conditions sont remplies une fois, le geste est considéré comme terminé + return true; + } + } + +} diff --git a/Sources/LibMyGesturesBank/MyGesturesBank.csproj b/Sources/LibMyGesturesBank/MyGesturesBank.csproj index 0601293..562b0da 100644 --- a/Sources/LibMyGesturesBank/MyGesturesBank.csproj +++ b/Sources/LibMyGesturesBank/MyGesturesBank.csproj @@ -44,6 +44,7 @@ + @@ -52,6 +53,10 @@ + + {2d44487e-f514-4063-9494-2af1e8c9e9c8} + KinectUtils + {0751c83e-7845-4e5f-a5d3-e11aba393aca} Lib diff --git a/Sources/LibMyGesturesBank/PostureHandUp.cs b/Sources/LibMyGesturesBank/PostureHandUp.cs index 54b1a6e..38f5861 100644 --- a/Sources/LibMyGesturesBank/PostureHandUp.cs +++ b/Sources/LibMyGesturesBank/PostureHandUp.cs @@ -7,11 +7,13 @@ namespace MyGesturesBank { protected override bool TestPosture(Body body) { - // Exemple de condition : la main droite est plus haute que l'épaule droite - return body.Joints[JointType.HandRight].Position.Y > body.Joints[JointType.ShoulderRight].Position.Y; - } + var handRight = body.Joints[JointType.HandRight].Position; + var handLeft = body.Joints[JointType.HandLeft].Position; + var head = body.Joints[JointType.Head].Position; - public override string GestureName => "Hand Up"; + return handRight.Y > head.Y || handLeft.Y > head.Y; + } } + } diff --git a/Sources/LibMyGesturesBank/PostureHandsOnHead .cs b/Sources/LibMyGesturesBank/PostureHandsOnHead .cs index 4b8df45..239eee1 100644 --- a/Sources/LibMyGesturesBank/PostureHandsOnHead .cs +++ b/Sources/LibMyGesturesBank/PostureHandsOnHead .cs @@ -8,27 +8,15 @@ namespace MyGesturesBank { protected override bool TestPosture(Body body) { - // Condition pour la main droite proche de la tête - bool rightHandNearHead = IsHandNearHead(body.Joints[JointType.HandRight], body.Joints[JointType.Head]); + var handRight = body.Joints[JointType.HandRight].Position; + var handLeft = body.Joints[JointType.HandLeft].Position; + var head = body.Joints[JointType.Head].Position; - // Condition pour la main gauche proche de la tête - bool leftHandNearHead = IsHandNearHead(body.Joints[JointType.HandLeft], body.Joints[JointType.Head]); + // Ajustez les seuils selon la précision souhaitée + var threshold = 0.1f; // Seuil pour ajuster la précision de la détection - return rightHandNearHead && leftHandNearHead; + return Math.Abs(handRight.Y - head.Y) < threshold && Math.Abs(handLeft.Y - head.Y) < threshold; } - - private bool IsHandNearHead(Joint hand, Joint head) - { - // Exemple de condition : la main est à moins de 30 cm de la tête - double distance = Math.Sqrt( - Math.Pow(hand.Position.X - head.Position.X, 2) + - Math.Pow(hand.Position.Y - head.Position.Y, 2) + - Math.Pow(hand.Position.Z - head.Position.Z, 2)); - return distance < 0.3 && distance > 0; - } - - public override string GestureName => "Hands On Head"; - } diff --git a/Sources/LibMyGesturesBank/RightHandUp.cs b/Sources/LibMyGesturesBank/RightHandUp.cs index 1c6734a..8de2ef5 100644 --- a/Sources/LibMyGesturesBank/RightHandUp.cs +++ b/Sources/LibMyGesturesBank/RightHandUp.cs @@ -1,4 +1,6 @@ -using System; +using KinectUtils; +using Microsoft.Kinect; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,7 +8,15 @@ using System.Threading.Tasks; namespace MyGesturesBank { - internal class RightHandUp + public class RightHandUp : Posture { + protected override bool TestPosture(Body body) + { + var handRight = body.Joints[JointType.HandRight].Position; + var head = body.Joints[JointType.Head].Position; + + return handRight.Y > head.Y; + } } + } diff --git a/Sources/LibMyGesturesBank/SwipeRightHand.cs b/Sources/LibMyGesturesBank/SwipeRightHand.cs index d58ddd0..c4c8eeb 100644 --- a/Sources/LibMyGesturesBank/SwipeRightHand.cs +++ b/Sources/LibMyGesturesBank/SwipeRightHand.cs @@ -10,28 +10,50 @@ namespace MyGesturesBank { public class SwipeRightHand : Gesture { + + private float previousX = float.NaN; + protected override bool TestInitialConditions(Body body) { - // Implémentez la logique pour vérifier les conditions initiales du balayage à droite - return false; + var handRight = body.Joints[JointType.HandRight].Position; + var shoulderRight = body.Joints[JointType.ShoulderRight].Position; + + // Conditions initiales : main droite au niveau ou à droite de l'épaule droite, mais pas trop éloignée + return handRight.X >= shoulderRight.X && handRight.X - shoulderRight.X < 0.5f; } protected override bool TestPosture(Body body) { - // Implémentez la vérification de la posture pour le balayage à droite - return false; + var handRight = body.Joints[JointType.HandRight].Position; + var head = body.Joints[JointType.Head].Position; + + // La main droite ne doit pas être plus haute que la tête + return handRight.Y <= head.Y; } protected override bool TestRunningGesture(Body body) { - // Implémentez la dynamique du geste de balayage à droite + var handRight = body.Joints[JointType.HandRight].Position.X; + + if (!float.IsNaN(previousX)) + { + // Vérifie si la main droite se déplace vers la droite + bool isMovingRight = handRight > previousX; + previousX = handRight; + return isMovingRight; + } + + previousX = handRight; return false; } protected override bool TestEndConditions(Body body) { - // Vérifiez si les conditions de fin du geste de balayage à droite sont remplies - return false; + var handRight = body.Joints[JointType.HandRight].Position; + var spineBase = body.Joints[JointType.SpineBase].Position; + + // Condition de fin : la main droite est bien à droite de la base de la colonne vertébrale + return handRight.X > spineBase.X + 0.5f; // Ajustez cette valeur selon le besoin } } diff --git a/Sources/LibMyGesturesBank/TwoHandsDragon.cs b/Sources/LibMyGesturesBank/TwoHandsDragon.cs index 6cafd63..db3a161 100644 --- a/Sources/LibMyGesturesBank/TwoHandsDragon.cs +++ b/Sources/LibMyGesturesBank/TwoHandsDragon.cs @@ -1,4 +1,6 @@ -using System; +using KinectUtils; +using Microsoft.Kinect; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,7 +8,16 @@ using System.Threading.Tasks; namespace MyGesturesBank { - internal class TwoHandsDragon + public class TwoHandsDragon : Posture { + protected override bool TestPosture(Body body) + { + var handRight = body.Joints[JointType.HandRight].Position; + var handLeft = body.Joints[JointType.HandLeft].Position; + var head = body.Joints[JointType.Head].Position; + + return handRight.Y > head.Y && handLeft.Y > head.Y; + } } + }