Hola Mundo Kinect

Publicado en

Como muchos de ustedes saben, Kinect es un accesorio para el Microsoft XBox 360 que consiste en una cámara sensible a la profundidad, lo que le permite identificar lo que ve en un contexto de 3 dimensiones. En principio fue pensado como accesorio para videojuegos, pero sus capacidades permiten que también sea un dispositivo útil para otros fines. De hecho, apenas algunos días después de su lanzamiento, comenzaron a aparecer drivers de Kinect creados por desarrolladores independientes. Reconociendo este potencial, Microsoft liberó posteriormente un SDK oficial.

En este artículo vamos a explicar como utilizar el SDK de Kinect para inicializar y mostrar las diferentes cámaras y funciones de reconocimiento de gestos.

Prerrequisitos

Para poder realizar este tutorial es necesario contar con lo siguiente:

• Sensor Microsoft Kinect.
• Cable conversor de puerto KINECT a USB (este cable esta incluido cuando compras el KINECT por separado, para la versión que viene con el Xbox 360 no viene con esta extensión, pero se puede conseguir fácilmente en tiendas de electrónicos).
• Computadora con Microsoft Windows 7 (en sus diferentes versiones) compatible con tarjetas gráficas con Direct X 9.0c
• Microsoft Visual Studio 2010 Express o cualquier edición
• Microsoft .NET Framework 4.

Adicionalmente necesitamos instalar el Kinect SDK, el cual se puede descargar en http://swgu.ru/r3401

Comencemos

Lo primero que hacemos es crear un nuevo proyecto en Visual Studio, el tipo de proyecto que necesitamos es “Aplicación WPF”, nombraremos este proyecto “HelloWorldKinect”.

Posteriormente, en la vista de diseño nos situamos en el código XAML y colocamos dos controles de tipo imagen. El primer control, de preferencia que abarque toda la ventana, lo llamaremos depthImagen y lo utilizaremos para la cámara de profundidad. El segundo control, que llamaremos videoImage, mostrará el contenido de la cámara de video. Éste último podemos hacerlo más pequeño y será más pequeño y lo posicionaremos en la esquina superior derecha.

Para poder utilizar las librerías de Kinect en nuestro proyecto debemos agregar la referencia correspondiente. Para ello, en la pestaña del Explorador de Soluciones hacemos click derecho en la carpeta References, seleccionamos Add Reference y seleccionamos la referencia Microsoft.Research.Kinect.

El código

Para agregar la referencia desde el código de nuestro formulario, vamos a la parte superior de nuestro código donde están los “using” y agregamos Microsoft.Research.Kinect.Nui.

using Microsoft.Research.Kinect.Nui;

Para poder manejar el dispositivo, haremos referencia a este desde una variable de tipo Runtime. Así que debemos declarar dicha variable.

Runtime runtime = new Runtime();

A continuación registramos métodos para manejar los eventos Loaded y Unloaded del control MainWindow, y también registramos métodos para manejar la señal de las dos cámaras de Kinect: la de video y la de profundidad. El listado 1 muestra esto.


Listado 1

En el método MainWindow_Loaded que es la que llamamos cuando se carga el dispositivo, vamos a inicializar el dispositivo y llamar dos rutinas, una para el stream de video (cámara RGB) y otra para el stream de profundidad. El listado 2 muestra esto.


Listado 2

En el método para manejar el evento unloaded, simplemente nos limitamos a cerrar el dispositivo.

Como último código vamos definir los métodos VideoFrameReady y DepthFrameReady que manejan la recepción del video y la profundidad respectivamente. El contenido de ambos métodos es muy similar, con muy ligeras variaciones.

Comenzamos creando una variable de tipo PlanarImage y asignándole el valor del atributo ImageFrame.Image de nuestro argumento, el cual siempre tiene la imagen que está tomando la cámara en ese momento. Después definimos una variable de tipo BitmapSource cuyo valor es construido a partir del stream correspondiente, pasándole como parámetros, el ancho, el alto, los DPI de cada imagen (por defecto son 96), el formato de sus pixeles en lo que la diferencia de que una es RGB o BGR32 para el video y para profundidad daré una paleta de colores gris de 16 bits o Gray16, luego los bits en memoria a partir de la variable image. Por último, en cada método se asigna el BitmapSource que definimos, como valor del atributo del control de imágen que definimos en un inicio, videoImage para el control de video y depthImage para el control de profundidad.


Nuestro código está listo, ahora solo corremos la aplicación presionando F5 y podremos ver en nuestra pantalla la señal capturada por el Kinect.

No se incluye aquí el screenshot de la imagen generada por el sensor de profundidad porque son tonalidades muy obscuras que no se distinguen en la revista impresa, pero te invito a que lo intentes, es algo bastante sencillo.

El código utilizado en este artículo está disponible en http://swgu.ru/ sg3400 Este código prácticamente es el mínimo esencial preestablecido por Microsoft para comenzar a trabajar con el Kinect.

Bio

Hugo Fernández (@hughfernandez) es cofundador y director de CIACOM Systems en Venezuela. Es Microsoft Certified Technology Specialist y se especializa en el desarrollo de aplicaciones web.