diff --git a/Sources/ConsoleApp/ConsoleApp.csproj b/Sources/ConsoleApp/ConsoleApp.csproj index 11b775b..4d45df5 100644 --- a/Sources/ConsoleApp/ConsoleApp.csproj +++ b/Sources/ConsoleApp/ConsoleApp.csproj @@ -36,6 +36,7 @@ ..\packages\Microsoft.Kinect.2.0.1410.19000\lib\net45\Microsoft.Kinect.dll + @@ -54,6 +55,14 @@ + + {2d44487e-f514-4063-9494-2af1e8c9e9c8} + KinectUtils + + + {2496DFB1-EB55-47A1-A780-211E079B289D} + MyGesturesBank + {0751c83e-7845-4e5f-a5d3-e11aba393aca} Lib diff --git a/Sources/ConsoleApp/Program.cs b/Sources/ConsoleApp/Program.cs index fb7ff8d..b8f5ea7 100644 --- a/Sources/ConsoleApp/Program.cs +++ b/Sources/ConsoleApp/Program.cs @@ -1,11 +1,14 @@ using Lib; using Microsoft.Kinect; +using MyGesturesBank; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Windows.Controls; namespace ConsoleApp { @@ -13,6 +16,32 @@ namespace ConsoleApp { static void Main(string[] args) { + KinectManager kinectManager = new KinectManager(); + Canvas skeletonCanvas = null; + KinectStreamsFactory Factory = new KinectStreamsFactory(kinectManager, skeletonCanvas); + BodyImageStream CurrentKinectStream = (BodyImageStream)Factory[KinectStreams.Body]; + CurrentKinectStream.Start(); + PostureHandUp handUpPosture = new PostureHandUp(); + PostureHandsOnHead handsOnHeadPosture = new PostureHandsOnHead(); + handUpPosture.GestureRecognized += (sender, e) => + { + Console.WriteLine("Posture Hand Up reconnue !"); + }; + handsOnHeadPosture.GestureRecognized += (sender, e) => + { + Console.WriteLine("Posture Hands On Head reconnue !"); + }; + Body body = null; + while (true) + { + body = CurrentKinectStream.Bodies.FirstOrDefault(); + if (body != null) + { + handUpPosture.TestGesture(body); + handsOnHeadPosture.TestGesture(body); + } + Thread.Sleep(50); + } // KinectManager kinectManager = new KinectManager(); // if (kinectManager.StartSensor()) // { @@ -38,7 +67,7 @@ namespace ConsoleApp // // Boucle pour tester les postures // while (true) // { - // Body body = kinectManager.GetNextBody(); // Méthode fictive pour obtenir les données du corps + // Body body = kinecManager.GetNextBody(); // Méthode fictive pour obtenir les données du corps // if (body != null) // { // handUpPosture.TestGesture(body); @@ -47,7 +76,8 @@ namespace ConsoleApp // Thread.Sleep(50); // Une petite pause pour ne pas surcharger le CPU // } - } + //} + } } } diff --git a/Sources/KinectUtils/AllGesturesFactory.cs b/Sources/KinectUtils/AllGesturesFactory.cs index 719a15e..7305108 100644 --- a/Sources/KinectUtils/AllGesturesFactory.cs +++ b/Sources/KinectUtils/AllGesturesFactory.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using MyGesturesBank; +using KinectUtils; -namespace KinectUtils +namespace MyGesturesBank { public class AllGesturesFactory : IGestureFactory { @@ -13,8 +13,8 @@ namespace KinectUtils { return new List { - new SwipeRightHand(), - new ClapHands() + //new SwipeRightHand(), + //new ClapHands() // Ajoutez d'autres gestes ici }; } diff --git a/Sources/KinectUtils/BaseGesture.cs b/Sources/KinectUtils/BaseGesture.cs index c414db6..5b69899 100644 --- a/Sources/KinectUtils/BaseGesture.cs +++ b/Sources/KinectUtils/BaseGesture.cs @@ -9,7 +9,7 @@ namespace KinectUtils public event EventHandler GestureRecognized; // Nom du geste - marqué comme virtual pour permettre la substitution - public string GestureName { get; protected set; } + public virtual string GestureName { get; protected set; } // Méthode abstraite pour tester le geste public abstract void TestGesture(Body body); diff --git a/Sources/KinectUtils/Gesture.cs b/Sources/KinectUtils/Gesture.cs index 1315626..d6dc9d1 100644 --- a/Sources/KinectUtils/Gesture.cs +++ b/Sources/KinectUtils/Gesture.cs @@ -7,36 +7,36 @@ using System.Threading.Tasks; namespace KinectUtils { - abstract class Gesture : BaseGesture + public abstract class Gesture : BaseGesture { - public bool IsTesting { get; protected set; } + public bool IsRecognitionRunning { get; set; } + protected int MinNbOfFrames = 10; // Exemple de valeur, ajustez selon le geste protected int MaxNbOfFrames = 50; // Exemple de valeur, ajustez selon le geste - private int mCurrentFrameCount = 0; - // public bool isRecognitionRunning { get; set; } + private int currentFrameCount = 0; public override void TestGesture(Body body) { - if (!IsTesting) + if (!IsRecognitionRunning) { if (TestInitialConditions(body)) { - IsTesting = true; - mCurrentFrameCount = 0; + IsRecognitionRunning = true; + currentFrameCount = 0; } } else { - mCurrentFrameCount++; + currentFrameCount++; - if (!TestPosture(body) || !TestRunningGesture(body) || mCurrentFrameCount > MaxNbOfFrames) + if (!TestPosture(body) || !TestRunningGesture(body) || currentFrameCount > MaxNbOfFrames) { - IsTesting = false; + IsRecognitionRunning = false; } - else if (TestEndConditions(body) && mCurrentFrameCount >= MinNbOfFrames) + else if (TestEndConditions(body) && currentFrameCount >= MinNbOfFrames) { OnGestureRecognized(body); - IsTesting = false; + IsRecognitionRunning = false; } } } @@ -47,3 +47,4 @@ namespace KinectUtils abstract protected bool TestEndConditions(Body body); } } + diff --git a/Sources/KinectUtils/GestureManager.cs b/Sources/KinectUtils/GestureManager.cs index 8599a34..cece5c1 100644 --- a/Sources/KinectUtils/GestureManager.cs +++ b/Sources/KinectUtils/GestureManager.cs @@ -1,16 +1,21 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading.Tasks; using Lib; +using Microsoft.Kinect; namespace KinectUtils { public static class GestureManager { - public static event EventHandler GestureRecognized; - public static List KnownGestures = new List(); + static private BodyFrameReader bodyFrameReader; + static private Body[] bodies; + static event EventHandler GestureRecognized; + static KinectManager KinectManager { get; set; } + static List KnownGestures { get; set; } public static void AddGestures(IGestureFactory factory) { @@ -39,7 +44,29 @@ namespace KinectUtils static public void StartAcquiringFrames(KinectManager kinectManager) { - throw new NotImplementedException(); + bodyFrameReader = kinectManager.Sensor.BodyFrameSource.OpenReader(); + bodyFrameReader.FrameArrived += Reader_BodyFrameArrived; + } + + static private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e) + { + using (var bodyframe = e.FrameReference.AcquireFrame()) + { + if (bodyframe != null) + { + bodyframe.GetAndRefreshBodyData(bodies); + foreach (var body in bodies) + { + if (body.IsTracked) + { + foreach(var gesture in KnownGestures) + { + gesture.TestGesture(body); + } + } + } + } + } } } } diff --git a/Sources/KinectUtils/IGestureFactory.cs b/Sources/KinectUtils/IGestureFactory.cs index f78c453..b01155f 100644 --- a/Sources/KinectUtils/IGestureFactory.cs +++ b/Sources/KinectUtils/IGestureFactory.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace KinectUtils { - interface IGestureFactory + public interface IGestureFactory { IEnumerable CreateGestures(); } diff --git a/Sources/KinectUtils/KinectUtils.csproj b/Sources/KinectUtils/KinectUtils.csproj index 8343b15..c64f282 100644 --- a/Sources/KinectUtils/KinectUtils.csproj +++ b/Sources/KinectUtils/KinectUtils.csproj @@ -52,10 +52,6 @@ - - {2496dfb1-eb55-47a1-a780-211e079b289d} - MyGesturesBank - {0751c83e-7845-4e5f-a5d3-e11aba393aca} Lib diff --git a/Sources/KinectUtils/Posture.cs b/Sources/KinectUtils/Posture.cs index a95b2c6..d64b672 100644 --- a/Sources/KinectUtils/Posture.cs +++ b/Sources/KinectUtils/Posture.cs @@ -16,7 +16,7 @@ namespace KinectUtils if (TestPosture(body)) { // Posture is recognized - OnGestureRecognized(); + OnGestureRecognized(body); } } diff --git a/Sources/Lib/BodyImageStream.cs b/Sources/Lib/BodyImageStream.cs index 8b7b9bc..eea0d35 100644 --- a/Sources/Lib/BodyImageStream.cs +++ b/Sources/Lib/BodyImageStream.cs @@ -153,20 +153,22 @@ namespace Lib if (bodyframe != null) { bodyframe.GetAndRefreshBodyData(this.bodies); - - Canvas.Children.Clear(); // nettoyer le Canvas avant de dessiner - - foreach (var body in this.bodies) + // nettoyer le Canvas avant de dessiner + if (Canvas != null) { - if (body.IsTracked) + Canvas.Children.Clear(); + foreach (var body in this.bodies) { - // dessiner le squelette - drawskeleton(body); + if (body.IsTracked) + { + // dessiner le squelette + drawskeleton(body); + } } } } } } } -} + } diff --git a/Sources/LibMyGesturesBank/AllGesturesFactory.cs b/Sources/LibMyGesturesBank/AllGesturesFactory.cs new file mode 100644 index 0000000..8b62daa --- /dev/null +++ b/Sources/LibMyGesturesBank/AllGesturesFactory.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using KinectUtils; + +namespace MyGesturesBank +{ + public class AllGesturesFactory : IGestureFactory + { + public IEnumerable CreateGestures() + { + return new List + { + new SwipeRightHand(), + //new ClapHands() + // Ajoutez d'autres gestes ici + }; + } + } +} 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 7ad19b9..239eee1 100644 --- a/Sources/LibMyGesturesBank/PostureHandsOnHead .cs +++ b/Sources/LibMyGesturesBank/PostureHandsOnHead .cs @@ -8,26 +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 - return 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)) < 0.3; - } - - 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; + } } + }