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..c7fe846 100644
--- a/Sources/ConsoleApp/Program.cs
+++ b/Sources/ConsoleApp/Program.cs
@@ -1,11 +1,15 @@
-using Lib;
+using KinectUtils;
+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,41 +17,18 @@ namespace ConsoleApp
{
static void Main(string[] args)
{
- // KinectManager kinectManager = new KinectManager();
- // if (kinectManager.StartSensor())
- // {
- // Console.WriteLine("Kinect n'est pas connecté ou non reconnu.");
- // return;
- // }
+ // allumer la kinect
+ KinectManager kinectManager = new KinectManager();
+ kinectManager.StartSensor();
+ Console.WriteLine("Kinect démarre");
- // // Créez les instances de vos postures
- // PostureHandUp handUpPosture = new PostureHandUp();
- // PostureHandsOnHead handsOnHeadPosture = new PostureHandsOnHead();
-
- // // Abonnez-vous aux événements de reconnaissance de posture
- // handUpPosture.GestureRecognized += (sender, e) =>
- // {
- // Console.WriteLine("Posture Hand Up reconnue !");
- // };
-
- // handsOnHeadPosture.GestureRecognized += (sender, e) =>
- // {
- // Console.WriteLine("Posture Hands On Head reconnue !");
- // };
-
- // // Boucle pour tester les postures
- // while (true)
- // {
- // Body body = kinectManager.GetNextBody(); // Méthode fictive pour obtenir les données du corps
- // if (body != null)
- // {
- // handUpPosture.TestGesture(body);
- // handsOnHeadPosture.TestGesture(body);
- // }
-
- // Thread.Sleep(50); // Une petite pause pour ne pas surcharger le CPU
- // }
+ AllGesturesFactory allGesturesFactory = new AllGesturesFactory();
+ GestureManager.AddGestures(allGesturesFactory);
+ GestureManager.StartAcquiringFrames(kinectManager);
+ while (true)
+ {
+ Thread.Sleep(50);
+ }
}
-
}
}
diff --git a/Sources/KinectUtils/AllGesturesFactory.cs b/Sources/KinectUtils/AllGesturesFactory.cs
deleted file mode 100644
index 970478a..0000000
--- a/Sources/KinectUtils/AllGesturesFactory.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace KinectUtils
-{
- public class AllGesturesFactory : IGestureFactory
- {
- public IEnumerable CreateGestures()
- {
- throw new NotImplementedException();
- }
- }
-}
diff --git a/Sources/KinectUtils/BaseGesture.cs b/Sources/KinectUtils/BaseGesture.cs
index c414db6..1c6fbc0 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);
@@ -32,5 +32,4 @@ namespace KinectUtils
GestureName = gestureName;
}
}
-
}
diff --git a/Sources/KinectUtils/BaseMapping.cs b/Sources/KinectUtils/BaseMapping.cs
index 8d16076..c335df1 100644
--- a/Sources/KinectUtils/BaseMapping.cs
+++ b/Sources/KinectUtils/BaseMapping.cs
@@ -7,27 +7,80 @@ using System.Threading.Tasks;
namespace KinectUtils
{
- class BaseMapping
+ public abstract class BaseMapping
{
- public void SubscribeToStartGesture(BaseGesture gesture)
+ protected bool running = false;
+ public event EventHandler> OnMapping;
+
+ protected BaseMapping(BaseGesture startGesture, BaseGesture endGesture)
+ {
+ SubscribeToStartGesture(startGesture);
+ SubscribeToEndGesture(endGesture);
+ // Assuming GestureManager has an event that provides processed body data
+ GestureManager.ProcessedBodyFrameArrived += OnProcessedBodyFrameArrived;
+ }
+
+ protected abstract T Mapping(Body body);
+
+ protected bool TestMapping(Body body, out T output)
{
- throw new NotImplementedException();
+ output = default(T);
+ if (running)
+ {
+ output = Mapping(body);
+ return true;
+ }
+ return false;
}
- public void SubscribeToEndGesture(BaseGesture gesture)
+
+ protected void SubscribeToStartGesture(BaseGesture gesture)
{
- throw new NotImplementedException();
+ gesture.GestureRecognized += (sender, e) => { if (!running) running = true; };
}
- public void SubscribeToToggleGesture(BaseGesture gesture)
+
+ protected void SubscribeToEndGesture(BaseGesture gesture)
{
- throw new NotImplementedException();
+ gesture.GestureRecognized += (sender, e) => { if (running) running = false; };
}
- protected T Mapping(Body body)
+
+ // Assuming your GestureManager provides a similar event
+ protected void OnProcessedBodyFrameArrived(object sender, ProcessedBodyFrameEventArgs e)
{
- throw new NotImplementedException();
+ foreach (var body in e.Bodies)
+ {
+ if (body.IsTracked)
+ {
+ T output;
+ if (TestMapping(body, out output))
+ {
+ OnMapping?.Invoke(this, new OnMappingEventArgs(output));
+ }
+ }
+ }
}
- public bool TestMapping(Body body, out T output)
- {
- throw new NotImplementedException();
+ }
+
+ public class OnMappingEventArgs : EventArgs
+ {
+ public T MappedValue { get; private set; }
+
+ public OnMappingEventArgs(T mappedValue)
+ {
+ MappedValue = mappedValue;
+ }
+ }
+
+ // Custom EventArgs to be used within your application logic
+ // This is not from the Kinect SDK, but rather a custom class to pass along processed body data
+ public class ProcessedBodyFrameEventArgs : EventArgs
+ {
+ public Body[] Bodies { get; private set; }
+ public Body ClosestBody { get; private set; }
+
+ public ProcessedBodyFrameEventArgs(Body[] bodies, Body closestBody)
+ {
+ Bodies = bodies;
+ ClosestBody = closestBody;
}
}
}
diff --git a/Sources/KinectUtils/Gesture.cs b/Sources/KinectUtils/Gesture.cs
index 1315626..1e0b757 100644
--- a/Sources/KinectUtils/Gesture.cs
+++ b/Sources/KinectUtils/Gesture.cs
@@ -7,43 +7,48 @@ 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; } = false;
+
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;
+ Console.WriteLine(GestureName);
+ IsRecognitionRunning = false;
}
}
}
- abstract protected bool TestInitialConditions(Body body);
- abstract protected bool TestPosture(Body body);
- abstract protected bool TestRunningGesture(Body body);
- abstract protected bool TestEndConditions(Body body);
+ protected abstract bool TestInitialConditions(Body body);
+ protected abstract bool TestPosture(Body body);
+ protected abstract bool TestRunningGesture(Body body);
+ protected abstract bool TestEndConditions(Body body);
}
}
diff --git a/Sources/KinectUtils/GestureManager.cs b/Sources/KinectUtils/GestureManager.cs
index d9e08a5..1541fb3 100644
--- a/Sources/KinectUtils/GestureManager.cs
+++ b/Sources/KinectUtils/GestureManager.cs
@@ -1,36 +1,92 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Runtime.InteropServices;
+using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using Lib;
+using Microsoft.Kinect;
namespace KinectUtils
{
- static class GestureManager
+ public static class GestureManager
{
+ private static BodyFrameReader bodyFrameReader;
+ private static Body[] bodies;
+
static event EventHandler GestureRecognized;
+ public static event EventHandler BodyFrameArrived;
+ public static event EventHandler ProcessedBodyFrameArrived;
+
+
static KinectManager KinectManager { get; set; }
- static List KnownGestures { get; set; }
+ static List KnownGestures { get; set; } = new List();
- static public void AddGestures(IGestureFactory factory)
+ public static void AddGestures(IGestureFactory factory)
{
- KnownGestures = (List)factory.CreateGestures();
+ var gestures = (List)factory.CreateGestures();
+ foreach (var gesture in gestures)
+ {
+ AddGesture(gesture);
+ }
}
- static public void AddGestures(params BaseGesture[] gestures)
+
+ public static void AddGesture(BaseGesture gesture)
{
- foreach (var gesture in gestures)
+ if (!KnownGestures.Contains(gesture))
{
KnownGestures.Add(gesture);
+ gesture.GestureRecognized += (sender, e) => GestureRecognized?.Invoke(sender, e);
+ }
+ }
+
+ public static void RemoveGesture(BaseGesture gesture)
+ {
+ if (KnownGestures.Contains(gesture))
+ {
+ KnownGestures.Remove(gesture);
+ gesture.GestureRecognized -= (sender, e) => GestureRecognized?.Invoke(sender, e);
}
}
- static public void RemoveGesture(BaseGesture gesture)
+
+ public static void StartAcquiringFrames(KinectManager kinectManager)
{
- KnownGestures.Remove(gesture);
+ bodyFrameReader = kinectManager.Sensor.BodyFrameSource.OpenReader();
+ bodyFrameReader.FrameArrived += Reader_BodyFrameArrived;
}
- static public void StartAcquiringFrames(KinectManager kinectManager)
+
+ private static void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
- throw new NotImplementedException();
+ using (var bodyframe = e.FrameReference.AcquireFrame())
+ {
+ if (bodyframe != null)
+ {
+ if (bodies == null)
+ {
+ bodies = new Body[bodyframe.BodyCount];
+ }
+ bodyframe.GetAndRefreshBodyData(bodies);
+
+ Body closestBody = bodies.Where(b => b.IsTracked)
+ .OrderBy(b => b.Joints[JointType.SpineBase].Position.Z)
+ .FirstOrDefault();
+
+ ProcessedBodyFrameArrived?.Invoke(sender, new ProcessedBodyFrameEventArgs(bodies, closestBody));
+
+ 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..7599387 100644
--- a/Sources/KinectUtils/IGestureFactory.cs
+++ b/Sources/KinectUtils/IGestureFactory.cs
@@ -6,8 +6,8 @@ using System.Threading.Tasks;
namespace KinectUtils
{
- interface IGestureFactory
+ public interface IGestureFactory
{
- IEnumerable CreateGestures();
+ IEnumerable CreateGestures();
}
}
diff --git a/Sources/KinectUtils/KinectUtils.csproj b/Sources/KinectUtils/KinectUtils.csproj
index c64f282..fa4c521 100644
--- a/Sources/KinectUtils/KinectUtils.csproj
+++ b/Sources/KinectUtils/KinectUtils.csproj
@@ -42,7 +42,6 @@
-
diff --git a/Sources/KinectUtils/Posture.cs b/Sources/KinectUtils/Posture.cs
index a95b2c6..34c6a30 100644
--- a/Sources/KinectUtils/Posture.cs
+++ b/Sources/KinectUtils/Posture.cs
@@ -9,16 +9,31 @@ namespace KinectUtils
{
public abstract class Posture : BaseGesture
{
+ // Déclaration des événements
+ public event Action PostureRecognized;
+ public event Action PostureUnrecognized;
+
+ private bool wasRecognized = false; // Pour garder l'état de reconnaissance précédent
+
protected abstract bool TestPosture(Body body);
public override void TestGesture(Body body)
{
- if (TestPosture(body))
+ bool isRecognized = TestPosture(body); // Teste la posture actuelle
+
+ if (isRecognized && !wasRecognized)
{
- // Posture is recognized
- OnGestureRecognized();
+ // La posture est reconnue et ne l'était pas au frame précédent
+ PostureRecognized?.Invoke(body);
+ Console.WriteLine(GestureName);
+ }
+ else if (!isRecognized && wasRecognized)
+ {
+ // La posture n'est plus reconnue alors qu'elle l'était au frame précédent
+ PostureUnrecognized?.Invoke(body);
}
- }
+ wasRecognized = isRecognized; // Mise à jour de l'état de reconnaissance pour le prochain frame
+ }
}
}
diff --git a/Sources/Lib/BodyImageStream.cs b/Sources/Lib/BodyImageStream.cs
index 8b7b9bc..c601f04 100644
--- a/Sources/Lib/BodyImageStream.cs
+++ b/Sources/Lib/BodyImageStream.cs
@@ -28,6 +28,7 @@ namespace Lib
get { return bodies; }
private set { bodies = value; }
}
+
public override void Stop()
{
if (Reader != null)
@@ -35,13 +36,22 @@ namespace Lib
Reader.Dispose();
Reader = null;
}
-
}
- public BodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas) : base(kinectmanager)
+ public BodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas)
+ : base(kinectmanager)
{
- var framedescription = kinectmanager.Sensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
- Bitmap = new WriteableBitmap(framedescription.Width, framedescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);
+ var framedescription = kinectmanager.Sensor.ColorFrameSource.CreateFrameDescription(
+ ColorImageFormat.Bgra
+ );
+ Bitmap = new WriteableBitmap(
+ framedescription.Width,
+ framedescription.Height,
+ 96.0,
+ 96.0,
+ PixelFormats.Bgr32,
+ null
+ );
reader = kinectmanager.Sensor.BodyFrameSource.OpenReader();
reader.FrameArrived += Reader_BodyFrameArrived;
@@ -56,7 +66,10 @@ namespace Lib
Joint joint1 = body.Joints[JointType1];
// ne dessinez que si les deux joints sont suivis
- if (joint0.TrackingState == TrackingState.Tracked && joint1.TrackingState == TrackingState.Tracked)
+ if (
+ joint0.TrackingState == TrackingState.Tracked
+ && joint1.TrackingState == TrackingState.Tracked
+ )
{
Line bone = new Line
{
@@ -74,7 +87,10 @@ namespace Lib
private Point MapJointToScreen(Joint joint)
{
- ColorSpacePoint colorPoint = this.KinectManager.Sensor.CoordinateMapper.MapCameraPointToColorSpace(joint.Position);
+ ColorSpacePoint colorPoint =
+ this.KinectManager.Sensor.CoordinateMapper.MapCameraPointToColorSpace(
+ joint.Position
+ );
// Gestion des coordonnées infinies
float x = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X;
@@ -84,78 +100,80 @@ namespace Lib
}
private void drawskeleton(Body body)
+ {
+ // tête et cou
+ drawbone(body, JointType.Head, JointType.Neck);
+ drawbone(body, JointType.Neck, JointType.SpineShoulder);
+
+ // torse
+ drawbone(body, JointType.SpineShoulder, JointType.SpineMid);
+ drawbone(body, JointType.SpineMid, JointType.SpineBase);
+ drawbone(body, JointType.SpineShoulder, JointType.ShoulderRight);
+ drawbone(body, JointType.SpineShoulder, JointType.ShoulderLeft);
+ drawbone(body, JointType.SpineBase, JointType.HipRight);
+ drawbone(body, JointType.SpineBase, JointType.HipLeft);
+
+ // bras droit
+ drawbone(body, JointType.ShoulderRight, JointType.ElbowRight);
+ drawbone(body, JointType.ElbowRight, JointType.WristRight);
+ drawbone(body, JointType.WristRight, JointType.HandRight);
+ drawbone(body, JointType.HandRight, JointType.HandTipRight);
+ drawbone(body, JointType.WristRight, JointType.ThumbRight);
+
+ // bras gauche
+ drawbone(body, JointType.ShoulderLeft, JointType.ElbowLeft);
+ drawbone(body, JointType.ElbowLeft, JointType.WristLeft);
+ drawbone(body, JointType.WristLeft, JointType.HandLeft);
+ drawbone(body, JointType.HandLeft, JointType.HandTipLeft);
+ drawbone(body, JointType.WristLeft, JointType.ThumbLeft);
+
+ // jambe droite
+ drawbone(body, JointType.HipRight, JointType.KneeRight);
+ drawbone(body, JointType.KneeRight, JointType.AnkleRight);
+ drawbone(body, JointType.AnkleRight, JointType.FootRight);
+
+ // jambe gauche
+ drawbone(body, JointType.HipLeft, JointType.KneeLeft);
+ drawbone(body, JointType.KneeLeft, JointType.AnkleLeft);
+ drawbone(body, JointType.AnkleLeft, JointType.FootLeft);
+
+ // dessinez les joints
+ foreach (JointType JointType in body.Joints.Keys)
{
- // tête et cou
- drawbone(body, JointType.Head, JointType.Neck);
- drawbone(body, JointType.Neck, JointType.SpineShoulder);
-
- // torse
- drawbone(body, JointType.SpineShoulder, JointType.SpineMid);
- drawbone(body, JointType.SpineMid, JointType.SpineBase);
- drawbone(body, JointType.SpineShoulder, JointType.ShoulderRight);
- drawbone(body, JointType.SpineShoulder, JointType.ShoulderLeft);
- drawbone(body, JointType.SpineBase, JointType.HipRight);
- drawbone(body, JointType.SpineBase, JointType.HipLeft);
-
- // bras droit
- drawbone(body, JointType.ShoulderRight, JointType.ElbowRight);
- drawbone(body, JointType.ElbowRight, JointType.WristRight);
- drawbone(body, JointType.WristRight, JointType.HandRight);
- drawbone(body, JointType.HandRight, JointType.HandTipRight);
- drawbone(body, JointType.WristRight, JointType.ThumbRight);
-
- // bras gauche
- drawbone(body, JointType.ShoulderLeft, JointType.ElbowLeft);
- drawbone(body, JointType.ElbowLeft, JointType.WristLeft);
- drawbone(body, JointType.WristLeft, JointType.HandLeft);
- drawbone(body, JointType.HandLeft, JointType.HandTipLeft);
- drawbone(body, JointType.WristLeft, JointType.ThumbLeft);
-
- // jambe droite
- drawbone(body, JointType.HipRight, JointType.KneeRight);
- drawbone(body, JointType.KneeRight, JointType.AnkleRight);
- drawbone(body, JointType.AnkleRight, JointType.FootRight);
-
- // jambe gauche
- drawbone(body, JointType.HipLeft, JointType.KneeLeft);
- drawbone(body, JointType.KneeLeft, JointType.AnkleLeft);
- drawbone(body, JointType.AnkleLeft, JointType.FootLeft);
-
- // dessinez les joints
- foreach (JointType JointType in body.Joints.Keys)
+ Joint joint = body.Joints[JointType];
+ if (joint.TrackingState == TrackingState.Tracked)
{
- Joint joint = body.Joints[JointType];
- if (joint.TrackingState == TrackingState.Tracked)
- {
- DrawJoint(MapJointToScreen(joint));
- }
+ DrawJoint(MapJointToScreen(joint));
}
}
+ }
- private void DrawJoint(Point point)
+ private void DrawJoint(Point point)
+ {
+ Ellipse ellipse = new Ellipse
{
- Ellipse ellipse = new Ellipse
- {
- Width = 10,
- Height = 10,
- Fill = new SolidColorBrush(Colors.Red)
- };
+ Width = 10,
+ Height = 10,
+ Fill = new SolidColorBrush(Colors.Red)
+ };
- Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
- Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);
+ Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
+ Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);
- Canvas.Children.Add(ellipse);
- }
- private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
+ Canvas.Children.Add(ellipse);
+ }
+
+ private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
+ {
+ using (var bodyframe = e.FrameReference.AcquireFrame())
{
- using (var bodyframe = e.FrameReference.AcquireFrame())
+ if (bodyframe != null)
{
- if (bodyframe != null)
+ bodyframe.GetAndRefreshBodyData(this.bodies);
+ // nettoyer le Canvas avant de dessiner
+ if (Canvas != null)
{
- bodyframe.GetAndRefreshBodyData(this.bodies);
-
- Canvas.Children.Clear(); // nettoyer le Canvas avant de dessiner
-
+ Canvas.Children.Clear();
foreach (var body in this.bodies)
{
if (body.IsTracked)
@@ -168,5 +186,5 @@ namespace Lib
}
}
}
+ }
}
-
diff --git a/Sources/Lib/ColorAndBodyImageStream.cs b/Sources/Lib/ColorAndBodyImageStream.cs
index f410334..a70e62f 100644
--- a/Sources/Lib/ColorAndBodyImageStream.cs
+++ b/Sources/Lib/ColorAndBodyImageStream.cs
@@ -22,7 +22,8 @@ namespace Lib
}
private ColorFrameReader _colorReader;
- public ColorFrameReader ColorReader {
+ public ColorFrameReader ColorReader
+ {
get { return _colorReader; }
private set { _colorReader = value; }
}
@@ -33,6 +34,7 @@ namespace Lib
get { return bodies; }
private set { bodies = value; }
}
+
public override void Stop()
{
if (Reader != null)
@@ -40,18 +42,27 @@ namespace Lib
Reader.Dispose();
Reader = null;
}
- if(ColorReader != null)
+ if (ColorReader != null)
{
ColorReader.Dispose();
ColorReader = null;
}
-
}
- public ColorAndBodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas) : base(kinectmanager)
+ public ColorAndBodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas)
+ : base(kinectmanager)
{
- var framedescription = kinectmanager.Sensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
- Bitmap = new WriteableBitmap(framedescription.Width, framedescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);
+ var framedescription = kinectmanager.Sensor.ColorFrameSource.CreateFrameDescription(
+ ColorImageFormat.Bgra
+ );
+ Bitmap = new WriteableBitmap(
+ framedescription.Width,
+ framedescription.Height,
+ 96.0,
+ 96.0,
+ PixelFormats.Bgr32,
+ null
+ );
reader = kinectmanager.Sensor.BodyFrameSource.OpenReader();
reader.FrameArrived += Reader_BodyFrameArrived;
ColorReader = KinectManager.Sensor.ColorFrameSource.OpenReader();
@@ -67,7 +78,10 @@ namespace Lib
Joint joint1 = body.Joints[JointType1];
// ne dessinez que si les deux joints sont suivis
- if (joint0.TrackingState == TrackingState.Tracked && joint1.TrackingState == TrackingState.Tracked)
+ if (
+ joint0.TrackingState == TrackingState.Tracked
+ && joint1.TrackingState == TrackingState.Tracked
+ )
{
Line bone = new Line
{
@@ -85,7 +99,10 @@ namespace Lib
private Point MapJointToScreen(Joint joint)
{
- ColorSpacePoint colorPoint = this.KinectManager.Sensor.CoordinateMapper.MapCameraPointToColorSpace(joint.Position);
+ ColorSpacePoint colorPoint =
+ this.KinectManager.Sensor.CoordinateMapper.MapCameraPointToColorSpace(
+ joint.Position
+ );
// Gestion des coordonnées infinies
float x = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X;
@@ -157,6 +174,7 @@ namespace Lib
Canvas.Children.Add(ellipse);
}
+
private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
using (var bodyframe = e.FrameReference.AcquireFrame())
@@ -178,6 +196,7 @@ namespace Lib
}
}
}
+
private void Reader_ColorFrameArrived(object sender, ColorFrameArrivedEventArgs e)
{
using (ColorFrame colorFrame = e.FrameReference.AcquireFrame())
@@ -193,14 +212,22 @@ namespace Lib
this.Bitmap.Lock();
// Vérifier si la taille de l'image a changé
- if ((colorFrameDescription.Width == this.Bitmap.PixelWidth) && (colorFrameDescription.Height == this.Bitmap.PixelHeight))
+ if (
+ (colorFrameDescription.Width == this.Bitmap.PixelWidth)
+ && (colorFrameDescription.Height == this.Bitmap.PixelHeight)
+ )
{
colorFrame.CopyConvertedFrameDataToIntPtr(
this.Bitmap.BackBuffer,
- (uint)(colorFrameDescription.Width * colorFrameDescription.Height * 4),
- ColorImageFormat.Bgra);
-
- this.Bitmap.AddDirtyRect(new Int32Rect(0, 0, this.Bitmap.PixelWidth, this.Bitmap.PixelHeight));
+ (uint)(
+ colorFrameDescription.Width * colorFrameDescription.Height * 4
+ ),
+ ColorImageFormat.Bgra
+ );
+
+ this.Bitmap.AddDirtyRect(
+ new Int32Rect(0, 0, this.Bitmap.PixelWidth, this.Bitmap.PixelHeight)
+ );
}
this.Bitmap.Unlock();
diff --git a/Sources/Lib/ColorImageStream.cs b/Sources/Lib/ColorImageStream.cs
index 2580220..d28a374 100644
--- a/Sources/Lib/ColorImageStream.cs
+++ b/Sources/Lib/ColorImageStream.cs
@@ -9,19 +9,26 @@ namespace Lib
public class ColorImageStream : KinectStream
{
private ColorFrameReader reader;
- public ColorFrameReader Reader {
- get {
- return reader;
- }
- set
- {
- reader = value;
- }
+ public ColorFrameReader Reader
+ {
+ get { return reader; }
+ set { reader = value; }
}
- public ColorImageStream(KinectManager kinectManager) : base(kinectManager)
+
+ public ColorImageStream(KinectManager kinectManager)
+ : base(kinectManager)
{
- var frameDescription = KinectManager.Sensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
- this.Bitmap = new WriteableBitmap(frameDescription.Width, frameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);
+ var frameDescription = KinectManager.Sensor.ColorFrameSource.CreateFrameDescription(
+ ColorImageFormat.Bgra
+ );
+ this.Bitmap = new WriteableBitmap(
+ frameDescription.Width,
+ frameDescription.Height,
+ 96.0,
+ 96.0,
+ PixelFormats.Bgr32,
+ null
+ );
reader = KinectManager.Sensor.ColorFrameSource.OpenReader();
reader.FrameArrived += Reader_ColorFrameArrived;
}
@@ -50,14 +57,22 @@ namespace Lib
this.Bitmap.Lock();
// Vérifier si la taille de l'image a changé
- if ((colorFrameDescription.Width == this.Bitmap.PixelWidth) && (colorFrameDescription.Height == this.Bitmap.PixelHeight))
+ if (
+ (colorFrameDescription.Width == this.Bitmap.PixelWidth)
+ && (colorFrameDescription.Height == this.Bitmap.PixelHeight)
+ )
{
colorFrame.CopyConvertedFrameDataToIntPtr(
this.Bitmap.BackBuffer,
- (uint)(colorFrameDescription.Width * colorFrameDescription.Height * 4),
- ColorImageFormat.Bgra);
+ (uint)(
+ colorFrameDescription.Width * colorFrameDescription.Height * 4
+ ),
+ ColorImageFormat.Bgra
+ );
- this.Bitmap.AddDirtyRect(new Int32Rect(0, 0, this.Bitmap.PixelWidth, this.Bitmap.PixelHeight));
+ this.Bitmap.AddDirtyRect(
+ new Int32Rect(0, 0, this.Bitmap.PixelWidth, this.Bitmap.PixelHeight)
+ );
}
this.Bitmap.Unlock();
diff --git a/Sources/Lib/DepthImageStream.cs b/Sources/Lib/DepthImageStream.cs
index 1cdafd9..649f7c4 100644
--- a/Sources/Lib/DepthImageStream.cs
+++ b/Sources/Lib/DepthImageStream.cs
@@ -15,33 +15,33 @@ namespace Lib
private DepthFrameReader reader;
public DepthFrameReader Reader
{
- get
- {
- return reader;
- }
- set
- {
- reader = value;
- }
+ get { return reader; }
+ set { reader = value; }
}
private byte[] depthPixels;
- public byte[] DepthPixels {
- get {
- return depthPixels;
- }
- set
- {
- depthPixels = value;
- }
+ public byte[] DepthPixels
+ {
+ get { return depthPixels; }
+ set { depthPixels = value; }
}
- public DepthImageStream(KinectManager kinectManager) : base(kinectManager)
+
+ public DepthImageStream(KinectManager kinectManager)
+ : base(kinectManager)
{
var frameDescription = KinectManager.Sensor.DepthFrameSource.FrameDescription;
- this.Bitmap = new WriteableBitmap(frameDescription.Width, frameDescription.Height, 96.0, 96.0, PixelFormats.Gray8, null);
+ this.Bitmap = new WriteableBitmap(
+ frameDescription.Width,
+ frameDescription.Height,
+ 96.0,
+ 96.0,
+ PixelFormats.Gray8,
+ null
+ );
reader = KinectManager.Sensor.DepthFrameSource.OpenReader();
reader.FrameArrived += Reader_DepthFrameArrived;
DepthPixels = new byte[frameDescription.Width * frameDescription.Height];
}
+
private void Reader_DepthFrameArrived(object sender, DepthFrameArrivedEventArgs e)
{
using (DepthFrame depthFrame = e.FrameReference.AcquireFrame())
@@ -55,14 +55,25 @@ namespace Lib
depthFrame.CopyFrameDataToArray(depthData);
// Traitez les données de profondeur
- ProcessDepthFrameData(depthData, depthFrameDescription.LengthInPixels, depthFrame.DepthMinReliableDistance, depthFrame.DepthMaxReliableDistance);
+ ProcessDepthFrameData(
+ depthData,
+ depthFrameDescription.LengthInPixels,
+ depthFrame.DepthMinReliableDistance,
+ depthFrame.DepthMaxReliableDistance
+ );
// Mettez à jour le bitmap de profondeur
this.Bitmap.WritePixels(
- new Int32Rect(0, 0, depthFrameDescription.Width, depthFrameDescription.Height),
+ new Int32Rect(
+ 0,
+ 0,
+ depthFrameDescription.Width,
+ depthFrameDescription.Height
+ ),
this.depthPixels,
depthFrameDescription.Width,
- 0);
+ 0
+ );
}
}
}
@@ -76,7 +87,12 @@ namespace Lib
}
}
- private void ProcessDepthFrameData(ushort[] depthData, uint depthFrameDataSize, ushort minDepth, ushort maxDepth)
+ private void ProcessDepthFrameData(
+ ushort[] depthData,
+ uint depthFrameDataSize,
+ ushort minDepth,
+ ushort maxDepth
+ )
{
// Convertir les données de profondeur en niveaux de gris
for (int i = 0; i < depthFrameDataSize; ++i)
@@ -85,6 +101,5 @@ namespace Lib
DepthPixels[i] = (byte)(depth >= minDepth && depth <= maxDepth ? (depth % 256) : 0);
}
}
-
}
}
diff --git a/Sources/Lib/InfraredImageStream.cs b/Sources/Lib/InfraredImageStream.cs
index fd0fef8..c566c89 100644
--- a/Sources/Lib/InfraredImageStream.cs
+++ b/Sources/Lib/InfraredImageStream.cs
@@ -16,30 +16,27 @@ namespace Lib
private byte[] infraredPixels;
public byte[] InfraredPixels
{
- get
- {
- return infraredPixels;
- }
- private set
- {
- infraredPixels = value;
- }
+ get { return infraredPixels; }
+ private set { infraredPixels = value; }
}
public InfraredFrameReader Reader
{
- get
- {
- return reader;
- }
- private set
- {
- reader = value;
- }
+ get { return reader; }
+ private set { reader = value; }
}
- public InfraredImageStream(KinectManager kinectManager) : base(kinectManager)
+
+ public InfraredImageStream(KinectManager kinectManager)
+ : base(kinectManager)
{
var frameDescription = KinectManager.Sensor.InfraredFrameSource.FrameDescription;
- this.Bitmap = new WriteableBitmap(frameDescription.Width, frameDescription.Height, 96.0, 96.0, PixelFormats.Gray8, null);
+ this.Bitmap = new WriteableBitmap(
+ frameDescription.Width,
+ frameDescription.Height,
+ 96.0,
+ 96.0,
+ PixelFormats.Gray8,
+ null
+ );
reader = KinectManager.Sensor.InfraredFrameSource.OpenReader();
reader.FrameArrived += Reader_InfraredFrameArrived;
infraredPixels = new byte[frameDescription.Width * frameDescription.Height];
@@ -53,6 +50,7 @@ namespace Lib
reader = null;
}
}
+
private void ProcessInfraredFrameData(ushort[] frameData, uint frameDataSize)
{
// Convertir les données infrarouges en niveaux de gris
@@ -81,10 +79,16 @@ namespace Lib
// Mettez à jour le bitmap infrarouge
this.Bitmap.WritePixels(
- new Int32Rect(0, 0, infraredFrameDescription.Width, infraredFrameDescription.Height),
+ new Int32Rect(
+ 0,
+ 0,
+ infraredFrameDescription.Width,
+ infraredFrameDescription.Height
+ ),
this.infraredPixels,
infraredFrameDescription.Width,
- 0);
+ 0
+ );
}
}
}
diff --git a/Sources/Lib/KinectManager.cs b/Sources/Lib/KinectManager.cs
index dbe75da..9e06c85 100644
--- a/Sources/Lib/KinectManager.cs
+++ b/Sources/Lib/KinectManager.cs
@@ -8,10 +8,9 @@ namespace Lib
public class KinectManager : INotifyPropertyChanged
{
private KinectSensor sensor;
- public KinectSensor Sensor {
- get {
- return sensor;
- }
+ public KinectSensor Sensor
+ {
+ get { return sensor; }
set
{
sensor = value;
@@ -31,6 +30,7 @@ namespace Lib
}
public event PropertyChangedEventHandler PropertyChanged;
+
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
@@ -46,16 +46,20 @@ namespace Lib
sensor.IsAvailableChanged += KinectSensor_IsAvailableChanged;
}
}
+
public void StartSensor()
{
- if (sensor != null && !sensor.IsOpen) {
+ if (sensor != null && !sensor.IsOpen)
+ {
sensor.Open();
}
- else {
+ else
+ {
sensor = KinectSensor.GetDefault();
sensor.Open();
}
}
+
public void StopSensor()
{
if (sensor != null)
@@ -64,6 +68,7 @@ namespace Lib
sensor = null;
}
}
+
public bool Status
{
get { return Sensor != null && Sensor.IsAvailable; }
@@ -72,9 +77,10 @@ namespace Lib
public string StatusText
{
get { return _statusText; }
- set {
+ set
+ {
_statusText = value;
- if(this.PropertyChanged != null)
+ if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("StatusText"));
}
@@ -110,4 +116,4 @@ namespace Lib
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Sources/Lib/KinectStream.cs b/Sources/Lib/KinectStream.cs
index 0be4e5a..dea4da0 100644
--- a/Sources/Lib/KinectStream.cs
+++ b/Sources/Lib/KinectStream.cs
@@ -39,6 +39,7 @@ namespace Lib
}
public event PropertyChangedEventHandler PropertyChanged;
+
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
@@ -60,6 +61,5 @@ namespace Lib
}
public abstract void Stop();
-
}
}
diff --git a/Sources/Lib/KinectStreamsFactory.cs b/Sources/Lib/KinectStreamsFactory.cs
index 1571530..ce7c603 100644
--- a/Sources/Lib/KinectStreamsFactory.cs
+++ b/Sources/Lib/KinectStreamsFactory.cs
@@ -10,7 +10,8 @@ namespace Lib
public class KinectStreamsFactory
{
private KinectManager _kinectManager;
- public KinectManager KinectManager {
+ public KinectManager KinectManager
+ {
get { return _kinectManager; }
private set { _kinectManager = value; }
}
@@ -22,18 +23,21 @@ namespace Lib
private set { _streamFactory = value; }
}
- public KinectStreamsFactory(KinectManager kinect,Canvas SkeletonCanvas)
+ public KinectStreamsFactory(KinectManager kinect, Canvas SkeletonCanvas)
{
_kinectManager = kinect;
// Initialisation de la fabrique avec les fonctions de création pour chaque type de flux.
StreamFactory = new Dictionary>
- {
- { KinectStreams.Color, () => new ColorImageStream(KinectManager) },
- { KinectStreams.Depth, () => new DepthImageStream(KinectManager) },
- { KinectStreams.IR, () => new InfraredImageStream(KinectManager) },
- { KinectStreams.Body, () => new BodyImageStream(KinectManager,SkeletonCanvas) },
- { KinectStreams.ColorAndBody, () => new ColorAndBodyImageStream(KinectManager,SkeletonCanvas) }
- };
+ {
+ { KinectStreams.Color, () => new ColorImageStream(KinectManager) },
+ { KinectStreams.Depth, () => new DepthImageStream(KinectManager) },
+ { KinectStreams.IR, () => new InfraredImageStream(KinectManager) },
+ { KinectStreams.Body, () => new BodyImageStream(KinectManager, SkeletonCanvas) },
+ {
+ KinectStreams.ColorAndBody,
+ () => new ColorAndBodyImageStream(KinectManager, SkeletonCanvas)
+ }
+ };
}
public KinectStream this[KinectStreams stream]
@@ -51,4 +55,4 @@ namespace Lib
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Sources/LibMyGesturesBank/AllGesturesFactory.cs b/Sources/LibMyGesturesBank/AllGesturesFactory.cs
new file mode 100644
index 0000000..d3ddf6d
--- /dev/null
+++ b/Sources/LibMyGesturesBank/AllGesturesFactory.cs
@@ -0,0 +1,25 @@
+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 PostureHandsOnHead(),
+ new PostureHandUp(),
+ new RightHandUp(),
+ 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..243d7fe
--- /dev/null
+++ b/Sources/LibMyGesturesBank/ClapHands.cs
@@ -0,0 +1,67 @@
+using KinectUtils;
+using Microsoft.Kinect;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MyGesturesBank
+{
+ public class ClapHands : Gesture
+ {
+ private CameraSpacePoint previousRightHandPosition;
+ private CameraSpacePoint previousLeftHandPosition;
+ private bool isClapInitiated = false;
+
+ protected override bool TestInitialConditions(Body body)
+ {
+ // Initial conditions are not strict for a clap, start directly with TestPosture and TestRunningGesture
+ return true;
+ }
+
+ protected override bool TestPosture(Body body)
+ {
+ var handRight = body.Joints[JointType.HandRight].Position;
+ var handLeft = body.Joints[JointType.HandLeft].Position;
+
+ if (!isClapInitiated)
+ {
+ previousRightHandPosition = handRight;
+ previousLeftHandPosition = handLeft;
+ isClapInitiated = true;
+ return false; // Wait for the next frame to start evaluation
+ }
+
+ // Check if hands moved closer since the last frame
+ bool handsMovingCloser =
+ (handRight.X - previousRightHandPosition.X) < 0 &&
+ (handLeft.X - previousLeftHandPosition.X) > 0;
+
+ // Update positions for next comparison
+ previousRightHandPosition = handRight;
+ previousLeftHandPosition = handLeft;
+
+ // Consider hand movement towards each other as part of the posture check
+ return handsMovingCloser && Math.Abs(handRight.Y - handLeft.Y) < 0.2f;
+ }
+
+ protected override bool TestRunningGesture(Body body)
+ {
+ // This method could be used to check for the continuation of the gesture, if necessary
+ return true;
+ }
+
+ protected override bool TestEndConditions(Body body)
+ {
+ var handRight = body.Joints[JointType.HandRight].Position;
+ var handLeft = body.Joints[JointType.HandLeft].Position;
+
+ // End condition based on proximity of hands
+ return Math.Abs(handRight.X - handLeft.X) < 0.1f;
+ }
+
+ public override string GestureName => "Clap Hands";
+ }
+}
diff --git a/Sources/LibMyGesturesBank/MyGesturesBank.csproj b/Sources/LibMyGesturesBank/MyGesturesBank.csproj
index 7a43ab1..3cea259 100644
--- a/Sources/LibMyGesturesBank/MyGesturesBank.csproj
+++ b/Sources/LibMyGesturesBank/MyGesturesBank.csproj
@@ -42,13 +42,16 @@
+
+
+
-
+
diff --git a/Sources/LibMyGesturesBank/PostureHandUp.cs b/Sources/LibMyGesturesBank/PostureHandUp.cs
index 54b1a6e..46e14e8 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;
+
+ return handRight.Y > head.Y || handLeft.Y > head.Y;
}
- public override string GestureName => "Hand Up";
+ public override string GestureName => "Posture Hand Up";
}
-
}
diff --git a/Sources/LibMyGesturesBank/PostureHandsOnHead .cs b/Sources/LibMyGesturesBank/PostureHandsOnHead .cs
index 7ad19b9..5cf603d 100644
--- a/Sources/LibMyGesturesBank/PostureHandsOnHead .cs
+++ b/Sources/LibMyGesturesBank/PostureHandsOnHead .cs
@@ -8,27 +8,17 @@ 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";
-
+ public override string GestureName => "Posture Hands On Head";
}
-
-
}
diff --git a/Sources/LibMyGesturesBank/RightHandUp.cs b/Sources/LibMyGesturesBank/RightHandUp.cs
index 259d3a5..986f533 100644
--- a/Sources/LibMyGesturesBank/RightHandUp.cs
+++ b/Sources/LibMyGesturesBank/RightHandUp.cs
@@ -1,12 +1,23 @@
-using System;
+using KinectUtils;
+using Microsoft.Kinect;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace LibMyGesturesBank
+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;
+ }
+
+ public override string GestureName => "Right Hand Up";
}
}
diff --git a/Sources/LibMyGesturesBank/SwipeRightHand.cs b/Sources/LibMyGesturesBank/SwipeRightHand.cs
new file mode 100644
index 0000000..ab50dcb
--- /dev/null
+++ b/Sources/LibMyGesturesBank/SwipeRightHand.cs
@@ -0,0 +1,79 @@
+using KinectUtils;
+using Microsoft.Kinect;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MyGesturesBank
+{
+ public class SwipeRightHand : Gesture
+ {
+ private float previousX = float.NaN;
+ private bool gestureStarted = false;
+
+ protected override bool TestInitialConditions(Body body)
+ {
+ 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
+ bool initialCondition = handRight.X >= shoulderRight.X && handRight.X - shoulderRight.X < 0.4f;
+
+ if (initialCondition && !gestureStarted)
+ {
+ // Si les conditions initiales sont remplies et que le geste n'a pas encore commencé,
+ // initialiser previousX et marquer le geste comme commencé
+ previousX = handRight.X;
+ gestureStarted = true;
+ return false; // Attendre le prochain frame pour commencer l'évaluation
+ }
+ return initialCondition;
+ }
+
+ protected override bool TestPosture(Body body)
+ {
+ 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)
+ {
+ if (!gestureStarted) return false; // Assurer que le geste a commencé correctement
+
+ 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)
+ {
+ 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
+ if (handRight.X > spineBase.X + 0.8f) // Ajustez cette valeur selon le besoin
+ {
+ gestureStarted = false; // Réinitialiser l'état du geste
+ previousX = float.NaN; // Préparer pour la prochaine détection
+ return true;
+ }
+ return false;
+ }
+
+ public override string GestureName => "Swipe Right Hand";
+ }
+}
diff --git a/Sources/LibMyGesturesBank/TwoHandsDragon.cs b/Sources/LibMyGesturesBank/TwoHandsDragon.cs
index a5e9d5f..0f30adc 100644
--- a/Sources/LibMyGesturesBank/TwoHandsDragon.cs
+++ b/Sources/LibMyGesturesBank/TwoHandsDragon.cs
@@ -1,12 +1,24 @@
-using System;
+using KinectUtils;
+using Microsoft.Kinect;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace LibMyGesturesBank
+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;
+ }
+
+ public override string GestureName => "Two Hands Dragon";
}
}
diff --git a/Sources/WpfApp/App.xaml.cs b/Sources/WpfApp/App.xaml.cs
index ebc8edd..be40af0 100644
--- a/Sources/WpfApp/App.xaml.cs
+++ b/Sources/WpfApp/App.xaml.cs
@@ -11,7 +11,5 @@ namespace WpfApp
///
/// Logique d'interaction pour App.xaml
///
- public partial class App : Application
- {
- }
+ public partial class App : Application { }
}
diff --git a/Sources/WpfApp/Bone.cs b/Sources/WpfApp/Bone.cs
index 4b9bf97..de5c550 100644
--- a/Sources/WpfApp/Bone.cs
+++ b/Sources/WpfApp/Bone.cs
@@ -11,9 +11,10 @@ namespace WpfApp
public class Bone : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
+
private void OnPropertyChanged(string propName)
{
- if(PropertyChanged != null)
+ if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
@@ -23,23 +24,17 @@ namespace WpfApp
public double Top
{
get { return _top; }
- set {
+ set
+ {
_top = value;
OnPropertyChanged(nameof(Top));
}
}
- public double Left
- {
- get;
- set;
- }
+ public double Left { get; set; }
public double Diameter
{
- get
- {
- return _diameter;
- }
+ get { return _diameter; }
set
{
_diameter = value;
@@ -47,9 +42,6 @@ namespace WpfApp
}
}
private double _diameter;
- public SolidColorBrush ColorBrush {
- get;
- set;
- }
+ public SolidColorBrush ColorBrush { get; set; }
}
}
diff --git a/Sources/WpfApp/Bones.cs b/Sources/WpfApp/Bones.cs
index e56fc98..f1b6706 100644
--- a/Sources/WpfApp/Bones.cs
+++ b/Sources/WpfApp/Bones.cs
@@ -9,9 +9,9 @@ namespace WpfApp
{
class Bones : Collection
{
- public Bones() {
+ public Bones()
+ {
Add(new Bone { });
}
-
}
}
diff --git a/Sources/WpfApp/MainWindow.xaml.cs b/Sources/WpfApp/MainWindow.xaml.cs
index 823fe81..6aa8bc6 100644
--- a/Sources/WpfApp/MainWindow.xaml.cs
+++ b/Sources/WpfApp/MainWindow.xaml.cs
@@ -22,7 +22,7 @@ namespace WpfApp
///
/// Logique d'interaction pour MainWindow.xaml
///
- public partial class MainWindow : Window,INotifyPropertyChanged
+ public partial class MainWindow : Window, INotifyPropertyChanged
{
private KinectManager kinectManager;
public KinectManager KinectManager
@@ -34,7 +34,8 @@ namespace WpfApp
public KinectStream CurrentKinectStream
{
get { return _currentKinectStream; }
- set {
+ set
+ {
_currentKinectStream = value;
OnPropertyChanged(nameof(CurrentKinectStream));
}
@@ -63,10 +64,8 @@ namespace WpfApp
Debug.WriteLine(CurrentKinectStream.KinectManager.StatusText);
CurrentKinectStream.Start();
Debug.WriteLine(CurrentKinectStream.KinectManager.StatusText);
-
}
-
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Debug.WriteLine(CurrentKinectStream.KinectManager.StatusText);
@@ -104,6 +103,7 @@ namespace WpfApp
Debug.WriteLine(CurrentKinectStream.GetType().Name);
CurrentKinectStream.Start();
}
+
private void ToColorAndBodyImageStream(object sender, RoutedEventArgs e)
{
CurrentKinectStream.Stop();
@@ -112,4 +112,4 @@ namespace WpfApp
CurrentKinectStream.Start();
}
}
-}
\ No newline at end of file
+}
diff --git a/Sources/WpfApp/Properties/AssemblyInfo.cs b/Sources/WpfApp/Properties/AssemblyInfo.cs
index a44044c..bf0b006 100644
--- a/Sources/WpfApp/Properties/AssemblyInfo.cs
+++ b/Sources/WpfApp/Properties/AssemblyInfo.cs
@@ -33,14 +33,13 @@ using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //où se trouvent les dictionnaires de ressources spécifiques à un thème
- //(utilisé si une ressource est introuvable dans la page,
- // ou dictionnaires de ressources de l'application)
+ //(utilisé si une ressource est introuvable dans la page,
+ // ou dictionnaires de ressources de l'application)
ResourceDictionaryLocation.SourceAssembly //où se trouve le dictionnaire de ressources générique
- //(utilisé si une ressource est introuvable dans la page,
- // dans l'application ou dans l'un des dictionnaires de ressources spécifiques à un thème)
+//(utilisé si une ressource est introuvable dans la page,
+// dans l'application ou dans l'un des dictionnaires de ressources spécifiques à un thème)
)]
-
// Les informations de version pour un assembly se composent des quatre valeurs suivantes :
//
// Version principale
diff --git a/Sources/WpfApp/StreamTemplateSelector.cs b/Sources/WpfApp/StreamTemplateSelector.cs
index c22b909..ed7df77 100644
--- a/Sources/WpfApp/StreamTemplateSelector.cs
+++ b/Sources/WpfApp/StreamTemplateSelector.cs
@@ -16,8 +16,10 @@ namespace WpfApp
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
- if (item is BodyImageStream) return ColorAndBodyImageStreamTemplate;
- else return OtherStreamTemplate;
+ if (item is BodyImageStream)
+ return ColorAndBodyImageStreamTemplate;
+ else
+ return OtherStreamTemplate;
}
}
}