Desarrolla Apps con Kinect V2

Publicado en

Cuando se popularizaron las computadoras personales hace cerca de 30 años, el teclado y el ratón se convirtieron en objetos cotidianos para poder trabajar con procesadores de texto, hojas de cálculo y juegos de escritorio. Con la aparición de dispositivos touch como smartphones, tabletas y computadoras el uso de esta tecnología se volvió más natural e intuitiva, sólo basta observar cómo niños y adultos son capaces de utilizarlos sin esfuerzo. Las interfaces naturales de usuario están cambiando la manera en que  interactuamos con los dispositivos de cómputo.

Las interfaces naturales de usuario (natural user interfaces, NUI) son aquellas que permiten interactuar con un sistema o aplicación sin necesidad de utilizar dispositivos intermedios —como serían un ratón, teclado, lápiz óptico o touchpad. Es decir que interactuamos con el dispositivo de la misma manera que lo hacemos con otros humanos —mediante la voz y movimientos corporales.

Kinect: Innovando las NUI

Kinect ha sido parte de esta revolución, y está innovando en el uso de las NUI no solo para el entretenimiento sino en todo tipo de ámbitos.

Desde su primera versión, Kinect cuenta con las siguientes características:

  • Una cámara que puede ver en 3D gracias a los sensores de profundidad que recolectan la información de los rayos infrarrojos.
  • Una videocámara tradicional RGB.
  • Un arreglo de 4 micrófonos ubicados en la parte inferior para detectar la dirección de donde provienen los sonidos y reconocimiento de voz.
  • Un sistema que reconoce si una persona está enfrente del sensor y la posición de su cuerpo a través de la creación de un esqueleto virtual.

Kinect ha logrado mejoras en diferentes áreas como medicina, educación y sistemas de rehabilitación. Por ejemplo, los médicos pueden interactuar con radiografías mediante gestos dentro de los quirófanos (ver figura 2). También se han desarrollado terapias con el sensor para ayudar a niños a desarrollar sus capacidades motrices y de lenguaje.

Figura 1. Kinect en la medicina

Mejoras en la versión 2

Con la salida de la consola Xbox One, Microsoft liberó en julio de 2014 las nuevas herramientas de desarrollo para la versión 2 del sensor Kinect, lo que mejoró sustancialmente sus capacidades de reconocimiento. Entre las mejoras destacan:

  • Un campo de visión más amplio, tanto horizontal como vertical, se eliminó la necesidad de tener un motor para el ajuste de altura, ya que se modificó la tecnología de infrarrojos.
  • La fidelidad en los datos de profundidad se incrementó al triple. También mejoró el rango de profundidad que se puede cubrir, desde 50 cm hasta 8 metros.
  • La cámara de color ahora es full HD y funciona a 30 cuadros por segundo.
  • Ahora se cuenta con 25 uniones en el esqueleto y soporta simultáneamente el seguimiento de hasta seis personas, con correcciones especialmente en las uniones de la cadera, hombros y columna vertebral. Ver Figura 3.
  • Se agregó un reconocimiento especial del pulgar para saber si la mano está cerrada o abierta.

Cómo desarrollar apps con Kinect

El SDK 2.0 para el Kinect ya se encuentra disponible de forma gratuita para que puedas aprender a construir apps que aprovechen esta tecnología. Actualmente el SDK se encuentra en una versión de “preview” que todavía no permite publicar las apps en el Windows Store, pero se espera que antes de que termine el año se libere la versión final del SDK que permitirá publicar al Windows Store.

Para desarrollar aplicaciones con Kinect v2, además de contar con el sensor Kinect requieres una computadora con las siguientes características de hardware y software:

  • Procesador dual-core de 3.1 Ghz o más
  • 4 GB de RAM o más
  • Tarjeta gráfica con soporte para DirectX 11
  • Puerto USB 3.0
  • Sistema Operativo Windows 8/8.1
  • Visual Studio 2012/2013
  • .NET Framework 4.5
  • SDK Kinect para Windows V2. Descargar en http://bit.ly/SDKKinect

La figura 2 muestra la arquitectura de APIs del Kinect v2.  

Figura 2. Arquitectura de Kinect para Windows

El sensor Kinect compone la capa de más bajo nivel, pues es el hardware contiene los sensores y cámaras. La capa siguiente son los controladores que permiten digitalizar los datos de los sensores que posibilitan su programación.

El runtime funciona como conexión entre la información que proporciona el hardware de Kinect y las diferentes APIs. Con esto es posible soportar una gran gama de lenguajes de programación en donde sólo necesitamos interactuar con esta capa.

En el nivel más alto se construyen las APIs, por lo que se logra tener una para cada tipo de desarrollo: apps desktop nativas o con .NET, o apps para Windows Store utilizando WinRT y lenguajes de programación como C#, Visual Basic, JavaScript y C++ con XAML.

Desarrolla tu primera aplicación con Kinect utilizando C# y Visual Studio

Lo primero es crear un proyecto en Visual Studio. Se elige la plantilla en blanco de Windows Store App y le asignamos un nombre.   

Una vez que se ha generado el proyecto, en el explorador de soluciones hacemos clic derecho en la solución que acabamos de crear y seleccionamos Properties. En la ventana que se abre, elegimos Configuration Properties y cambiamos la plataforma de compilación a x86. Ver Figura 3.

Figura 3. Plataforma de compilación

