[#KINECTONE] HowTo: Pintar un Body con #KinectSdk V2

Hola!

Para cerrar la serie de cosas básicas que podemos hacer con el KinectSdk V2 y con el nuevo KinectOne, hoy toca escribir un poco sobre cómo hacemos para “pintar un body”o lo que antes llamábamos un skeleton.

Al igual que en los ejemplos anteriores, debemos crear un Reader del tipo BODYREADER, inicializar el mismo y suscribirnos al evento FrameArrived. En el mismo luego

  • un par de null validations
  • obtenemos el frame del feed de Body
  • actualizamos el array de bodies (recuerda que con el KinectOne, podemos seguir hasta 6 bodies simultáneamente!)
  • para cada body accedemos a su colección de Joints y pintamos los mismos
   1: void BodyReaderFrameArrived(object sender, BodyFrameArrivedEventArgs 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:             using (var dc = _drawingGroup.Open())

  11:             {

  12:                 dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, _displayWidth, _displayHeight));

  13:  

  14:                 frame.GetAndRefreshBodyData(_bodies);

  15:  

  16:                 foreach (var body in _bodies.Where(body => body.IsTracked))

  17:                 {

  18:                     DrawClippedEdges(body, dc);

  19:  

  20:                     var joints = body.Joints;

  21:  

  22:                     // convert the joint points to depth (display) space

  23:                     var jointPoints = new Dictionary<JointType, Point>();

  24:                     foreach (var jointType in joints.Keys)

  25:                     {

  26:                         var depthSpacePoint = _coordinateMapper.MapCameraPointToDepthSpace(joints[jointType].Position);

  27:                         jointPoints[jointType] = new Point(depthSpacePoint.X, depthSpacePoint.Y);

  28:                     }

  29:  

  30:                     DrawBody(joints, jointPoints, dc);

  31:                     DrawHand(body.HandLeftState, jointPoints[JointType.HandLeft], dc);

  32:                     DrawHand(body.HandRightState, jointPoints[JointType.HandRight], dc);

  33:                 }

  34:  

  35:                 // prevent drawing outside of our render area

  36:                 _drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, _displayWidth, _displayHeight));

  37:             }

  38:         }

  39:     }

  40:     catch { }

  41: }

El detalle más interesante a tener en cuenta está en las líneas 23 a 28, donde el SDK ya nos dá un objeto que nos ayuda a coordinar la posición espacial de los joints con respecto a la información de profundidad de los mismos. En las diferentes versiones del KinectSdk esta rutina ha ido mejorando y con la V2 creo que la han dejado en un modo my simple y fácil de utilizar.

Otro punto a tener en cuenta es que ahora con la capacidad de detectar el estado de la mano, ya podemos cambiar el clásico SKELETON para que sea un poco más divertido. Les dejo un video de ejemplo

Disclaimer:

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

Saludos @ Cordoba, tierra de asados, amigos y guitarreadas

El Bruno

image image image Google

One thought on “[#KINECTONE] HowTo: Pintar un Body 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.