如何用Kinect追踪一个人(trackingID)

本文关键字:trackingID 一个人 追踪 何用 Kinect | 更新日期: 2023-09-27 18:17:32

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

我可以接管光标,现在我只想要一个人被跟踪。所以基本上当一个人在程序中导航时,有人在他后面走,或者和这个人在一起,如果他们移动,kinect不应该识别其他人。

我怎么能实现这个,我知道这是trackingId的东西,但是什么?: s

        foreach (SkeletonData s in allSkeletons.Skeletons)
        {
                if (s.TrackingState == SkeletonTrackingState.Tracked)
                {
                    if (s.TrackingID == 0)
                    {
                        foreach (Joint joint in s.Joints)
                        {
                        }
                    }
                }
        }

如何用Kinect追踪一个人(trackingID)

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

int playerIdx = depthFrame16[i16] & 0x07;

为了获得这些信息,你必须正确地初始化你的Kinect运行时:

_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++;
}

总结一下,在微软论坛上有一个类似的问题:http://social.msdn.microsoft.com/forums/en us/kinectsdk/thread/d821df8d - 39 - ca - 44 - e3 - 81 - e7 - c907d94acfca