Detección de gestos horizontales con Kinect

El esqueleto detectado de una persona a través de Kinect posee la información de las coordenadas (x, y) de todas sus articulaciones (esqueleto).

Observando estas coordenadas a través del tiempo se puede llegar a reconocer patrones de movimientos (gestos). Estos gestos se utilizan, en la mayoría de casos, para interactuar con un software. Es decir un programa es capaz de identificar los gestos de un usuario y actuar en consecuencia.

Por ejemplo para identificar el desplazamiento lateral de la mano, basta con mirar las coordenadas de la articulación correspondiente y ver si después de un tiempo, ha habido un incremento de X en una dirección notable. Evidentemente hay que considerar que el incremento de Y sea mínimo, o lo que es lo mismo, esté dentro de un threshold aceptable.

En mi caso, para una aplicación que realicé en la que mediante gestos horizontales de la mano cambiabas ropa de un maniquí, la implementación algorítmica fue más o menos así:

estructura( posicion:punto2D; tiempo: tiempo;): Gesto;
var gestos:Gesto[];
 
Para cada intervalo de tiempo de observación:
{
    var longitud:entero = longitud(gestos);
    Si(longitud >= 30)
        ShiftGesture();
    gestos[longitud - 1].posicion = PosicionActualMano();
    gestos[longitud - 1].tiempo = TiempoActual();
 
    var dX:entero = CalculaDXValido();
    var dY:entero = CalculateDYValido();
 
    Si(dX >= tDX && dY <= tDY)
    {
        print("Gesto lateral reconocido");
        ResetearGestos();
    }
}

La idea es tener un array de gestos donde se almacena cada cierto tiempo la posición de la mano y el tiempo. Cuando este array se llena, la primera posición se pierde (ShiftGesture), y todos los valores que se leen a continuación se introducen en la última posición.

Seguidamente se evalúan a partir del array de gestos los incrementos en X e Y (CalculaDXValido y CalculaDYValido) para eliminar falsos positivos como el que daría una mano que salte de una posición a otra en un corto periodo de tiempo. Si aún así ambos pasan los thresholds, existe un gesto horizontal.

Parece algo impreciso, sin embargo, he estado probando un par de juegos para ver que tal está el tema de reconocimiento de gestos en el sector profesional. Y la verdad que me ha decepcionado bastante. Por poner un ejemplo, Dance Central de XBOX 360. Te hacen repetir los movimientos de un monigote en la pantalla a modo de baile. Sin embargo basta con clavar las articulaciones o extremidades que marca el movimiento. Quiero decir, ves al monigote bailando que da envidia de lo bien que lo hace, pero como jugador con mover un pie y una mano me marca el movimiento correctamente. Hay que echarle mucha imaginación…

De todas formas no he sido el único que se ha sentido frustrado en ese sentido. Recuerdo que al principio, el software de ocio implementado para Kinect dio bastante de que hablar por casos como el que se muestra en el siguiente vídeo, dónde un buen hombre decide jugar a ganar sin mover un pelo, literalmente:

Etiquedado como , , ,

Deja un comentario

Tu dirección de correo electrónico no será publicada.