Para ello, hemos
partido de un proyecto open source para el reconocimiento
de gestos a través del Software Development Kit (SDK) de
Kinect que nos ha facilitado nuestro tutor Juan Manuel Montero.
El código de este
proyecto está escrito en C#, a diferencia del código con el
que hemos estado trabajando en el resto de las fases de desarrollo de nuestro
sistema, que estaba escrito en Java.
Al igual que ocurría en
el reconocimiento de gestos a través del acelerómetro de un dispositivo
Android, el algoritmo usado para calcular distancias es el alineamiento temporal dinámico (DTW).
La principal diferencia
que encontramos entre lo explicado para el acelerómetro del móvil y Kinect es
que, en esta ocasión, en lugar de trabajar con 3 coordenadas de la aceleración
sufrida por el móvil, trabajamos con posiciones
de nuestro esqueleto. Estudiaremos la posición de 6 partes de nuestro cuerpo: mano
izquierda y derecha, muñeca
izquierda y derecha y codo izquierdo
y derecho. Nuestro nuevo sistema de coordenadas será de 2 dimensiones, por lo que sólo tendremos coordenadas (x,y).
Además, el origen de coordenadas lo
tendremos en el punto medio del
segmento que une ambos hombros.
En primer lugar,
hablaremos en esta entrada brevemente del hardware
del que dispone Kinect y las
funcionalidades que nos proporciona Microsoft
mediante el SDK para Kinect; posteriormente, en la siguiente entrada,
nos centraremos en todo el software
relacionado con el sistema de reconocimiento de gestos que hemos integrado y en
la interfaz gráfica que usamos.
Breve descripción del hardware de Kinect
Kinect
es un controlador de videojuegos
desarrollado por Microsoft para la videoconsola XBOX 360. Este controlador
permite al usuario interactuar con la consola sin necesidad de tener contacto
físico, mediante el reconocimiento de gestos, de voz o de imágenes.
El hardware de Kinect
está contenido en una barra horizontal de unos 23 cm de largo, conectado a una
base circular con un eje de articulación. Dispone de un mecanismo de inclinación motorizado que le
permite inclinarse ±27º.
Los sensores que dotan a Kinect de su
funcionalidad son principalmente:
- Sensor de profundidad: Mediante un proyector de infrarrojos y un sensor CMOS monocromático, Kinect puede capturar datos de vídeo en 3D sean cuales sean las condiciones de luz ambiental. Los datos de vídeo tienen una resolución VGA (640x480 píxels) a 11 bits, proporcionando así 2.048 niveles de sensibilidad. Se capturan 30 frames por segundo. Su campo de visión es de unos 57º horizontalmente y 43º verticalmente. Además, puede detectar un rango de 1,2-3,5 metros.
- Cámara de color: Utiliza una resolución VGA (640x480 píxels) a 8 bits
- Un array de 4 micrófonos, con audio representado por 16 bits y enviado a 16 KHz.
Software Development Kit para Kinect
En febrero del 2011, Microsoft lanzó el SDK (Software Development Kit)
oficial para Kinect, gracias al cual se
pueden desarrollar aplicaciones basadas en Kinect
en C++, C# o Visual Basic, utilizando Microsoft
Visual Studio 2010.
Nosotros hemos trabajado con la versión 1.0 del SDK para Kinect. Algunas de las posibilidades que nos ofrece son:
- Acceder a los datos de todos los sensores de Kinect: el de profundidad, la cámara de color y el micrófono.
- Skeletal tracking: la habilidad de detectar la posición de cada una de las partes del cuerpo de una persona situada en el campo de visión del Kinect.
- Técnicas de procesado de audio, como la cancelación de ecos, supresión de ruido o identificación de la fuente de sonido.
- Documentación y código de prueba.
De todas las
funcionalidades de Kinect, la que nos
interesa especialmente a nosotros para el reconocimiento de gestos es el “skeletal
tracking”. Kinect es capaz de
detectar la posición de hasta 20 partes
de nuestro cuerpo mediante el siguiente algoritmo:
- Con el sensor de profundidad, mide la distancia a la que se encuentra la persona que se coloca delante y dibuja de forma rudimentaria un esqueleto de las zonas donde ha detectado presencia.
- El cerebro de Kinect empieza a averiguar cuál es cada parte del cuerpo, basándose en su experiencia reconociendo otros cuerpos y en modelos que lleva implementados. Asigna una serie de probabilidades a los distintos píxels. Por ejemplo, si está seguro de que una zona es el hombro izquierdo, asignará a esos píxels una probabilidad elevada.
- Con este conjunto de probabilidades, dibuja un esqueleto con las partes del cuerpo que ha reconocido, escogiendo la combinación que tiene una mayor probabilidad.
El SDK nos proporciona
métodos para acceder a la posición de cada parte del cuerpo, obtenida a través
de este algoritmo de “skeletal tracking”.
No hay comentarios:
Publicar un comentario