Kinect:以毫米为单位转换Joint.Position.Z

Vit*_*ile 4 c# kinect kinect-sdk

我知道如何转换从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 };
                }
             }
         }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Vit*_*ile 8

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

正如Evil Closet Monkey所提到的,在上面的评论中,官方文档说" 骨架空间坐标以米为单位 ".这篇文章还证实了Kinect for Windows Team的成员.

这意味着,以转化X,Y,Z坐标,以获得Joint.Position.X,Joint.Position.Y并且Joint.Position.Z,以毫米为单位,您只需通过1000来划分这些值(或者你也可以在米工作,没有转换需要).