1

我正在使用带有 Windows Kinect SDK 1.5 的 Kinect 开发游戏。Kinect 摄像头放在桌子上,我侧身站在 Kinect 旁边。我想显示播放器的骨架,如图 1 和图 2。 在此处输入图像描述 图 1 在此处输入图像描述 图 2

这些需要 Kinect Skeleton Stream 检测到的关节位置。但在大多数情况下,当玩家侧身站立时,Kinect 无法检测到隐藏在后面的某些关节。如图 1 所示,当我的手臂重叠时,我不希望隐藏手臂的关节显示在屏幕上。我只想显示我左臂的关节。另一种情况是,当我以正常方式放置手臂时,如图 2 所示,我想同时显示它们。

我的想法是使用关节的位置信息和跟踪状态来决定一个手臂是否在你身体的另一部分后面(有很多种重叠,arm-arm,arm-body,arm-head,-arm to leg) . 但我认为仅不显示 Kinect 未跟踪的关节是不够的。也许我们可以通过计算两个手腕、两个肘部和两个肩膀之间的距离来检测两个手臂是否重叠。如果两个手腕和两个肘部的距离都在阈值之内,说明双臂有重叠,我们可以只显示被跟踪的手臂骨骼的关节。

但是还有一个问题,手臂与身体的其他部位重叠的方式有很多,腿也是如此。所以这个解决方案在显示之前需要这么多的阈值和检查。此外,我不确定此解决方案的效果。

你们有更酷的想法来解决这个问题吗?

4

2 回答 2

0

查看SkeletonBasics-WPFv1.5 SDK Toolkit 示例附带的示例。它将向您显示您想要执行的类似操作。

可能最感兴趣的代码块是这个:

foreach (Joint joint in skeleton.Joints)
{
    Brush drawBrush = null;

    if (joint.TrackingState == JointTrackingState.Tracked)
    {
        drawBrush = this.trackedJointBrush;
    }
    else if (joint.TrackingState == JointTrackingState.Inferred)
    {
        drawBrush = this.inferredJointBrush;
    }

    if (drawBrush != null)
    {
        drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness);
    }
}

注意JointTrackingState.Inferred检查。在这个演示中,关节继续显示,但它们变成黄色。在您的情况下,您可以隐藏它们。 JointTracingState也有NotTracked枚举,根据您的情况,它也可能有用。

在本例中,骨骼也仅在 为 的关节之间绘制Tracked

顺便说一句 - 在撰写本文时,Windows SDK 的官方 Kinect 是 v1.6。您可能需要考虑更新。

于 2012-10-26T22:01:56.947 回答
0

这是Kinect 侧向骨骼跟踪的完全相同的副本,因此只需查看Outlaw Lemur 的回答,它解释了 Kinect 的功能以及为什么它不起作用,以及一些关于如何使其工作的变通方法的尝试。从本质上讲,他是说 Kinect 是用来跟踪人们的面部或背部,但会将其解释为他们的正面。侧向跟踪不起作用,因为 Kinect 只能看到你的一半关节,并且必须估计其余的关节,从而导致糟糕的结果。

于 2012-11-04T00:07:57.470 回答