[#KINECT] HowTo: Eliminar el fondo conservando un body con el nuevo #KinectSdk

image

Buenas,

en el post de ayer comenté que una de las novedades del Kinect SDK 1.8 es la capacidad de poder eliminar el fondo de la imagen que nos dá la cámara del sensor kinect preservando el cuerpo de una persona.

Para ver cómo funciona esta new feature, veamos el ejemplo “Background Removal Basis-WPF” incluido en el Kinect SDK Developer Toolkit.

image

Una vez descargado el código fuente de este ejemplo, vemos que el mismo utiliza 2 dlls externas., compiladas para x86 y x64. Estas dlls están creadas con C++ (también se puede acceder al source code de las mismas) y poseen un wrapper .net, que podemos ver como una referencia: Microsoft.Kinect.Toolkit.BackgroundRemoval

image

Veamos un poco el código necesario para hacer funcionar esta app. Lo primero que debemos hacer es declarar una variable de tipo BackgroundRemovedColorStream.

   1: /// <summary>

   2: /// Our core library which does background 

   3: /// </summary>

   4: private BackgroundRemovedColorStream backgroundRemovedColorStream;

Luego, cuando se detecta un sensor Kinect, es momento de incializar esta variable. En este caso, teniendo en cuenta los valores con los que se han inicializado la camara y en sensor de profundidad:

   1: this.backgroundRemovedColorStream = new BackgroundRemovedColorStream(args.NewSensor);

   2: this.backgroundRemovedColorStream.Enable(ColorFormat, DepthFormat);

Nota: Este paso de parámetros es un poco redundantes, el propio sensor ya posee esta información. Sugerencia subida para el equipo de Kinect.

Nos suscribimos al evento de “cambio de fondo”

   1: // Add an event handler to be called when the background removed color frame is ready, so that we can

   2: // composite the image and output to the app

   3: this.backgroundRemovedColorStream.BackgroundRemovedFrameReady += this.BackgroundRemovedFrameReadyHandler;

Y listo. Ahora solo queda revisar el código de este manejador para el evento. Lo 1ro que vemos es que tememos un objeto del tipo BackgroundRemovedStream al que podemos acceder (línea 3). A continuación podemos trabajar con la imagen que queremos utilizar de fondo con un par de líneas agregar delante de la misma los bodys que ha detectado el sensor Open-mouthed smile

   1: private void BackgroundRemovedFrameReadyHandler(object sender, BackgroundRemovedColorFrameReadyEventArgs e)

   2: {

   3:     using (var backgroundRemovedFrame = e.OpenBackgroundRemovedColorFrame())

   4:     {

   5:         if (backgroundRemovedFrame != null)

   6:         {

   7:             if (null == this.foregroundBitmap || this.foregroundBitmap.PixelWidth != backgroundRemovedFrame.Width 

   8:                 || this.foregroundBitmap.PixelHeight != backgroundRemovedFrame.Height)

   9:             {

  10:                 this.foregroundBitmap = new WriteableBitmap(backgroundRemovedFrame.Width, backgroundRemovedFrame.Height, 96.0, 96.0, PixelFormats.Bgra32, null);

  11:  

  12:                 // Set the image we display to point to the bitmap where we'll put the image data

  13:                 this.MaskedColor.Source = this.foregroundBitmap;

  14:             }

  15:  

  16:             // Write the pixel data into our bitmap

  17:             this.foregroundBitmap.WritePixels(

  18:                 new Int32Rect(0, 0, this.foregroundBitmap.PixelWidth, this.foregroundBitmap.PixelHeight),

  19:                 backgroundRemovedFrame.GetRawPixelData(),

  20:                 this.foregroundBitmap.PixelWidth * sizeof(int),

  21:                 0);

  22:         }

  23:     }

  24: }

 

Saludos @ Home

El Bruno

image image image Google

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *