31/12/2010 16:23 El Bruno

[KINECT] HowTo: “Hola Mundo” con C# y Kinect

image

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.

image

 

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.

image

 

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: ,,,,
Comparte este post:

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Saturday, January 01, 2011 9:08 PM by Oskar Alvarez

Bruno, creo que estamos todos haciendo los mismo nos hemos comprado la kinect con la excusa de los hijos, pero la utilizamos para frikear.

Aunque es impresionante la capacidad de nuevas ideas que se te ocurren con este aparatejo, los de primesense han hecho un gran trabajo y van a ser un punto de inflexión en el diseño de interfaces de usuario.

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Sunday, January 02, 2011 10:21 PM by El Bruno

@Oskar ... pues tienes razon, en mi caso la compre porque mi chica quería el juego de bailar, pero al final el cacharro ha terminado conectado más tiempo a mi usb que a la xbox !!!

Salu2 y feliz 2011

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Monday, January 03, 2011 4:23 AM by Waldemar

jajaja!  Estoy de acuerdo con ustedes, Tambien lo compre para disque jugar este fabuloso artefacto con los juegos que ya habia comprado, pero no hicieron mas que sacar los drivers para windows! y Bum! mi kinicet no se ha desconectado de mi PC!  Y mis juegos pues cogiendo polvo en el estante. jajaja!

# [KINECT] HowTo: Detectar un saludo (WAVE) en Kinect con C#

Monday, January 03, 2011 9:01 PM by El Bruno

Buenas, después del primer post sobre como hacer un Hola Mundo para Kinect con C#, hoy toca trabajar

# [KINECT] Posts para comenzar con C# y Kinect utilizando OPenNI y ManagedNite

Wednesday, January 12, 2011 3:04 PM by El Bruno

Buenas, hoy es día de poca inspiración, así que toca una recopilación de los posts que explican como

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Wednesday, February 02, 2011 7:58 PM by KO8E

Felicidades por el blog.

Muy didactico y bien explicado.

Yo ahora estoy dando los primero pasos pero habiendo seguido el manual paso por paso a la hora de inicializar el contexto "  20:             _context.Init();" Me lanza una excepción ManagedNite.XnMException

Seguro que es una tontería de estas "imposibles" de detectar ya que cambiando cosas del proyecto de ejemplo me funciona, pero con el mio propio creado desde 0 no

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Wednesday, February 16, 2011 12:12 PM by Ariel

KO8E tengo el mismo error, lograste solucionarlo??? Buen blog El Bruno =D

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Saturday, April 02, 2011 1:38 AM by Greg

Sorry I don't speak Spanish, but the ManagedNite.XnMException is likely due to the fact that the "/data/openni.xml" file path is not valid in relation to where the executable is being run. For example, if you're using Visual Studio and debugging, you need to put the data folder in the bin/Debug folder of your project.

Hope that helps!

Thanks for the tutorial, too!

-Greg

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Friday, April 29, 2011 4:39 AM by Maven

Hi,

after installed the latest unstable version of NITE, i could not find the ManagedNite.dll in below folders

[Prime Sense \ NITE \ Wrappers \ C # \ Bin \]. I don't even have the related folders.

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Saturday, May 14, 2011 12:42 AM by yeison

en que programa corro tu código y como , te lo agradeceria mucho

# re: [KINECT] HowTo: “Hola Mundo” con C# y Kinect

Monday, June 06, 2011 6:15 AM by matias

visual estudio 2010  ;)