[#KINECTONE] HowTo: Capturar y mostrar el feed de la camara del sensor con #KinectSdk v2

Hola!

Esta semana pondré un par de posts sobre el Kinect SDK v2 en los que sentaré las bases para los futuros ejemplos. Hoy toca mostrar como está organizado el SDK para capturar y mostrar el feed de la cámara del sensor.

Lo primero que vemos es que necesitamos trabajar con un elemento de tipo ColorFrameDescription (línea 14) donde se almancena la información relacionada con la cámara. Luego abrimos el reader de color de la cámara (línea 16) y también inicializamos un Bitmap (línea 18) que es el que está bindado a una Image de WPF.

   1: public MainWindow()

   2: {

   3:     _kinectSensor = KinectSensor.Default;

   4:     if (_kinectSensor != null)

   5:     {

   6:         _kinectSensor.Open();

   7:  

   8:         // get the coordinate mapper

   9:         _coordinateMapper = _kinectSensor.CoordinateMapper;

  10:         _bodies = new Body[_kinectSensor.BodyFrameSource.BodyCount];

  11:         _bodyReader = _kinectSensor.BodyFrameSource.OpenReader();

  12:  

  13:         // open the color reader for the color frames

  14:         var colorFrameDescription = _kinectSensor.ColorFrameSource.FrameDescription;

  15:  

  16:         _colorReader = _kinectSensor.ColorFrameSource.OpenReader();

  17:         _pixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * _bytesPerPixel];

  18:         _colorBitmap  = new WriteableBitmap(colorFrameDescription.Width, colorFrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);

  19:  

  20:         StatusText = "start";

  21:     }

  22:     else

  23:     {

  24:         // on failure, set the status text

  25:         StatusText = "something goes wrong";

  26:     }

  27:     Loaded += MainWindow_Loaded;

  28:     Closing += MainWindow_Closing;

  29:     DataContext = this;

  30:     InitializeComponent();

  31: }

En el Load de la View nos suscribimos al evento de actualización del Reader y en el mismo agregamos el sigui3ente código:

   1: void ColorReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)

   2: {

   3:     var frameReference = e.FrameReference;

   4:     try

   5:     {

   6:         var frame = frameReference.AcquireFrame();

   7:         if (frame == null) return;

   8:         using (frame)

   9:         {

  10:             var frameDescription = frame.FrameDescription;

  11:  

  12:             Debug.WriteLine("frame width:" + frameDescription.Width + " bitmap pixel width:" + _colorBitmap.PixelWidth);

  13:             Debug.WriteLine("frame height:" + frameDescription.Height + " bitmap pixel height:" + _colorBitmap.PixelHeight);

  14:  

  15:             if ((frameDescription.Width == _colorBitmap.PixelWidth) && (frameDescription.Height == _colorBitmap.PixelHeight))

  16:             {

  17:                 if (frame.RawColorImageFormat == ColorImageFormat.Bgra)

  18:                 {

  19:                     frame.CopyRawFrameDataToArray(_pixels);

  20:                 }

  21:                 else

  22:                 {

  23:                     frame.CopyConvertedFrameDataToArray(_pixels, ColorImageFormat.Bgra);

  24:                 }

  25:  

  26:                 _colorBitmap.WritePixels(

  27:                     new Int32Rect(0, 0, frameDescription.Width, frameDescription.Height),

  28:                     _pixels,

  29:                     frameDescription.Width * _bytesPerPixel,

  30:                     0);

  31:             }

  32:         }

  33:     }

  34:     catch (Exception)

  35:     {

  36:         // ignore if the frame is no longer available

  37:     }

  38: }

La sintaxis es batante clara, los pasos que seguimos en este punto son los siguientes

  • Solicitamos el frame y validamos que el mismo no sea nulo
  • Verificamos que el tamaño del frame coincida con el bitmap que creamos en el paso anterior
  • Copiamos el array de bits de la imagen a Bitmap asociado con un IMAGE en WPF
  • Done!

Comparado con la versión 1.X del KinectSdk la verdad que es bastante diferente. No estoy en posición de opinar sobre que versión es mejor, aunque creo que la V2 es más simple cuando se trabaja con varios aspectos del sensor al mismo tiempo, por ejemplo con body count y camara.

A seguir de vacaciones !!!

Disclaimer:

“This is preliminary software and/or hardware and APIs are preliminary and subject to change

Saludos @ Home en Córdoba

El Bruno

image image image Google

One thought on “[#KINECTONE] HowTo: Capturar y mostrar el feed de la camara del sensor con #KinectSdk v2

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.