Ahora necesitamos agregar la referencia de Kinect a nuestro proyecto. Hacemos clic derecho sobre la carpeta de References y enseguida Add Reference. Dentro de la ventana que abre, seleccionamos en Windows 8.1 la opción de Extensions y elegimos KinectPreview.Kinect. Ver Figura 4.

Figura 4. Referencia de Kinect a nuestro proyecto

El último cambio que debemos hacer a la configuración de nuestro proyecto es habilitar las capacidades de la aplicación. Abrimos el archivo Package.appxmanifiest y en la pestaña Capabilities seleccionamos Microphone y Webcam.

Figura 5. Habilitar capacidades de micrófono y webcam

Ahora comenzaremos a programar la aplicación. Abrimos el archivo MainPage.xaml para agregar una imagen dentro del Grid donde se mostrará la información de la cámara infrarroja.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
 <Image Name="image" Width="512" Height="424"></Image>
</Grid>

En el MainPage.xaml.cs definimos las bibliotecas que usaremos para el manejo de la imagen y los datos de Kinect.

using Windows.UI.Xaml.Media.Imaging;
using WindowsPreview.Kinect;

A continuación se declaran los objetos que utilizaremos: un objeto KinectSensor para comunicarnos con el Kinect; InfraredFrameReader y un arreglo de ushorts para leer los datos del infrarrojo y guardarlos respectivamente; un arreglo de bytes para almacenar el color de cada pixel de la imagen que pondremos en un objeto WriteableBitmap.

KinectSensor sensor;
InfraredFrameReader irReader;
ushort[] irData;
byte[] irDataConverted;
WriteableBitmap irBitmap;

Dentro del constructor, agregamos un método al evento Loaded de la clase.

public MainPage() {
. . .
this.Loaded += MainPage_Loaded;
}

En el método MainPage_Loaded creamos una nueva instancia del sensor, una instancia para el lector de infrarrojo y un objeto FrameDescription que nos permita saber la longitud en pixeles de la información infrarroja. Con este dato, inicializamos el arreglo de ushorts y el arreglo de bytes multiplicándolo por cuatro para almacenar la información en formato RGBA.

Para la inicialización del mapa de bits usamos el ancho y el alto de la imagen que se captura con la cámara infrarroja. Ligamos la fuente de la imagen del xaml con nuestro mapa de bits para poder actualizarla con los datos del sensor. Se abre la instancia del sensor Kinect para usarse, y por último hacemos el vínculo del método al evento FrameArrived que se ejecutará cada vez que un cuadro de la imagen sea recibido.

void MainPage_Loaded(object sender, RoutedEventArgs e) {
 sensor = KinectSensor.GetDefault();
 irReader = sensor.InfraredFrameSource.OpenReader();
 FrameDescription fd = sensor.InfraredFrameSource.FrameDescription;
 irData = new ushort[fd.LengthInPixels];
 irDataConverted = new byte[fd.LengthInPixels*4];
 irBitmap = new WriteableBitmap(fd.Width, fd.Height);
 image.Source = irBitmap;
 sensor.Open();
 irReader.FrameArrived +=irReader_FrameArrived;
}

Dentro del nuevo método obtenemos el cuadro de la imagen del infrarrojo mediante el parámetro args utilizando FrameReference.AcquireFrame(). Verificamos si el InfraredFrame es distinto de nulo; si lo es, copiamos su información al arreglo de ushorts irData, iteramos sobre el arreglo y por cada dato realizamos un corrimiento de bits para obtener el byte más significativo. Con esto asignamos una intensidad que permitirá realizar una imagen a escala de grises dentro del arreglo irDataConverted, dejando el canal alfa en 255 para tener una imagen opaca. Finalmente, copiamos el arreglo de bytes resultante al PixelBuffer de irBitmap e invalidamos la información forzando la aplicación a redibujar la imagen en nuestra app.

void irReader_FrameArrived(InfraredFrameReader sender, InfraredFrameArrivedEventArgs args) {
 using (InfraredFrame irFrame =
        args.FrameReference.AcquireFrame())    {
   if (irFrame != null) {
     irFrame.CopyFrameDataToArray(irData);
     for (int i = 0; i < irData.Length; i++) {
       byte intensity = (byte)(irData[i] >> 8);
       irDataConverted[i * 4] = intensity;
       irDataConverted[i * 4 + 1] = intensity;
       irDataConverted[i * 4 + 2] = intensity;
       irDataConverted[i * 4 + 3] = 255;//alfa
     }
     irDataConverted.CopyTo(irBitmap.PixelBuffer);
     irBitmap.Invalidate();                    
   }
 }
}

Estamos listos para ejecutar la aplicación en la máquina local y ver nuestra aplicación. La app mostrará en pantalla el flujo de datos que el sensor infrarrojo del Kinect está obteniendo, tal como se muestra en la figura 6.

Figura 6. App ejecutándose

El proyecto completo de Visual Studio con este ejemplo y contenido extra se encuentra disponible para descarga en http://swgu.ru/tutorial-kinect  

Referencias

 

Bio

Laura Frias Carrillo (@lauriutz) es Technical Evangelist en el equipo de Divulgación Tecnológica en Microsoft México. Se especializa en el desarrollo de apps para Windows Phone, Windows 8 y Kinect para Windows. Laura es orgullosa egresada de la Facultad de Ciencias, UNAM. http://blogs.msdn.com/b/laurafrias