11/1/2011 22:10 El Bruno

[KINECT] HowTo: Capturar la posicion de una mano utilizando C# (y ya que estamos movemos el mouse !!!)

image

Buenas,

después de ver cómo capturar diferentes gestos con C# utilizando Kinect (Wave, Circle, Push, Swipe), hoy vamos a utilizar la clase XnMSelectableSlider2D para detectar la posición de una mano una vez iniciada una sesión en Kinect. Como siempre el código es bastante auto descriptivo, ya que una vez instanciada la clase, el evento Slider2DItemHovered() nos brinda un parámetro con la posición X e Y de la mano en cuestión (línea 48).

En este evento y para que la demo no sea tan aburrida, además de mostrar la posición en la consola de pruebas, decidí utilizar la función SetCursorPos de la dll user32.dll para mover el cursor siguiendo los movimientos de la mano. Para esto importé la dll (línea 11) y luego la utilizo en el evento Slider2DItemHovered() para mover el cursor.

Un detalle que podrán ver en el video de demo, los valores del eje X son válidos para mover el cursor horizontalmente, pero para el eje Y, cuando subes o bajas la mano, los valores son inversos, con lo que el mouse no hace lo que debería. Arreglar esto son 5 minutos, pero no quiero “ensuciar” el código … además aquí está la oportunidad de trabajar un poco con este caso Risa

Y por último, la clase XnMSelectableSlider2D en su constructor recibe un valor para X e Y, con el que arma la escala para los valores que se brindan en el evento Slider2DItemHovered(); yo le he pasado la resolución de mi Screen para tener valores coherentes, pero lo recomendable es adaptar estos valores a cada caso.

Este es el código del ejemplo:

   1: using System;
   2: using System.Runtime.InteropServices;
   3: using System.Threading;
   4: using System.Windows;
   5: using ManagedNite;
   6:  
   7: namespace HandTracking
   8: {
   9:     class Program
  10:     {
  11:         [DllImport("user32.dll", SetLastError = true)]
  12:         [return: MarshalAs(UnmanagedType.Bool)]
  13:         public static extern bool SetCursorPos(int x, int y);
  14:  
  15:         private static XnMOpenNIContext _context;
  16:         private static XnMSessionManager _sessionManager;
  17:         private static XnMSelectableSlider2D _slider2D;
  18:         private static Thread _readerThread;
  19:         private static bool _shouldRun;
  20:  
  21:         static void Main()
  22:         {
  23:             Console.WriteLine("Iniciando acceso a Kinect ...");
  24:             _shouldRun = true;
  25:  
  26:             InitSensorInteraction();
  27:             InitThreadReader();
  28:  
  29:             Console.WriteLine("Kinect online. Saluda para comenzar");
  30:             Console.ReadLine();
  31:             _shouldRun = false;
  32:         }
  33:  
  34:  
  35:         #region Sensor Interaction
  36:         private static void InitSensorInteraction()
  37:         {
  38:             _context = new XnMOpenNIContext();
  39:             _context.Init();
  40:  
  41:             _sessionManager = new XnMSessionManager(_context, "Wave", "RaiseHand");
  42:             _slider2D = new XnMSelectableSlider2D((int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight);
  43:             _slider2D.ItemHovered += Slider2DItemHovered;
  44:             
  45:             _sessionManager.AddListener(_slider2D);
  46:         }
  47:  
  48:         static void Slider2DItemHovered(object sender, SelectableSlider2DHoverEventArgs e)
  49:         {
  50:             Console.WriteLine("X: " + e.X + " Y: " + e.Y);
  51:             SetCursorPos(e.X, e.Y);
  52:         }
  53:  
  54:         #endregion
  55:  
  56:         #region Update Thread
  57:         private static void InitThreadReader()
  58:         {
  59:             _readerThread = new Thread(ReaderThread);
  60:             _readerThread.Start();
  61:         }
  62:         private static void ReaderThread()
  63:         {
  64:             while (_shouldRun)
  65:             {
  66:                 var rc = _context.Update();
  67:                 if (rc == 0)
  68:                     _sessionManager.Update(_context);
  69:             }
  70:         }
  71:         #endregion
  72:     }
  73: }

El código lo pueden descargar desde

Saludos @ Home

El Bruno

   

Archivado en: ,,,,
Comparte este post:

# [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: Capturar la posicion de una mano utilizando C# (y ya que estamos movemos el mouse !!!)

Friday, January 14, 2011 12:17 PM by Eduard Tomàs i Avellana

O sea que... tantos posts para terminar moviendo el mouse con la mano!!! :P No estamos avanzando nada!

Es borma evidentemente: Bruno tio, estás haciendo una gran serie! ;-)

# re: [KINECT] HowTo: Capturar la posicion de una mano utilizando C# (y ya que estamos movemos el mouse !!!)

Wednesday, April 06, 2011 4:46 PM by Ernesto

¡Hola!

Oye ¿podrías hacer un howto de como detectar personas?

Te lo agradecería mucho. :)

# re: [KINECT] HowTo: Capturar la posicion de una mano utilizando C# (y ya que estamos movemos el mouse !!!)

Monday, April 11, 2011 8:26 AM by El Bruno

@Ernesto, pues la verdad que no puedo :(

Kinect no está abierto a eso todavia, aunque si procesas las imágenes, lo podrías hacer.

Salu2

# re: [KINECT] HowTo: Capturar la posicion de una mano utilizando C# (y ya que estamos movemos el mouse !!!)

Tuesday, April 24, 2012 9:56 PM by erwin_352

hola bruno me puedes ayudar con esta aplicacion pero con el sdk del kinect el ultimo que a sido lierado  por favor