【问题标题】:How to track only one person/body with Kinect v2 in C#如何在 C# 中使用 Kinect v2 仅跟踪一个人/身体
【发布时间】:2014-11-20 13:58:28
【问题描述】:

我想追踪第一个人,并且只使用这个人的身体。

所以基本上当一个人被跟踪,并且有人在他身后走或正在看这个人时,如果他们移动,kinect 不应该识别其他人。

我在 C# 中使用来自 SDK 2.0“Body Basics-WPF”的示例代码。我的目标是只识别一个人的几个关节(成功完成)。我找到了一个线程如何为 Kinect v1 制作它,但对于 Kinect v2 没有。代码如下:

private void Reader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
    {
        bool dataReceived = false;

        using (BodyFrame bodyFrame = e.FrameReference.AcquireFrame())
        {
            if (bodyFrame != null)
            {
                if (this.bodies == null)
                {
                   this.bodies = new Body[bodyFrame.BodyCount];   
                }

                bodyFrame.GetAndRefreshBodyData(this.bodies);
                dataReceived = true;
            }
        }

        if (dataReceived)
        {
            using (DrawingContext dc = this.drawingGroup.Open())
            {
                dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, this.displayWidth, this.displayHeight));

                int penIndex = 0;

                foreach (Body body in this.bodies) 
                {

                    Pen drawPen = this.bodyColors[penIndex++];

                    if (body.IsTracked)
                    {
                        this.DrawClippedEdges(body, dc);

                        IReadOnlyDictionary<JointType, Joint> joints = body.Joints;
                        Dictionary<JointType, Point> jointPoints = new Dictionary<JointType, Point>(); 

                        foreach (JointType jointType in joints.Keys)
                        {
                            if (jointType == JointType.ShoulderRight || jointType == JointType.ElbowRight || jointType == JointType.WristRight || jointType == JointType.HandRight ||
                                jointType == JointType.ShoulderLeft || jointType == JointType.ElbowLeft || jointType == JointType.WristLeft || jointType == JointType.HandLeft)
                            {

                                CameraSpacePoint position = joints[jointType].Position;
                                if (position.Z < 0)
                                {
                                    position.Z = InferredZPositionClamp;
                                }

                                DepthSpacePoint depthSpacePoint = this.coordinateMapper.MapCameraPointToDepthSpace(position);
                                jointPoints[jointType] = new Point(depthSpacePoint.X, depthSpacePoint.Y);     
                            }
                        }

                        this.DrawBody(joints, jointPoints, dc, drawPen);
                    }
                }

                this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, this.displayWidth, this.displayHeight));
            }
        }
    }

【问题讨论】:

    标签: c# kinect


    【解决方案1】:

    前段时间很安静,但我用自己的函数来管理这个问题,以跟踪一个人。如果被跟踪人员离开 Body Array 中的下一个顶部 Body,则获取“被跟踪人员”。

    private ulong currTrackingId = 0;
    private Body GetActiveBody()
    {
        if (currTrackingId <= 0)
        {
            foreach (Body body in this.bodies)
            {
                if (body.IsTracked)
                {
                    currTrackingId = body.TrackingId;
                    return body;
                }
            }
    
            return null;
        }
        else
        {
            foreach (Body body in this.bodies)
            {
                if (body.IsTracked && body.TrackingId == currTrackingId)
                {
                    return body;
                }
            }
        }
    
        currTrackingId = 0;
        return GetActiveBody();
    }
    

    【讨论】:

      【解决方案2】:

      我使用的是旧的 Kinect,但还没有新的,所以这可能会也可能不会: 如果 bodyFrame.BodyCount 只会给你面对 Kinect 的人数,然后用 1 替换它,这样你的代码就变成了:

      this.bodies = new Body[1];

      我认为通常 kinect 会选择最近的人。 试试看,告诉我你得到了什么。

      【讨论】:

      • 嗨。 this.bodies = new Body[1] 不起作用。但我找到了另一种跟踪一个人的方法。检查 HDFaceBasics-WPF 和方法 FindClosestBody。
      【解决方案3】:

      不要使用 foreach 来迭代 body 数组,只需使用列表中的第一个 body。

      替换:

      foreach (Body body in this.bodies) 
      {
         if (body.IsTracked) 
         {
            ...
      

      与:

      var body = this.bodies[0];
      if (body.tracked)
      {
          ...
      

      更新:

      我刚刚使用 Kinect Studio 进行了尝试,发现即使只有一个被跟踪的主体,也不能保证它位于数组的第一个插槽中。在我的应用程序中,现在我使用 LINQ 来获取 IsTracked == true 的第一个主体。对于如何为生产就绪代码执行此操作,我没有很好的答案。如果我解决了这个问题,我会更新这篇文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多