0

我想估计玩家在 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;
}

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

这是一个不错的选择,还是有更好的选择(例如骨架几个点的平均值)?如果我的选择是可改进的,是否有一些参考证明更好的选择是合理的?

4

2 回答 2

1

,HeadSpineHipCenter足够体面的点来退出。

我建议使用SpineorHipCenter在头上,因为除非用户移动整个身体,否则这两个点不能移动很多。也就是说——你可以向前和向后倾斜来改变Head.Z位置,但是除非用户移动他们的整个身体,否则其他两点不会有太大的变化。

根据您的应用程序的目的,Head从用户的角度来看,这也可能是有意义的。根据您的描述,我认为这不太可能,但也许倾斜/倾斜以更新一个人的整体位置确实符合用户的心理模型。

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

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

于 2013-04-10T14:47:03.390 回答
0

使用 SDK 功能,除了您正在使用的功能,准确获取信息。

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

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

请参阅以下参考资料:

于 2014-05-21T02:49:03.010 回答