Kinect:将Joint.Position.Z转换为毫米

4

我知道如何将从 Joint.Position.XJoint.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获得真实的深度(以毫米为单位)。参考之前的示例,我想要获取rightHandPositionleftHandPosition的两个3D数组,其中最后一个坐标表示深度。为了将从rightHand.Position.ZleftHand.Position.Z返回的值转换为相应的毫米值,正确的公式是什么?编辑:上面代码中用于转换X和Y像素坐标的公式是错误的,请阅读我下面的回答。

1
我对Kinect的工作原理一无所知,但可以从您发布的内容中推断一些。根据您发布的内容,rightHand(和leftHand).Position给出了一个3D{x,yz}值,归一化为0到1。因此,您有一个3D坐标。您只需要进行缩放和可能的平移。那个0..1范围覆盖了什么?我会认为它是Kinect扫描的边界框。您能否从某个地方查询该信息?如果可以,只需将每个维度乘以(其终点-起点)并添加起点即可。 - Scott Mermelstein
Position.Z 返回的数值单位为米。 - Nicholas Pappas
@邪恶的壁橱猴子:你能给我一个证实你所说的内容的参考吗? - Vito Gentile
“骨架空间坐标以米为单位表示。” - Nicholas Pappas
是的。看起来您在下面的自我回答中找到了其他一些资源。祝您项目顺利! - Nicholas Pappas
显示剩余2条评论
2个回答

8
我发现Joint.Position.XJoint.Position.Y的取值范围并不限定在-1到1之间。这个错误信息在互联网上很流行,这也是我要回复自己的原因。
正如Evil Closet Monkey在上面的评论中提到的,官方文档指出:“骨架空间坐标以米为单位表示”。Kinect for Windows小组的一位成员在这篇文章中也证实了这一点。
这意味着,为了将Joint.Position.XJoint.Position.YJoint.Position.Z获取的X、Y和Z坐标转换为毫米,您只需要将这些值除以1000(或者您也可以直接使用以米为单位的值,无需进行任何转换)。

0
如前所述,位置以米为单位给出。只需乘以1000即可将米转换为毫米。根据Google的转换

这应该是一个注释。 - Samir Bhatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接