31/12/2010 16:23
El Bruno
[KINECT] HowTo: “Hola Mundo” con C# y Kinect

Buenas,
ayer mostré como instalar los drivers para poder acceder al Kinect en un ordenador con Windows, pues hoy toca mostrar como podemos hacer el “hola mundo” con las bibliotecas de OpenNI y NITE de PrimeSense. Antes de comenzar a tirar una línea, asumo que todos se leerán los contratos de licencia y distribución para estas bibliotecas, así que … al tutorial.
Tutorial
1. En primer lugar, conseguite un #Kinect. Yo te presto el mío, pero viene con el Valentino de regalo.
2. Asegurate que dentro del Device Manager se reconoce correctamente los drivers para la cámara y el motor. Dale un vistazo a mi post de ayer.

3. Para este ejemplo crearemos una nueva aplicación de Consola. Yo me he jugado con el nombre y le he puesto “ConsoleApplication01”.
4. Agregamos una referencia a [ManagedNite.dll], que es la biblioteca que nos permitirá interactuar con el Kinect. Este ensamblado se encuentra el directorio de instalación de NITE, usualmente en [Prime Sense\NITE\Wrappers\C#\Bin\]
5. Agregamos un archivo de configuración de aplicación [App.Config] para poder utilizar el ensamblado [ManagedNite.dll], con la siguiente configuración dentro:
1: <?xml version="1.0" encoding="utf-8"?>
2: <configuration>
3: <startup useLegacyV2RuntimeActivationPolicy="true">
4: <supportedRuntime version="v4.0" />
5: </startup>
6: </configuration>
6. Agregamos un directorio llamado [Data] y dentro del mismo un archivo xml llamado [openni.xml]. Este archivo contiene la información de configuración para acceder a los servicios del Kinect. Como tiene bastante texto, mejor lo miras en el archivo adjunto.
7. Modificamos la aplicación con el siguiente código:
1: using System;
2: using System.Threading;
3: using ManagedNite;
4:
5: namespace ConsoleApplication1
6: {
7: class Program
8: {
9: private static XnMOpenNIContext _context;
10: private static Thread _readerThread;
11: private static XnMSessionManager _sessionManager;
12: private static bool _shouldRun;
13: private static bool _waveDetected;
14:
15: static void Main()
16: {
17: Console.WriteLine("Iniciando acceso a Kinect ...");
18: _shouldRun = true;
19: _context = new XnMOpenNIContext();
20: _context.Init();
21:
22: _sessionManager = new XnMSessionManager(_context, "Wave", "RaiseHand");
23: _sessionManager.FocusStartDetected += SessionManagerFocusStartDetected;
24:
25: _readerThread = new Thread(ReaderThread);
26: _readerThread.Start();
27:
28: Console.WriteLine("Kinect online. Saluda para comenzar");
29: Console.WriteLine();
30: Console.ReadLine();
31: }
32:
33: static void SessionManagerFocusStartDetected(object sender, FocusStartEventArgs e)
34: {
35: if (!_waveDetected)
36: {
37: Console.WriteLine("Saludo detectado :D");
38: Console.WriteLine("Saluda de nuevo para cerrar la aplicación");
39: Console.WriteLine();
40: _waveDetected = true;
41: }
42: else
43: {
44: Console.WriteLine("Kinect offline. Puedes cerrar la consola");
45: _shouldRun = false;
46: _context.Close();
47: _readerThread.Abort();
48: Thread.CurrentThread.Abort();
49: }
50: }
51:
52: private static void ReaderThread()
53: {
54: while (_shouldRun)
55: {
56: var rc = _context.Update();
57: if (rc == 0)
58: _sessionManager.Update(_context);
59: }
60: }
61: }
62: }
8. Ejecutamos la aplicación, y podremos ver como la misma, se conecta al Kinect; y cuando saludamos al Kinect, se muestra un mensaje y luego con otro saludo se cierra la aplicación.

9. Los puntos interesantes a tener en cuenta en la aplicación son los siguientes:
- Las líneas 19 y 20, inician un contexto de trabajo con Kinect. Para esto se utiliza la clase XnMOpenNIContext. En el método Init() es donde se accede al fichero de configuración [data/openni.xml] para ver la configuración de acceso a Kinect.
- Las líneas 22 y 23, crean una nueva sesión que responderá a la acción [WAVE], es decir cuando se salude al Kinect.
- En las líneas 25 y 26, utilizamos un Thread para reestablecer el acceso al contexto del Kinect y refrescarlo periódicamente.
- En la línea 33 se trabaja el evento [FocusStart] de la sesión. Es en esta sección donde se controla el saludo y se cierra la aplicación.
El código se puede descargar desde http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2010%2012%2031%20Kinect%20Hola%20mundo.zip
Saludos @ Home
El Bruno

Archivado en: Visual Studio 2010,HowTo,Code Sample,Tutorial,Kinect
Comparte este post: