Kinect 用户检测

Posted

技术标签:

【中文标题】Kinect 用户检测【英文标题】:Kinect user Detection 【发布时间】:2012-05-14 05:25:18 【问题描述】:

我正在开发一个应用程序 当 kinect 传感器检测到一个人可以在其上工作的骨架时,如果其他人靠近现有用户,它会检测到第二个人。 我想限制用户使用 kinect 传感器首先检测到它,如果其他用户来了,这不应该检测到另一个。 提前致谢

【问题讨论】:

见***.com/questions/10562554/… 【参考方案1】:

另请参阅 Jurgeon D 在Kinect SDK player detection 上的回答,因为它处理骨架索引。 @Fixus 也是正确的,因为您可以使用 ID。但是,如果您的意思是检测到超过 2 个人,则仅检测到一个,即不是编程,即在 Kinect 的硬件和@FelixK 中。是正确的。

骨骼指数

void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 

    SkeletonFrame sf = e.SkeletonFrame;
    //check which skeletons in array are active and
    // use that array indexes for player index
    SkeletonData player1 = sf.Skeletons[playerIndex1];
    SkeletonData player2 = sf.Skeletons[playerIndex2];

骨架 ID

void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)

    SkeletonFrame sf = e.SkeletonFrame;

    if (sf.TrackingState == SkeletalTrackingState.Tracked)
     
          int ID1 = sf.TrackingID;
     

也是检测人类的代码

 DepthImageFrame depthFrame;
 short[] rawDepthData = new short[depthFrame.PixelDataLength];
 depthFrame.CopyPixelDataTo(rawDepthData); 
 Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4];     
 int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;

 if (player > 0)
 
     //do something
       

【讨论】:

【参考方案2】:

Kinect 会检测新用户,因为这是他的工作 :) 但请记住,每个用户都有自己的 ID,因此您始终知道第一个用户是第一个,第二个是第二个。这样你就可以只在你想使用的用户的骨架上工作

【讨论】:

【参考方案3】:

如果我正确理解您的问题,这是不可能的,您不能修改 Kinects 行为以及它如何检测用户(如果框架中没有任何内容;我认为没有什么)。

你必须在你的代码中解决这个问题。

【讨论】:

【参考方案4】:

在其中一个 kinect 快速入门教程中,有一种方法可以只检测一个用户。我为自己的应用程序尝试了它并且它有效。

using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())

    if (skeletonFrame == null)
                return;

    Skeleton[] skeletons= new Skeleton[skeletonFrame.SkeletonArrayLength];
    skeletonFrame.CopySkeletonDataTo(skeletons);

    if (skeletons.All(s => s.TrackingState == SkeletonTrackingState.NotTracked))
                return;

    Skeleton skeleton = (from s in skeletons
                                 where s.TrackingState == SkeletonTrackingState.Tracked
                                 select s).FirstOrDefault();
    if (skeleton == null) return;

    // TODO: Do something to the skeleton data...


【讨论】:

【参考方案5】:
KinectManager kinectManager = KinectManager.Instance;
AvatarController avatarCtrl = avatar ? avatar.gameObject.GetComponent<AvatarController> () : null;

if (kinectManager != null && kinectManager.IsInitialized () && avatar != null && avatarCtrl && kinectManager.IsUserTracked (avatarCtrl.playerId)) 
        //User detected. You can do the remaining thing.

【讨论】:

以上是关于Kinect 用户检测的主要内容,如果未能解决你的问题,请参考以下文章

Kinect 机械臂检测

用于物体检测的 kinect 选择

Kinect 作为运动传感器

kinect摆放距离和高度

Kinect SDK 播放器检测

Kinect2 calibration随记