Каждый отслеживаемый человек имеет индекс игрока. Просто игнорируйте игроков с другими индексами.
Индекс игрока является частью данных в изображении потока глубины. Вы должны извлечь это:
int playerIdx = depthFrame16[i16] & 0x07;
Чтобы получить эту информацию, вы должны правильно инициализировать Kinect Runtime:
_kinectNui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | ....
Смотрите здесь для получения дополнительной информации:
http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx
Я полностью рекомендую этот видеоурок от MS:
http://research.microsoft.com/apps/video/?id=152249
Если вы посмотрите на ShapeGameDemo, который идет в комплекте с SDK, вы увидите, как они это делают. (Они просто используют индекс скелета в массиве):
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