使用Kinect计算行进距离

时间:2013-05-31 21:23:25

标签: kinect

我正在尝试开发一个似乎是一个简单的程序,它使用Kinect for Xbox360来计算一个人的行进距离。 Kinect将指向的房间将是10 x 10.用户按下按钮后,主体将在此空间内移动。一旦主体到达该区域的最终目的地,用户将再次按下该按钮。然后,Kinect将输出主体在两次按钮之间行进的距离。从来没有为Kinect开发过,开始这一点非常艰巨。我的问题是我不完全确定我应该用什么来衡量距离。在我的研究中,我已经找到了计算物体距离Kinect的距离的方法,但这是关于它的。

1 个答案:

答案 0 :(得分:0)

你所听到的是一个处理笛卡尔平面的简单问题。 Kinect在XYZ空间中有20个关节,距离以米为单位。为了访问这些关节,你可以在“Tracker”类中包含这些语句(这是C#......不确定你是否在SDK中使用C#或C ++):

public Tracker(KinectSensor sn, MainWindow win, string fileName)
        {
            window = win;

            sensor = sn;
            try
            {
                sensor.Start();
            }
            catch (IOException)
            {
                sensor = null;
                MessageBox.Show("No Kinect sensor found. Please connect one and restart the application", "*****ERROR*****");
                return;
            }

            sensor.SkeletonFrameReady += SensorSkeletonFrameReady;   //Frame handlers
            sensor.ColorFrameReady += SensorColorFrameReady;
            sensor.SkeletonStream.Enable();
            sensor.ColorStream.Enable();
        }

这些访问来自Kinect的颜色和骨架流。骨架流包含关节,因此您可以使用以下语句关注它:

//Start sending skeleton stream
        private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            //Access the skeleton frame
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {

                if (skeletonFrame != null)
                {
                    //Check to see if there is any data in the skeleton
                    if (this.skeletons == null)

                        //Allocate array of skeletons
                        this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];

                    //Copy skeletons from this frame
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);

                    //Find first tracked skeleton, if any
                    Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
                    if (skeleton != null)
                    {
                        //Initialize joints
                        ///<summary>
                        ///Joints to be displayed, projected, recorded, etc.
                        ///</summary>
                        Joint leftFoot = skeleton.Joints[JointType.FootLeft];
                    }
                }

所以,在你的程序开始时,你想要选择一个关节(有20个......选择一个在你执行程序时总是面向Kinect的一个)并获得它的位置类似于以下陈述:

if(skeleton.Joints[JointType.FootLeft].TrackingState == JointTrackingState.Tracked)
{
    double xPosition = skeleton.Joints[JointType.FootLeft].Position.X;
    double yPosition = skeleton.Joints[JointType.FootLeft].Position.Y;
    double zPosition = skeleton.Joints[JointType.FootLeft].Position.Z;
}

最后,您需要在停止流之前稍微延迟...在点击之间和从Kinect关闭流之间的某个时间。然后,您将进行数学运算以获得两点之间的距离。如果你没有延迟,你将无法获得笛卡尔点。