Kinect SDK 2.0:如何跟踪一个机构

时间:2015-04-23 23:08:01

标签: c# xaml kinect

我正在使用Kinect SDK 2.0,我只想跟踪一个骨架。

我如何实现这一目标?

我已经在HD Face Basics示例中尝试了FindClosestSkeleton方法,但这阻止了我的程序更新每一帧,我并不完全理解它。

有人可以向我解释并告诉我该怎么做吗?

1 个答案:

答案 0 :(得分:2)

以下代码基于 BodyBasics-WPF 示例。

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
            }
        }
    }
}