Está en la página 1de 3

Cdigo del Loaded:

kinect = new Runtime();


kinect.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkel
etalTracking);
kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinec
t_SkeletonFrameReady);
Cdigo del evento SkeletonFrameReady:
void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
foreach (SkeletonData skeleton in e.SkeletonFrame.Skeletons)
if (skeleton.TrackingState == SkeletonTrackingState.Tracked)
{
Vector3 handRight = new Vector3();
handRight.X = skeleton.Joints[JointID.HandRight].Position.X;
handRight.Y = skeleton.Joints[JointID.HandRight].Position.Y;
handRight.Z = skeleton.Joints[JointID.HandRight].Position.Z;
//Cdigo del detector
}
}
Tambin hay que crear la estructura Vector3 para trabajar con las posiciones ms fcil
mente aadiendo un campo ms para almacenar la fecha.
[Serializable]
public struct Vector3
{
public float X;
public float Y;
public float Z;
public DateTime date;
}
Deslizar
Ya tenemos el proyecto listo para aadir el cdigo necesario para detectar gestos. P
ero antes de eso vamos a ver qu gesto queremos detectar.
Vamos a implementar la deteccin de Swipe o deslizamiento. Este gesto es simple, s
e trata de mover la mano derecha hacia la derecha estando siempre a la misma alt
ura y con una determinada velocidad.
image
Con esos factores podremos definir el gesto adecuadamente. Tenemos que tener el
cuenta que para ello lo que vamos a hacer es ir comparando cada posicin que obten
gamos del sensor con las sucesivas para saber si el gesto es el correcto o no.
Los aspectos bsicos para reconocer el gesto sern que la altura de la mano sea pare
cida, que el movimiento se realice a la derecha y que la longitud del movimiento
sea suficiente para llegar a ser un Swipe.
Implementar el reconocimiento
Para poder identificar gestos vamos a necesitar 2 listas, una de tipo Vector3 pa
ra almacenar las posiciones que vamos obteniendo y otra para llevar la cuenta de
los gestos que hemos identificado.
List<Vector3> positionList = new List<Vector3>();
List<Gesture> gestureAcceptedList = new List<Gesture>();
Despus crearemos las propiedades que usaremos para definir el gesto, para la long
itud, ancho del y duracin del movimiento. Tambin tendremos otra propiedad para sab
er cundo hemos detectado el ltimo gesto y otra por si queremos aadir un tiempo mnimo
entre detecciones de gesto. Por ltimo un enumerado para nombrar los gestos.
const float SwipeMinimalLength = 0.4f;
const float SwipeMaximalHeight = 0.2f;
const int SwipeMininalDuration = 250;
const int SwipeMaximalDuration = 1500;
DateTime lastGestureDate = DateTime.Now;
int MinimalPeriodBetweenGestures = 0;
public enum Gesture
{
None,
Swipe
}

Lo siguiente es crear la funcin que se va a encargar de recorrer la lista de posi
ciones que tenemos e ir comprobando si existe un conjunto de ellas que pueda ser
el gesto que queremos detectar.
Entre estas comprobaciones se encuentran las mencionadas anteriormente de conser
var la misma altura de la mano y direccin correcta de movimiento.
Si cumple eso hay que comprobar si la longitud del gesto es la adecuada para ms t
arde calcular los tiempos para saber si la velocidad es la idnea y entra dentro d
el rango del periodo entre gestos ( en este caso el periodo entre gestos es 0).
Por ltimo mostraremos que hemos detectado el gesto en una etiqueta, aadimos el ges
to a la lista de gestos aceptados, asignamos la fecha de ahora a la propiedad co
rrespondiente a la fecha del ltimo gestos detectado y borramos la lista de posici
ones que tenemos.
void Swipe()
{
int start = 0;
for (int index = 0; index < positionList.Count-1; index++)
{
if ((Math.Abs(positionList[0].Y - positionList[index].Y) > Swipe
MaximalHeight) || (positionList[index].X - positionList[index + 1].X > -0.01f))
{
start = index;
}
if ((Math.Abs(positionList[index].X - positionList[start].X) > S
wipeMinimalLength))
{
double totalMilliseconds = (positionList[index].date- positi
onList[start].date).TotalMilliseconds;
if (totalMilliseconds >= SwipeMininalDuration && totalMillis
econds <= SwipeMaximalDuration)
{
if (DateTime.Now.Subtract(lastGestureDate).TotalMillisec
onds > MinimalPeriodBetweenGestures)
{
label1.Content = "Swipe "+ gestureAcceptedList.Count
;
gestureAcceptedList.Add(Gesture.Swipe);
lastGestureDate = DateTime.Now;
positionList.Clear();
}
}
}
}
}
Ahora aadimos la llamada en el evento SkeletonFrameReady en el lugar indicado don
de aadiremos las posiciones a la lista de posiciones, llamaremos al detector de g
estos y despus borraremos las posiciones sobrantes de la lista si hemos alcanzado
el tope mximo que lo hemos puesto en 20.
positionList.Add(new Vector3()
{
X = handRight.X,
Y = handRight.Y,
Z = handRight.Z,
date = DateTime.Now
}
);
Swipe();
if (positionList.Count() > 20)
{
positionList.RemoveAt(0);
}

También podría gustarte