Add(CreateGestures): gesture and posture #20

Merged
louis.dufour merged 2 commits from CreateGestures into dev 1 year ago

@ -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;
}
}
}

@ -44,6 +44,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="ClapHands.cs" />
<Compile Include="PostureHandsOnHead .cs" /> <Compile Include="PostureHandsOnHead .cs" />
<Compile Include="PostureHandUp.cs" /> <Compile Include="PostureHandUp.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
@ -52,6 +53,10 @@
<Compile Include="TwoHandsDragon.cs" /> <Compile Include="TwoHandsDragon.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\KinectUtils\KinectUtils.csproj">
<Project>{2d44487e-f514-4063-9494-2af1e8c9e9c8}</Project>
<Name>KinectUtils</Name>
</ProjectReference>
<ProjectReference Include="..\Lib\Lib.csproj"> <ProjectReference Include="..\Lib\Lib.csproj">
<Project>{0751c83e-7845-4e5f-a5d3-e11aba393aca}</Project> <Project>{0751c83e-7845-4e5f-a5d3-e11aba393aca}</Project>
<Name>Lib</Name> <Name>Lib</Name>

@ -7,11 +7,13 @@ namespace MyGesturesBank
{ {
protected override bool TestPosture(Body body) protected override bool TestPosture(Body body)
{ {
// Exemple de condition : la main droite est plus haute que l'épaule droite var handRight = body.Joints[JointType.HandRight].Position;
return body.Joints[JointType.HandRight].Position.Y > body.Joints[JointType.ShoulderRight].Position.Y; 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;
}
} }
} }

@ -8,27 +8,15 @@ namespace MyGesturesBank
{ {
protected override bool TestPosture(Body body) protected override bool TestPosture(Body body)
{ {
// Condition pour la main droite proche de la tête var handRight = body.Joints[JointType.HandRight].Position;
bool rightHandNearHead = IsHandNearHead(body.Joints[JointType.HandRight], body.Joints[JointType.Head]); var handLeft = body.Joints[JointType.HandLeft].Position;
var head = body.Joints[JointType.Head].Position;
// Condition pour la main gauche proche de la tête // Ajustez les seuils selon la précision souhaitée
bool leftHandNearHead = IsHandNearHead(body.Joints[JointType.HandLeft], body.Joints[JointType.Head]); 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";
} }

@ -1,4 +1,6 @@
using System; using KinectUtils;
using Microsoft.Kinect;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -6,7 +8,15 @@ using System.Threading.Tasks;
namespace MyGesturesBank 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;
}
} }
} }

@ -10,28 +10,50 @@ namespace MyGesturesBank
{ {
public class SwipeRightHand : Gesture public class SwipeRightHand : Gesture
{ {
private float previousX = float.NaN;
protected override bool TestInitialConditions(Body body) protected override bool TestInitialConditions(Body body)
{ {
// Implémentez la logique pour vérifier les conditions initiales du balayage à droite var handRight = body.Joints[JointType.HandRight].Position;
return false; 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) protected override bool TestPosture(Body body)
{ {
// Implémentez la vérification de la posture pour le balayage à droite var handRight = body.Joints[JointType.HandRight].Position;
return false; 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) 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; return false;
} }
protected override bool TestEndConditions(Body body) protected override bool TestEndConditions(Body body)
{ {
// Vérifiez si les conditions de fin du geste de balayage à droite sont remplies var handRight = body.Joints[JointType.HandRight].Position;
return false; 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
} }
} }

@ -1,4 +1,6 @@
using System; using KinectUtils;
using Microsoft.Kinect;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -6,7 +8,16 @@ using System.Threading.Tasks;
namespace MyGesturesBank 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;
}
} }
} }

Loading…
Cancel
Save