Как отследить ОДНОГО человека с Kinect (trackingID) - PullRequest
9 голосов
/ 09 декабря 2011

Я хотел бы отследить первого человека и использовать правую руку этого человека для навигации по приложению, которое я создал.

Я могу взять курсор, теперь я хочу, чтобы отслеживался только один человек.Таким образом, в основном, когда один человек перемещается в программе, и за ним идут люди, или они смотрят с этим парнем, если они двигаются, kinect не должен узнавать кого-либо еще.Я знаю, что-то с trackingId, но что?: s

        foreach (SkeletonData s in allSkeletons.Skeletons)
        {

                if (s.TrackingState == SkeletonTrackingState.Tracked)
                {
                    if (s.TrackingID == 0)
                    {

                        foreach (Joint joint in s.Joints)
                        {
                        }
                    }
                }
        }

1 Ответ

6 голосов
/ 09 декабря 2011

Каждый отслеживаемый человек имеет индекс игрока. Просто игнорируйте игроков с другими индексами.
Индекс игрока является частью данных в изображении потока глубины. Вы должны извлечь это:

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

...