Como se comentó en el post anterior, el seguimiento
del esqueleto es una de las características estrella del sensor Kinect. A
través de la función Skeleton Tracking nos permite obtener la situación de un
esqueleto completo, haciendo uso de un algoritmo que logra identificar partes
del cuerpo de las personas que se encuentran en el campo de visión del sensor.
El Skeleton Tracking ofrece toda la información del esqueleto en forma de un conjunto de puntos o
articulaciones (Joints). En la siguiente imagen se pueden observar las 20 articulaciones distintas que Kinect puede detectar y
nos permite manejar:
Esqueleto que muestra las 20 articulaciones capturadas por el sensor Kinect |
El SDK de Kinect permite obtener los puntos y la posición en
el espacio de las 20 articulaciones de una forma sencilla. Cada vez que el
sensor detecta un esqueleto lanza el evento SkeletonFrameReady, éste a su vez,
haciendo uso del objeto SkeletonFrame, captura los datos del Skeleton
(esqueleto detectado).
Para nuestro sistema a desarrollar se requiere la detección de aquellos
esqueletos que generen datos, es por ello que en el evento SkeletonFrameReady
se comprueba la propiedad TrackingState, la cual verifica si el estado del
esqueleto es el esperado. Dicha propiedad puede tener los siguientes valores:
NotTracked (No se detecta esqueleto), PositionOnly (Se detecta esqueleto pero
no de forma completa), Tracked (Se detecta esqueleto completamente).
Realizado lo anterior, se puede proceder a la obtención de
los puntos que conforman el esqueleto detectado. Lo haremos haciendo uso del
tipo enumerado JoinType.[nombreArticulación], el cual nos permite acceder de
una forma fácil a cada punto. Puede verse un ejemplo en la primera línea de la siguiente imagen:
Código C# para obtener las coordenadas (x,y,z) de una articulación |
Nuestro objetivo aquí, es obtener los datos de la posición de cada
articulación, es por ello que tenemos que ir un poco más allá y utilizar el
tipo SkeletonPoint ofrecido por el SDK de Kinect. Podemos ver un ejemplo en la
segunda línea de código de la imagen anterior.
Finalmente, una vez hemos obtenido la posición de la
articulación, el objetivo final es conseguir su guardado en la base de datos.
Para ello se utilizarán tres variables: una variable X, una Y, y otra Z que
hacen referencia al punto en el espacio que tiene la articulación con respecto
a la posición del sensor. Esto facilitaría la tarea de almacenar las
articulaciones en, por ejemplo, nuestra base de datos. Siguiendo con el ejemplo, a
partir de la tercera línea de código de la imagen anterior se puede ver claramente.
Para terminar este post, recordar que el código en lenguaje C# de la imagen anterior está relacionado con el modelo creado para almacenar los datos recogidos por el sensor Kinect. Se comentarán en siguientes post las tecnologías relacionadas para crear un bloque completo de todo el sistema, en el que todas las partes se relacionen, ya que, además, se tendrá una interfaz gráfica por un lado, por otro, datos recogidos por el sensor a almacenar en el modelo de base de datos, servicios web, etc.
En el siguiente post, seguiré hablando de la detección de esqueletos.
¡Un saludo!
Álvaro Alcolea