domingo, 3 de mayo de 2015

Proyecto Kinect: Comparación de esqueletos

Se puede obtener una solución a la comparación entre articulaciones de distintos esqueletos, de la forma en que realizamos el guardado de las mismas en el punto anterior.

Teniendo guardado los puntos de las articulaciones de dos esqueletos, se podría realizar una comparación de los ángulos que forman entre sí. La utilización de esta técnica de comparación viene motivada por el hecho de que, por ejemplo, existen personas con diferente altura, es decir, diferente tamaño de esqueleto. Por tanto, otra técnica como, por ejemplo, la de diferenciar los puntos de las articulaciones, nos daría muchos problemas en la comparación. Dicho lo cual, se decide utilizar la técnica de cálculo de la amplitud o ángulo de las articulaciones del esqueleto. Esas amplitudes son comparadas para buscar las similitudes con las amplitudes de otros esqueletos.

Observando el esqueleto de la siguiente ilustración podemos observar los ángulos que serán calculados para realizar la comparación entre posturas, concretamente, para la parte del miembro superior.
Esquema con los ángulos a calcular

Fijándonos en un ángulo concreto su cálculo se realizará llamando al método devAnguloEntrePuntos, que devuelve el ángulo calculado y recibe como parámetros las coordenadas (x, y, z) de los tres Joints o puntos de unión. En la siguiente imagen se muestra el ángulo formado por las tres articulaciones (Joints).
Esquema del ángulo calculado a partir de tres articulaciones
El método en código C# es el siguiente:

Código C# para el cálculo del ángulo
El método devAnguloEntrePuntos hace uso de otro método para calcular el vector normal producido por las coordenadas de los tres Joints. El método para calcularlo es el siguiente:

Código C# para el cálculo del vector normal
Finalizando con este post, una vez que se ha realizado el cálculo de los ángulos de las articulaciones de dos posturas distintas (en nuestro sistema se habla de dos posturas una para el paciente, y otra, para el fisioterapeuta) se realiza la diferencia entre ambos ángulos. En la siguiente figura se puede ver el código necesario para realizar la diferencia entre el ángulo de la muñeca derecha del esqueleto del fisioterapeuta y del paciente.
Diferencia entre el ángulo del fisioterapeuta y del paciente
En el siguiente post, hablaré del reconocimiento de comandos de voz con Microsoft Kinect.

Un saludo!

Álvaro Alcolea

2 comentarios:

  1. Buenas tardes Alvaro.
    Estoy trabajando con la plataforma de Kinect y tengo un problema al momento de calcular el angulo de la rodilla y estoy utilizando tu formula pero me varían los resultado en momento cuando tengo bien estirada la rodilla me marca un angulo de 77 0 78 y otras veces me 59 a 68.
    ¿Quisiera saber el porque esos datos?
    Espero y me puedas ayudar, Saludos...

    ResponderEliminar
    Respuestas
    1. Hola muy buenas.

      ¿qué versión utilizas de Kinect? Si es la versión V1 (xbox360), la precisión es inferior con respecto a la nueva Kinect V2 de xbox one, lo cual por mi experiencia podría dar errores en el cálculo del ángulo.

      Por otra parte, el ángulo de la rodilla podría verse afectado por la profundidad en el valor 'z'. Una buena idea podría ser calcular otros ángulos y ver si también difieren en 10° como el ángulo que calculas de la rodilla.

      Yo por mi experiencia con Kinect te adelanto que, en el caso de que quieras hacer comparaciones entre esqueletos, establezcas un umbral de error, ya que el cálculo de este ángulo depende de tres variables (x, y, z).

      Un saludo!

      Eliminar

Añade un comentario