我知道如何转换从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
获取真实深度(以毫米为单位)。参考前面的示例,我想获得rightHandPosition
和leftHandPosition
的两个3D数组,其中最后一个坐标代表深度。什么是正确的公式,以便以毫米为单位转换从rightHand.Position.Z
和leftHand.Position.Z
返回的相应值的值?
编辑:用于在上面的代码中以像素为单位转换X和Y坐标的公式是错误的。请阅读我的以下答案。
答案 0 :(得分:8)
我已经意识到Joint.Position.X
和Joint.Position.Y
不限于-1和1.这个错误的信息在互联网上非常分散,这就是我回复自己的原因。< / p>
正如Evil Closet Monkey所述,在上面的评论中,official documentation表示“骨架空间坐标以米为单位”。在this post中,Kinect for Windows团队的成员也证实了这一点。
这意味着为了转换以Joint.Position.X
,Joint.Position.Y
和Joint.Position.Z
获得的X,Y和Z坐标,以毫米为单位,您只需将这些值除以1000(或者你也可以用米工作,不需要转换。)
答案 1 :(得分:0)