每个被追踪的人都有一个玩家索引。忽略其他指数的玩家即可。
玩家索引是深度流图像中数据的一部分。你必须提取它:
int playerIdx = depthFrame16[i16] & 0x07;
为了获取此信息,您必须正确初始化 Kinect 运行时:
_kinectNui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | ....
请参阅此处了解更多信息:http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx
我完全推荐 MS 的这个视频教程:http://research.microsoft.com/apps/video/?id=152249 http://research.microsoft.com/apps/video/?id=152249
如果您查看 SDK 附带的 ShapeGameDemo,您可以看到他们是如何做到的。 (他们只是使用数组中骨架的索引):
int playerId = 0;
foreach (SkeletonData data in skeletonFrame.Skeletons) {
if (SkeletonTrackingState.Tracked == data.TrackingState) {
Player player;
if (players.ContainsKey(playerId))
player = players[playerId];
else
player = new Player(playerId);
}
playerId++;
}
简化您可以做到的事情(使用您的代码):
int myPlayerIndex = 0; //probably 0 since you are the first person entered the kinect scope
int playerId = 0;
foreach (SkeletonData s in allSkeletons.Skeletons) {
if(playerId != myPlayerIndex)
continue;
if (s.TrackingState == SkeletonTrackingState.Tracked) {
foreach (Joint joint in s.Joints)
{
}
}
playerId++;
}
在这里总结一下 MS 论坛中的一个类似问题,对此进行了解释:http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca