Merge pull request 'Add(CreateGestures): gesture and posture' (#20) from CreateGestures into dev

Reviewed-on: #20
pull/21/head
Louis DUFOUR 1 year ago
commit 4c349638bb

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

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

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

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

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

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

Loading…
Cancel
Save