我想估计玩家在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的平均值)?如果我的选择是可以改进的,是否有一些参考资料证明了更好的选择?
答案 0 :(得分:1)
Head
,Spine
或HipCenter
都足以让我们退出。
我会建议Spine
或HipCenter
超过头部,因为除非用户移动整个身体,否则这两点不能移动很多。也就是说 - 你可以向前和向后倾斜以改变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
请参阅以下参考资料: