4

我知道如何以像素为单位转换从Joint.Position.X和获得的值Joint.Position.Y。有一个我这样做的例子:

void kinectSensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
        {
            if (skeletonFrame != null)
            {
                Skeleton[] skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; //conterrà tutti gli skeleton

                skeletonFrame.CopySkeletonDataTo(skeletonData);

                Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();

                if (playerSkeleton != null)
                {
                    Joint rightHand = playerSkeleton.Joints[JointType.HandRight];
                    Joint leftHand = playerSkeleton.Joints[JointType.HandLeft];

                    //EDIT: The following formulas used to convert X and Y coordinates in pixels are wrong.
                    //Please, see the answer for details
                    rightHandPosition = new float[] { (((0.5f * rightHand.Position.X) + 0.5f) * (640)), (((-0.5f * rightHand.Position.Y) + 0.5f) * (480)) };
                    leftHandPosition = new float[] { (((0.5f * leftHand.Position.X) + 0.5f) * (640)), (((-0.5f * leftHand.Position.Y) + 0.5f) * (480)), leftHand.Position.Z };
                }
             }
         }
    }

现在,我想做的是使用Joint.Depth.Z. 参考前面的例子,我想获得两个 3D 数组rightHandPositionleftHandPosition,最后一个坐标代表深度。什么是正确的公式来转换从相应的值返回rightHand.Position.ZleftHand.Position.Z值(以毫米为单位)?

编辑:上面代码中用于以像素为单位转换 X 和 Y 坐标的公式是错误的。请阅读我的以下答案。

4

2 回答 2

8

我已经意识到Joint.Position.X并且Joint.Position.Y不限于-1和1之间。这个错误的信息在互联网上非常分散,这就是我回复自己的原因。

正如Evil Closet Monkey所提到的,在上面的评论中,官方文档说“骨架空间坐标以米表示”。Kinect for Windows 团队的成员也在这篇文章中证实了这一点。

这意味着为了转换用 和 获得的 X、Y 和 Z 坐标,Joint.Position.XJoint.Position.Y毫米Joint.Position.Z为单位,您只需将这些值除以 1000(或者您也可以以米为单位工作,无需转换)。

于 2013-03-13T20:16:37.813 回答
0

如前所述,位置以米为单位。只需乘以 1000 即可将米换算为毫米。根据谷歌转换

于 2017-11-25T04:55:19.063 回答