C# 测量人员';使用Kinect的s高度

C# 测量人员';使用Kinect的s高度,c#,kinect,euclidean-distance,C#,Kinect,Euclidean Distance,我试图用Kinect计算一个人的身高。下面是我如何计算高度的(此代码不是很复杂,仅用于测试目的): 我没有得到任何错误,但问题是它计算我的身高是错误的。我得到的数字介于3到11之间,这取决于我与Kinect的距离。有什么不对劲吗?数字改变可以吗?还是应该保持不变?还有为什么我会得到像11(m)这样的数字?这个链接对我很有帮助。 我在您的代码中看到了一个shoulderCenter,因此您可能正在使用Microsoft Kinect SDK v1.x。在这种情况下,骨骼关节如下所示: Micro

我试图用Kinect计算一个人的身高。下面是我如何计算高度的(此代码不是很复杂,仅用于测试目的):


我没有得到任何错误,但问题是它计算我的身高是错误的。我得到的数字介于3到11之间,这取决于我与Kinect的距离。有什么不对劲吗?数字改变可以吗?还是应该保持不变?还有为什么我会得到像11(m)这样的数字?

这个链接对我很有帮助。

我在您的代码中看到了一个
shoulderCenter
,因此您可能正在使用Microsoft Kinect SDK v1.x。在这种情况下,骨骼关节如下所示:

Microsoft Kinect SDK v1.x中的高度估计 假设我们有一个函数可以计算两个关节之间的距离。我们将此函数命名为
d(joint1,joint2)

还假设我们定义了一个函数,可以计算两个关节之间的平均点(请注意,以下只是伪代码):

估计用户身高的好算法如下(请注意,这只是一个伪码):

如果所有关节都被很好地跟踪,则该算法工作得非常好。但是,某些关节可能是推断出来的(实际上经常发生)。在中,您可以看到如何测试是否在C#中推断关节

如果推断接头,则其位置错误的可能性会增加。因此,高度估计失败的可能性也增加了

以下方法可用于测试是否所有接头都得到良好跟踪。如果至少有一个关节没有很好地跟踪,则返回
false
;否则它将返回
true

function areJointsWellTracked(JointCollection joints)
{
    foreach (Joint joint in joints)
        if(joint.TrackingState != JointTrackingState.Tracked)
            return false;

    return true;
}
所以,要改进用户的高度估计,您可以做的是仅在所有关节都得到良好跟踪的情况下计算高度估计

此外,考虑提供一个以上的最后一个高度值的平均值的可能性。例如,您可以记住数组中最后十个高度值,然后每次提供这些值的平均值。这将有助于减少噪音对测量的影响

你的问题 您的代码似乎是我刚才描述的算法的简化版本。所以,你能得到这些奇怪值的唯一原因是跟踪效果不好。我的建议是尝试使用前面提到的
areJointsWellTracked
方法,并且仅当所有关节都被很好地跟踪时才估计高度

Microsoft Kinect SDK v2的附加说明 对于使用SDK v2的开发人员,请注意骨骼关节的定义与SDK v1.x中的定义不同。下图显示了这种差异:

由于某些关节的位置和定义不同,评估高度的上述算法应编辑如下:

torso_height = d(HEAD, NECK)+
               d(NECK, SPINE_SHOULDER) +
               d(SPINE_SHOULDER, SPINE_MID) +
               d(SPINE_MID, SPINE_BASE) +
               d(SPINE_BASE, avg(HIP_RIGHT, HIP_LEFT));

left_leg_height = d(HIP_LEFT, KNEE_LEFT) +
                  d(KNEE_LEFT, ANKLE_LEFT) +
                  d(ANKLE_LEFT, FOOT_LEFT);

right_leg_height = d(HIP_RIGHT, KNEE_RIGHT) +
                   d(KNEE_RIGHT, ANKLE_RIGHT) +
                   d(ANKLE_RIGHT, FOOT_RIGHT);

tot_height = torso_height +
             (left_leg_height + right_leg_height) / 2.0;

您可以在中找到一个有趣的讨论,讨论如何使用Microsoft Kinect SDK v2评估用户的身高。

以及您的各种坐标(headX等)在…?@MattiVirkkunen我没有转换任何东西,这是直接从Kinect获得的,例如:headX=head.Position.X;所以我猜应该是米。所以你猜,不确定?你读过文档了吗?@MattiVirkkunen我在其他论坛上有红色文档和主题,甚至还有来自数据库的科学文章,比如“SCOPUS”和“科学网”。但我还是不确定,因为我不认为我能有11米高,你知道:)如果你能给我解释一下为什么我会得到这么高的值,你会非常感激的。谢谢你们为什么要否决我的问题?如果答案对你来说是如此幼稚和明显,请不要自私,与其他人分享,他们可能没有你那么有经验。如果不是这样,为什么你要否决我的问题,那么请留下评论,我将努力改进这个问题和未来的问题。非常感谢。
torso_height = d(HEAD, SHOULDER_CENTER) +
               d(SHOULDER_CENTER, SPINE) +
               d(SPINE, HIP_CENTER) +
               d(HIP_CENTER, avg(HIP_RIGHT, HIP_LEFT));

left_leg_height = d(HIP_LEFT, KNEE_LEFT) +
                  d(KNEE_LEFT, ANKLE_LEFT) +
                  d(ANKLE_LEFT, FOOT_LEFT);

right_leg_height = d(HIP_RIGHT, KNEE_RIGHT) +
                   d(KNEE_RIGHT, ANKLE_RIGHT) +
                   d(ANKLE_RIGHT, FOOT_RIGHT);

tot_height = torso_height +
             (left_leg_height + right_leg_height) / 2.0;
function areJointsWellTracked(JointCollection joints)
{
    foreach (Joint joint in joints)
        if(joint.TrackingState != JointTrackingState.Tracked)
            return false;

    return true;
}
torso_height = d(HEAD, NECK)+
               d(NECK, SPINE_SHOULDER) +
               d(SPINE_SHOULDER, SPINE_MID) +
               d(SPINE_MID, SPINE_BASE) +
               d(SPINE_BASE, avg(HIP_RIGHT, HIP_LEFT));

left_leg_height = d(HIP_LEFT, KNEE_LEFT) +
                  d(KNEE_LEFT, ANKLE_LEFT) +
                  d(ANKLE_LEFT, FOOT_LEFT);

right_leg_height = d(HIP_RIGHT, KNEE_RIGHT) +
                   d(KNEE_RIGHT, ANKLE_RIGHT) +
                   d(ANKLE_RIGHT, FOOT_RIGHT);

tot_height = torso_height +
             (left_leg_height + right_leg_height) / 2.0;