0

我正在尝试开发一个看似简单的程序,该程序使用 Xbox360 的 Kinect 来计算一个人行进的距离。Kinect 将指向的房间大小为 10 x 10。用户按下按钮后,对象将在该空间内移动。一旦对象到达该区域的最终目的地,用户将再次按下按钮。然后,Kinect 将输出受试者在两次按下按钮之间走了多远。以前从未为 Kinect 开发过,因此入门非常艰巨。我的问题是我不完全确定应该使用什么来测量距离。在我的研究中,我找到了计算物体与 Kinect 之间距离的方法,仅此而已。

4

1 回答 1

0

你所听到的是一个处理笛卡尔平面的简单问题。Kinect 有 20 个关节存在于 XYZ 空间中,距离以米为单位。为了访问这些关节,您在“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 流式传输之间的一段时间。然后,您将进行计算以获得两点之间的距离。如果您没有延迟,您将无法获得笛卡尔点。

于 2013-06-05T19:38:42.120 回答