Search code examples
c#wpfxamlkinect

Kinect V2 SDK 2.0 Basics, Drawing the bones of the skeleton?


Okay, I am pretty new to Kinect, I have the joints tracked and drawn however I cannot for the life of me draw the bones between each joint.

I have this code which will draw the joints of the skeleton

 private void DrawBody(Body body) //takes body as argument
    {
        // Draw points
        foreach (JointType type in body.Joints.Keys)
        {
            // Draw all the body joints
            switch (type)
            {
                case JointType.Head:
                case JointType.FootLeft:
                case JointType.FootRight:
                    DrawJoint(body.Joints[type], 20, Brushes.Yellow, 2, Brushes.White);
                    break;
                case JointType.ShoulderLeft:
                case JointType.ShoulderRight:
                case JointType.HipLeft:
                case JointType.HipRight:
                     DrawJoint(body.Joints[type], 20, Brushes.YellowGreen, 2, Brushes.White);
                    break;
                case JointType.ElbowLeft:
                case JointType.ElbowRight:
                case JointType.KneeLeft:
                case JointType.KneeRight:
                    DrawJoint(body.Joints[type], 15, Brushes.LawnGreen, 2, Brushes.White);
                    break;
                case JointType.HandLeft:
                    DrawHandJoint(body.Joints[type], body.HandLeftState, 20, 2, Brushes.White);
                    break;
                case JointType.HandRight:
                    DrawHandJoint(body.Joints[type], body.HandRightState, 20, 2, Brushes.White);
                    break;
                default:
                    DrawJoint(body.Joints[type], 15, Brushes.RoyalBlue, 2, Brushes.White);
                    break;
            }                

        }         
    }

My DrawJoint Function:

   private void DrawJoint(Joint joint, double radius, SolidColorBrush fill, double borderWidth, SolidColorBrush border)
    {
        //If Joint not tracked  then return Joint
        if (joint.TrackingState != TrackingState.Tracked) return;

        // Map the CameraPoint to ColorSpace so they match
        ColorSpacePoint colorPoint = kinectSensor.CoordinateMapper.MapCameraPointToColorSpace(joint.Position);

        // Create the UI element based on the parameters
        Ellipse El = new Ellipse();
        El.Fill = fill;
        El.Stroke = border;
        El.StrokeThickness = borderWidth;
        El.Width = 25;
        El.Height = 25;
        radius = 25;

        // Add the Ellipse to the canvas
        SkeletonCanvas.Children.Add(El);

        // Avoid exceptions based on bad tracking
        if (float.IsInfinity(colorPoint.X) || float.IsInfinity(colorPoint.X)) return;

        // Allign ellipse on canvas
        Canvas.SetLeft(El, colorPoint.X);
        Canvas.SetTop(El, colorPoint.Y);

    }

Now I am stuck, from this point onwards how would I draw the 'Bones' of the body between each joint on a canvas similiar to how I added the Eclipse for the Joints?.

Any help is appreciated thanks


Solution

  • In your DrawBody(Body body) function, you'll need to set up the "bones" that you want to draw. Eg:

    private void DrawBody(Body body)
    {
        // left forearm
        DrawBone(body.Joints[JointType.HandLeft], body.Joints[JointType.ElbowLeft]);
        // right forearm
        DrawBone(body.Joints[JointType.HandRight], body.Joints[JointType.ElbowRight]);
        // ...etc...
    
    }
    

    The DrawBone(Joint, Joint) function would look something like this:

    private void DrawBone(Joint first, Joint second)
    {
        Line line = new Line();
        line.Stroke = Brushes.LightSteelBlue;
    
        line.X1 = first.Position.X;
        line.X2 = second.Position.X;
        line.Y1 = first.Position.Y;
        line.Y2 = second.Position.Y;
    
        line.StrokeThickness = 2;
        myCanvas.Children.Add(line);
    }
    

    I'm working from memory here so syntax might be off a little.