估计玩家深度的大致位置

时间:2013-04-10 14:01:52

标签: c# kinect

我想估计玩家在Kinect传感器拍摄的场景中的深度位置,以便在需要评估手和“玩家身体”之间距离的算法中使用此信息。在这种情况下,“玩家身体”的概念可以翻译成一个代表玩家深度位置的值(这就是我正在寻找的)。

显然,因为一个人占据了空间中的音量,我们知道无法在场景中定义玩家的精确位置。

我想知道的是:使用骨架数据计算一个人的近似位置的最佳做法是什么?

我尝试使用以下代码:

Skeleton playerSkeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();

...

if (playerSkeleton != null)
{
    Joint head = playerSkeleton.Joints[JointType.Head];

    float averagePlayerPosition = head.Z;
}

以上述方式,我使用头部深度来定义玩家的位置。

这是一个不错的选择,还是有更好的选择(例如几个points of the skeleton的平均值)?如果我的选择是可以改进的,是否有一些参考资料证明了更好的选择?

2 个答案:

答案 0 :(得分:1)

HeadSpineHipCenter都足以让我们退出。

我会建议SpineHipCenter超过头部,因为除非用户移动整个身体,否则这两点不能移动很多。也就是说 - 你可以向前和向后倾斜以改变Head.Z位置,但除非用户身体移动整个身体,否则其他两点不会发生显着变化。

根据您的应用程序的用途,Head也可能从用户的角度来理解。根据你的描述,我认为这不太可能,但可能倾向于/更新以更新一个人的整体位置确实符合用户的心理模型。

Position本身也有Skeleton个属性: http://msdn.microsoft.com/en-us/library/microsoft.kinect.skeleton.position.aspx

老实说,我不确定这是如何计算的,因为我从未使用它,但你可以要求Skeleton.Position.Z根据Kinect获得用户不断计算的距离。

答案 1 :(得分:0)

除了您正在使用的SDK功能外,还可以使用SDK功能来准确获取信息。

使用2D关节表示,您可以计算深度流上的位置,然后使用它:

int realDepth = depth[index] >> DepthImageFrame.PlayerIndexBitmaskWidth

请参阅以下参考资料: