miércoles, 14 de mayo de 2014

Capturar el esqueleto en la Kinect

Hola amigos lectores, hoy les enseñaré cual es el procedimiento que se debe realizar para poder capturar las articulaciones del esqueleto de una o más personas que se encuentren en el campo de visión de la kinect, para ello primero será necesario instalar el SDK de Kinect para Windows, si deseas saber cómo instalarlo puedes revisar mi entrada anterior.




Skeleton Traking

El SDK de Kinect para windows posee una funcionalidad llamada Skeleton Traking, la cual permite hacer un seguimiento de uno o más esqueletos que se encuentre dentro del área de visión del sensor, esto permite a los desarrolladores capturar los datos de la posición espacial de las articulaciones de los esqueletos en cada frame que sea procesado por la aplicación (recordar que la kinect envía 30 frames por segundo a la aplicación). Para identificar a cada articulación es necesario relacionarla con un nombre. En la siguiente imagen se ilustra el nombre que posee cada articulación del cuerpo humano.




Por ejemplo, si quisiéramos capturar los datos correspondientes del pie derecho, sólo tendríamos que referenciarlo con la palabra "FOOT_RIGHT". Para poder realizar esto en código, deberemos añadir la opción UseSkeletalTracking cuando inicializamos el sensor en el evento loaded y creamos el evento SkeletonFrameReady que nos permitirá capturar los datos del esqueleto una vez que se obtengan.

kinect = new Runtime(); 
kinect.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking); 
kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinect_SkeletonFrameReady);

En el método Kinect_SkeletonFrameReady que se habrá creado será donde implementemos el código para obtener las articulaciones del cuerpo. Para este objetivo deberemos obtener los datos del Skeleton a partir del SkeletonFrame que se captura. El SkeletonFrame que se captura permite obtener un arreglo de esqueletos, esto quiere decir que esta estructura de datos contiene las articulaciones de todas las personas que estén en el campo de visión del sensor (aunque la máxima cantidad de esqueletos que se pueden consultar a las vez son 2). Si queremos recorrer los esqueletos será necesario utilizar foreach para poder recorrer las articulaciones de los esqueletos que haya reconocido la kinect. También deberemos saber si el esqueleto consultado es correcto o no, esto se hace con la propiedad TrakingState (NotTracket, PositionOnly, o Tracket).


void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 

     foreach (SkeletonData skeleton in e.SkeletonFrame.Skeletons) 
        if (skeleton.TrackingState == SkeletonTrackingState.Tracked) 
        {


Ahora lo único que tenemos que hacer es llamar al método JointID que utilizamos para obtener el vector de las articulaciones de un esqueleto. Para identificar una articulación particular será necesario poner como índice del vector una constante numérica, la cual posee como nombre identificadores como los que se mostraron en la imagen anterior.

float HandRightX = skeleton.Joints[JointID.HandRight].Position.X; 
float HandRightY = skeleton.Joints[JointID.HandRight].Position.Y; 
float HandRightZ = skeleton.Joints[JointID.HandRight].Position.Z;

Bueno eso ha sido todo por esta entrada, espero que les haya sido de utilidad, ya que para mi y mi grupo de desarrollo en la universidad nos ha servido para comenzar con los primeros prototipos de un piano virtual utilizando la kinect, la cual detallaré en profundidad en la próxima entrada. Nos estamos leyendo...

No hay comentarios:

Publicar un comentario