ShatteredPheonix
ShatteredPheonix

Reputation: 77

Kinect SDK 2.0: how to track one body

I am using Kinect SDK 2.0 and I want to track just one skeleton.

How do I achieve this?

I already tried the FindClosestSkeleton method in HD Face Basics sample, but that stopped my program from updating every frame, and I didn't entirely understand it.

Can someone kindly explain and show me how to do this?

Upvotes: 1

Views: 3548

Answers (1)

Vito Gentile
Vito Gentile

Reputation: 14426

The following code is based on the BodyBasics-WPF sample.

public class KinectManager
{
    // Active Kinect sensor
    private KinectSensor kinectSensor = null;

    // Reader for body frames
    private BodyFrameReader bodyFrameReader = null;

    // Array for the bodies
    private Body[] bodies = null;

    // index for the currently tracked body
    private int bodyIndex;

    // flag to asses if a body is currently tracked
    private bool bodyTracked = false;

    public KinectManager()
    {
        this.kinectSensor = KinectSensor.GetDefault();

        // open the reader for the body frames
        this.bodyFrameReader = this.kinectSensor.BodyFrameSource.OpenReader();

        // open the sensor
        this.kinectSensor.Open();

        this.bodyFrameReader.FrameArrived += this.Reader_FrameArrived;
    }

    // Handles the body frame data arriving from the sensor
    private void Reader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
    {
        bool dataReceived = false;

        using (BodyFrame bodyFrame = e.FrameReference.AcquireFrame())
        {
            if (bodyFrame != null)
            {
                if (this.bodies == null)
                {
                    this.bodies = new Body[bodyFrame.BodyCount];
                }
                bodyFrame.GetAndRefreshBodyData(this.bodies);
                dataReceived = true;
            }
        }

        if (dataReceived)
        {
            Body body = null;
            if(this.bodyTracked) {
                if(this.bodies[this.bodyIndex].IsTracked) {
                    body = this.bodies[this.bodyIndex];
                } else {
                    bodyTracked = false;
                }
            }
            if(!bodyTracked) {
                for (int i=0; i<this.bodies.Length; ++i)
                {
                    if(this.bodies[i].IsTracked) {
                        this.bodyIndex = i;
                        this.bodyTracked = true;
                        break;
                    }
                }
            }

            if (body != null && this.bodyTracked && body.IsTracked)
            {
                // body represents your single tracked skeleton
            }
        }
    }
}

Upvotes: 2

Related Questions