Automatización de toma de fotografías con Kinect

Parte 2 Toma de fotografías con la detección de la mano derecha

Hola amigos, el día de hoy completaremos la publicación de automatización de fotografías con Kinect.

Resultados del tutorial

El resultado de este tutorial vamos a obtener que Kinect tome la fotografía al momento de que detecte la mano izquierda o derecha.

Pre Requisitos

Cómo pre requisito para este tutorial ocuparemos el código que utilizamos en el video tutorial anterior (descárgalo aquí)

Un poco de teoría:

Para este tutorial ocuparemos el Skeletal tracking:

  • Skeletal tracking significa seguimiento de esqueleto, este esta basado en un algoritmo que logra identificar partes del cuerpo, gestos y/o posturas de quienes están en el campo de visión del sensor.

Kinect es capaz de detectar dos tipos de Esqueletos, el default y el seated

  1. Default: Es el esqueleto predeterminado en el cual Kinect identifica las 20 partes del cuerpo fundamentales en las extremidades y en el rostro del cuerpo humano.
  2. Seated: Es el esqueleto que Kinect detecta si el usuario está sentado, solo cuenta con 10 puntos de identificación, se utiliza comúnmente cuando el usuario está cerca del sensor.

automatización1

Ahora bien, cada punto de los esqueletos recibe un nombre, nombre con el cuál podrás indicarle a Kinect que si es detectada tal parte tome la fotografía.

automatización2

Inicio de tutorial

Una vez que tengas ya todo listo lo primero que tenemos que hacer es agregar un arreglo de tipo esqueleto con una dimensión de 6 (el número 6 significa el máximo de personas que Kinect puede identificar)

automatización3

Enseguida debemos poner en el Window_Loaded una condición if para verificar si Kinect detecta a una persona o a un “esqueleto”, esta condición va justo debajo de this.sensor.ColorFrameReady += this.sensor_ColorFrameReady;

if (!this.sensor.SkeletonStream.IsEnabled)

{

}

A continuación viene lo divertido, para esto debemos saber qué tipo de esqueleto queremos que Kinect detecte, es decir ¿sentado o de pie?, en mi caso estará sentado, pero te enseñare como puedes cambiarlo según sean tus necesidades, es muy simple.

Dentro del if agrega la siguiente línea de código para activar el esqueleto.

this.sensor.SkeletonStream.Enable();

Sí deseas que Kinect solo detecte los 10 puntos superiores del cuerpo agrega.

this.sensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;

Sí deseas que este de pie cambia Seated por Default.

this.sensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Default;

Por último agregamos el evento SkeletonFrameReady

this.sensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(sensor_SkeletonFrameReady);

Al final obtendremos algo como esto:

automatización5

Método sensor_SkeletonFrameReady

Para crear el método de manera automática damos clic en el icono que aparece justo debajo del error sensor_SkeletonFrameReady  y damos clic en Generar método

automatización4

Este método es el que nos permitirá detectar el esqueleto y la mano para tomar la fotografía.

  1. Lo primero que tenemos que hacer es verificar que información nos está detectando Kinect con respecto al esqueleto y si realmente nos está detectando algo, para ello agregamos las siguientes líneas de código:

using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())

{

// Verifica que se encontró un esqueleto.

if (skeletonFrame == null)

{

return;

}

  1. A continuación vamos a copiar la información del frame a la colección, obtenemos la información del primer esqueleto y verificamos que este sea detectado por el sentor.

//copia la información del frame en la colección

skeletonFrame.CopySkeletonDataTo(totalSkeleton);

//Obtiene el primer esqueleto

Skeleton firstSkeleton = (from trackskeleton in totalSkeleton

where trackskeleton.TrackingState == SkeletonTrackingState.Tracked

select trackskeleton).FirstOrDefault();

//Aqui verificamos si el primer esqueleto regresa nulo, es decir no encontrado

if (firstSkeleton == null)

{

return;

}

  1. Ahora sigue lo divertido, debemos detectar la mano con la que si Kinect detecta automáticamente tome la foto, para ello agregamos una condición.

if (firstSkeleton.Joints[JointType.HandRight].TrackingState == JointTrackingState.Tracked)

{

}

  1. Dentro de la condición vamos a decirle que si es detectada la mano derecha que me tome la fotografía, esto solo agregando:

this.saveImage();

Nota: En mi caso e decidido pausar a Kinect después de que me tome la fotografía para tener un mejor control de las fotografías que este tomará.

Una vez agregado todo el código tendremos algo similar a esto.

if (firstSkeleton.Joints[JointType.HandRight].TrackingState == JointTrackingState.Tracked)

                {

                    this.saveImage();

                    this.sensor.Stop();

                 }

Y listo solo guardamos y corremos nuestro proyecto y hemos terminado.

Descarga el código completo de este tutorial aquí.

Presentación utilizada en el video descargala  aqui

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s