gpt4 book ai didi

c# - 使用 Kinect 测量人的高度

转载 作者:行者123 更新时间:2023-12-02 00:33:35 26 4
gpt4 key购买 nike

我正在尝试使用 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) 这样的数字?

最佳答案

我在您的代码中看到一个 shoulderCenter,因此您可能使用的是 Microsoft Kinect SDK v1.x。在本例中,骨骼关节如下:

Kinect SDK v1.x Skeletal Joints

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 中不同。下图显示了这种差异:

Kinect SDK v2 Skeletal Joints

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

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 评估用户高度的有趣讨论。 .

关于c# - 使用 Kinect 测量人的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30462391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com