【问题标题】:Measuring person's height using Kinect使用 Kinect 测量人的身高
【发布时间】:2015-05-26 15:09:03
【问题描述】:

我正在尝试使用 Kinect 计算一个人的身高。这是我计算高度的方法(这段代码不是很复杂,仅用于测试目的):

double h2s =  Math.Sqrt(Math.Pow(headX - shoulderCenterX, 2) + Math.Pow(headY - shoulderCenterY, 2)+ Math.Pow(headZ - shoulderCenterZ, 2));
double s2hip =  Math.Sqrt(Math.Pow(shoulderCenterX - hipX, 2) + Math.Pow(shoulderCenterY - hipY, 2) + Math.Pow(shoulderCenterZ - hipZ, 2));
double hip2Lhip =  Math.Sqrt(Math.Pow(hipX - hipLeftX, 2) + Math.Pow(hipY - hipLeftY, 2) + Math.Pow(hipZ - hipLeftZ, 2));
double Lhip2kneeL =  Math.Sqrt(Math.Pow(hipLeftX - kneeLeftX, 2) + Math.Pow(hipLeftY - kneeLeftY, 2) + Math.Pow(hipLeftZ - kneeLeftZ, 2));
double kneeL2ankle = Math.Sqrt(Math.Pow(kneeLeftX - ankleLeftX, 2) + Math.Pow(kneeLeftY - ankleLeftY, 2) + Math.Pow(kneeLeftZ - ankleLeftZ, 2));

double heigth = h2s + s2hip + hip2Lhip + Lhip2kneeL + kneeL2ankle;

vyskatextbox.Text = heigth.ToString();

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

【问题讨论】:

  • 您的各种坐标(headX 等)在...中的单位是什么?
  • @MattiVirkkunen 我没有转换任何东西,这是直接来自 kinect,例如:headX = head.Position.X;所以我想它应该以米为单位。
  • 所以您是在猜测但不确定?您甚至阅读过文档吗?
  • @MattiVirkkunen 我在其他论坛上有红色文档和主题,甚至还有来自“SCOPUS”和“Web of Science”等数据库的科学文章。我仍然不确定,因为我认为我的身高不可能达到 11m,你知道 :) 如果你能给我解释为什么我会得到如此奇怪的值,那将是非常好的。谢谢
  • 你们为什么要否决我的问题?如果答案对您来说如此幼稚和显而易见,请不要自私并与其他可能没有您那么有经验的人分享。如果不是这种情况,您为什么要否决我的问题,请发表评论,我将尝试改进此问题和将来的问题。谢谢

标签: c# kinect euclidean-distance


【解决方案1】:

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

Microsoft Kinect SDK v1.x 中的高度估计

假设我们有一个函数可以计算两个关节之间的距离。我们将此函数命名为d(joint1, joint2)

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

function avg(joint1, joint2) {
    avg_joint.x = (joint1.x + joint2.x) / 2.0;
    avg_joint.y = (joint1.y + joint2.y) / 2.0;
    avg_joint.z = (joint1.z + joint2.z) / 2.0;
    return avg_joint;
}

一个很好的估计用户身高的算法可以是下面这个(注意它只是一个伪代码):

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;

如果所有关节都被很好地跟踪,那么这个算法效果很好。但是,有可能(并且实际上经常发生)某些关节被推断。在this page from the documentation on MSDN 中,您可以看到如何测试 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;

您可以在this link 找到有关如何使用 Microsoft Kinect SDK v2 评估用户身高的有趣讨论。

【讨论】:

  • 我们如何找到与 Kinect 2.0 的身体距离/特别是当 Kinect 不直对我们的脸但它形成一个角度时
【解决方案2】:

这个链接对我很有帮助。
Find user height accurately

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多