9/1/2011 21:00 El Bruno

[KINECT] HowTo:Detectar un Swipe con C# (y si, ahora puse un video para que lo vean !!!)

image

Buenas,

si has visto Minority Report, seguramente te habrás dado cuenta que unas de las acciones más usuales que podemos hacer con la mano es un SWIPE (que es algo así como darle una cachetada/bofetada al aire). Pues bien, utilizando OpenNI y ManagedNite podemos capturar este tipo de acciones con la clase XnMSwipeDetector. La misma nos permite capturar una acción de SWIPE, y además ver la dirección de la misma (Left, Right, Top, Down) y otros valores como el ángulo y la velocidad del SWIPE. El siguiente video muestra un ejemplo de la captura del Kinect y de la captura de acciones de SWIPE.

Disclaimer: si no queres que te queden los ojos como las cámaras del kinect, te recomiendo ver el video FullScreen en alta definición.

 

El siguiente código es el ejemplo de la aplicación de consola. En la misma podemos ver como desde las líneas 44 a 67 se capturan los eventos del tipo SWIPE y se muestra la información de los mismos. Un detalle a tener en cuenta es que si bien existe un evento llamado GeneralSwipe, en el que se capturan todos los tipos de Swipe, el mismo no brinda información sobre la velocidad y el ángulo del SWIPE, para acceder a esta información es necesario capturar los 4 tipos diferentes de SWIPE en sus eventos correspondientes.

   1: using System;
   2: using System.Threading;
   3: using ManagedNite;
   4:  
   5: namespace DetectingSwipe
   6: {
   7:     class Program
   8:     {
   9:         private static XnMOpenNIContext _context;
  10:         private static XnMSessionManager _sessionManager;
  11:         private static XnMSwipeDetector _swipeDetector;
  12:         private static Thread _readerThread;
  13:         private static bool _shouldRun;
  14:  
  15:         static void Main()
  16:         {
  17:             Console.WriteLine("Iniciando acceso a Kinect ...");
  18:             _shouldRun = true;
  19:  
  20:             InitSensorInteraction();
  21:             InitThreadReader();
  22:  
  23:             Console.WriteLine("Kinect online. Saluda para comenzar");
  24:             Console.ReadLine();
  25:             _shouldRun = false;
  26:         }
  27:  
  28:         #region Sensor Interaction
  29:         private static void InitSensorInteraction()
  30:         {
  31:             _context = new XnMOpenNIContext();
  32:             _context.Init();
  33:  
  34:             _sessionManager = new XnMSessionManager(_context, "Wave", "RaiseHand");
  35:             _swipeDetector = new XnMSwipeDetector();
  36:             _swipeDetector.SwipeDown +=SwipeDetectorSwipeDown;
  37:             _swipeDetector.SwipeLeft += SwipeDetectorSwipeLeft;
  38:             _swipeDetector.SwipeRight += SwipeDetectorSwipeRight;
  39:             _swipeDetector.SwipeUp += SwipeDetectorSwipeUp;
  40:             _swipeDetector.GeneralSwipe += SwipeDetectorGeneralSwipe;
  41:             _sessionManager.AddListener(_swipeDetector);
  42:         }
  43:  
  44:         static void SwipeDetectorGeneralSwipe(object sender, SwipeDetectorGeneralEventArgs e)
  45:         {
  46:             Console.WriteLine("General Swipe. Direction: {0} Angle: {1} Velocity: {2}", e.SelectDirection, e.Angle, e.Velocity);
  47:         }
  48:  
  49:         static void SwipeDetectorSwipeUp(object sender, SwipeDetectorEventArgs e)
  50:         {
  51:             Console.WriteLine("SwipeUp. Angle: {0} Velocity: {1}", e.Angle, e.Velocity);
  52:         }
  53:  
  54:         static void SwipeDetectorSwipeRight(object sender, SwipeDetectorEventArgs e)
  55:         {
  56:             Console.WriteLine("SwipeRight. Angle: {0} Velocity: {1}", e.Angle, e.Velocity);
  57:         }
  58:  
  59:         static void SwipeDetectorSwipeLeft(object sender, SwipeDetectorEventArgs e)
  60:         {
  61:             Console.WriteLine("SwipeLeft. Angle: {0} Velocity: {1}", e.Angle, e.Velocity);
  62:         }
  63:  
  64:         static void SwipeDetectorSwipeDown(object sender, SwipeDetectorEventArgs e)
  65:         {
  66:             Console.WriteLine("SwipeDown. Angle: {0} Velocity: {1}", e.Angle, e.Velocity);
  67:         }
  68:  
  69:  
  70:         #endregion
  71:  
  72:         #region Update Thread
  73:         private static void InitThreadReader()
  74:         {
  75:             _readerThread = new Thread(ReaderThread);
  76:             _readerThread.Start();
  77:         }
  78:         private static void ReaderThread()
  79:         {
  80:             while (_shouldRun)
  81:             {
  82:                 var rc = _context.Update();
  83:                 if (rc == 0)
  84:                     _sessionManager.Update(_context);
  85:             }
  86:         }
  87:         #endregion
  88:     }
  89: }

 

Como siempre el código de la aplicación se puede descargar desde –> http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2011%2001%2009%20Kinect%20DetectingSwipe.zip

 

Saludos @ Home

El Bruno

   

Archivado en: ,,,,
Comparte este post:

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

Tuesday, January 11, 2011 10:10 PM by El Bruno

Buenas, después de ver cómo capturar diferentes gestos con C# utilizando Kinect ( Wave , Circle , Push

# [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