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
Leave a comment