如何使用Kinect(trackingID)跟踪一个人

9

我想要追踪第一个人,并使用这个人的右手在我制作的应用程序中导航。

我现在能够控制鼠标,但我只想追踪一个人。所以基本上当一个人在程序中进行导航时,如果有其他人跟在他身后或与这个人一起观看,则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

每个被跟踪的人都有一个玩家索引。忽略其他索引的玩家。
玩家索引是深度流图像中的一部分数据。你需要提取它:

int playerIdx = depthFrame16[i16] & 0x07;

为了获取此信息,您需要正确初始化Kinect Runtime:
_kinectNui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | ....

请查看以下链接获取更多信息: http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx 我强烈推荐微软的这个视频教程: 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++;
}

以下是一个微软论坛中的类似问题,解释了此问题:

http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca

所以你实际上创建了一个球员类吗? 在这个类中,你存储了一个球员ID,而该球员ID又存储了骨架数组? - Letoir
我查看了一下,这意味着我需要创建一个玩家类,然后再创建一个骨头类,以跟踪一个人的动作。难道它不可能比看起来更简单吗 :) - Letoir
实际上,这段代码来自ShapeGame。在您的代码中,allSkeletons变量保存了所有玩家的列表。如果您使用每个玩家的索引作为其标识符,您可以跳过其他玩家。 - juergen d
1
你不需要创建这些类,只需记住你的玩家索引并跳过其他玩家。请参见上面的编辑。 - juergen d
1
除非是同一个问题,否则你应该另开一个新的提问。 - juergen d
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接