【问题标题】:Sensor only those which are in a particular area in front of kinect Xbox 360?仅感应 kinect Xbox 360 前面特定区域的那些?
【发布时间】:2014-05-29 15:30:20
【问题描述】:

我必须创建一个交互式菜单板。我正在使用 Kinect for Windows SDK v1.8。到目前为止,通过使用其内置的示例项目(控制基础 - Wpf)我能够导航(控制 kinecttile 按钮)。当我开始运行程序并且房间里没有人时,它可以完美运行,但是如果 kinect 传感器前面有多个人,则手(Kinect 鼠标指针)会在这里和那里移动。 现在我的问题
是否有任何选项 kinect 传感器仅检测特定区域中的人(例如 x=100-150,y=100-150,z=100-150)? p>

编辑

这是处理骨架数据的代码。

 private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs skeletonFrameReadyEventArgs)
    {
        // Even though we un-register all our event handlers when the sensor
        // changes, there may still be an event for the old sensor in the queue
        // due to the way the KinectSensor delivers events.  So check again here.
        if (this.KinectSensor != sender)
        {
            return;
        }

        using (SkeletonFrame skeletonFrame = skeletonFrameReadyEventArgs.OpenSkeletonFrame())
        {
            if (null != skeletonFrame)
            {
                try
                {
                    // Copy the skeleton data from the frame to an array used for temporary storage
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);

                    var accelerometerReading = this.KinectSensor.AccelerometerGetCurrentReading();

                    // Hand data to Interaction framework to be processed
                    this.interactionStream.ProcessSkeleton(this.skeletons, accelerometerReading, skeletonFrame.Timestamp);
                }
                catch (InvalidOperationException)
                {
                    // SkeletonFrame functions may throw when the sensor gets
                    // into a bad state.  Ignore the frame in that case.
                }
            }
        }
    }

【问题讨论】:

    标签: wpf kinect kinect-sdk


    【解决方案1】:

    我遇到了同样的问题通过使用下面的代码,我只跟踪了一个更靠近传感器的骨架。并直接将最近的骨架分配给主骨架流。

     private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs skeletonFrameReadyEventArgs)
        {
            Skeleton[] skeletons = new Skeleton[0];
    
            using (SkeletonFrame skeletonFrame = skeletonFrameReadyEventArgs.OpenSkeletonFrame())
            {
                if (skeletonFrame != null && this.skeletons != null)
                {
                   //Console.WriteLine(skeletonFrame.SkeletonArrayLength);
                    skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
    
                    // Set skeleton datas from skeletonFrame
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);
    
                    TrackClosestSkeleton();
                    Skeleton[] singleSkeleton = new Skeleton[6];
    
                    Skeleton skl=(from mno in this.skeletons where mno.TrackingState==SkeletonTrackingState.Tracked && mno.TrackingId==globalClosestID select mno).FirstOrDefault();
                    if (skl == null)
                        return;
    
                    //Creating an empty skkeleton
                    Skeleton emptySkeleton = new Skeleton();
    
                    singleSkeleton[0] = skl;        //Pass the Tracked skeleton with closestID
                    singleSkeleton[1] = emptySkeleton;  //Passing Empty Skeleton
                    singleSkeleton[2] = emptySkeleton;  //Passing Empty Skeleton
                    singleSkeleton[3] = emptySkeleton;  //Passing Empty Skeleton
                    singleSkeleton[4] = emptySkeleton;  //Passing Empty Skeleton
                    singleSkeleton[5] = emptySkeleton;  //Passing Empty Skeleton
    
                    this.snew.SkeletonStream.ChooseSkeletons(globalClosestID);
                    var accelerometerReading = this.KinectSensor.AccelerometerGetCurrentReading();
                    this.interactionStream.ProcessSkeleton(singleSkeleton, accelerometerReading, skeletonFrame.Timestamp);
    
                }
            }
        }
    
    int globalClosestID = 0;
        private void TrackClosestSkeleton()
        {
            if (this.snew != null && this.snew.SkeletonStream != null)
            {
                if (!this.snew.SkeletonStream.AppChoosesSkeletons)
                {
                    this.snew.SkeletonStream.AppChoosesSkeletons = true; // Ensure AppChoosesSkeletons is set
                }
    
                float closestDistance = 10000f; // Start with a far enough distance
                int closestID = 0;
    
                foreach (Skeleton skeleton in this.skeletons.Where(s => s.TrackingState != SkeletonTrackingState.NotTracked))
                {
                    if (skeleton.Position.Z < closestDistance)
                    {
                        closestID = skeleton.TrackingId;
                        closestDistance = skeleton.Position.Z;
                    }
                }
    
                if (closestID > 0)
                {
                    this.snew.SkeletonStream.ChooseSkeletons(closestID); // Track this skeleton
                    globalClosestID = closestID;
                }
            }
        }
    

    检查上面的代码它对我有用。它可能对你有帮助。这里是 Kinectsensor。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是跟踪最近的骨架。

      private void TrackClosestSkeleton()
        {
          if (this.kinect != null && this.kinect.SkeletonStream != null)
              {
              if (!this.kinect.SkeletonStream.AppChoosesSkeletons)
              {
              this.kinect.SkeletonStream.AppChoosesSkeletons = true; // Ensure AppChoosesSkeletons is set
              }
      
              float closestDistance = 10000f; // Start with a far enough distance
              int closestID = 0;
      
              foreach (Skeleton skeleton in this.skeletonData.Where(s => s.TrackingState != SkeletonTrackingState.NotTracked))
              {
              if (skeleton.Position.Z < closestDistance)
              {
                closestID = skeleton.TrackingId;
                closestDistance = skeleton.Position.Z;
              }
            }
      
            if (closestID > 0)
            {
              this.kinect.SkeletonStream.ChooseSkeletons(closestID); // Track this skeleton
            }
          }
        }
      

      获取参考here

      像这样使用它:

      private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs skeletonFrameReadyEventArgs)
          {
              // Even though we un-register all our event handlers when the sensor
              // changes, there may still be an event for the old sensor in the queue
              // due to the way the KinectSensor delivers events.  So check again here.
              if (this.KinectSensor != sender)
              {
                  return;
              }
      
              using (SkeletonFrame skeletonFrame = skeletonFrameReadyEventArgs.OpenSkeletonFrame())
              {
                  if (null != skeletonFrame)
                  {
                      try
                      {
                          // Copy the skeleton data from the frame to an array used for temporary storage
                          skeletonFrame.CopySkeletonDataTo(this.skeletons);
                          TrackClosesSkeleton();
                          var accelerometerReading = this.KinectSensor.AccelerometerGetCurrentReading();
      
                          // Hand data to Interaction framework to be processed
                          this.interactionStream.ProcessSkeleton(this.skeletons, accelerometerReading, skeletonFrame.Timestamp);
                      }
                      catch (InvalidOperationException)
                      {
                          // SkeletonFrame functions may throw when the sensor gets
                          // into a bad state.  Ignore the frame in that case.
                      }
                  }
              }
          }
      

      这只是一个快速编辑,所以也许您可以重命名一些变量以使其适合

      【讨论】:

      • 这是正确答案,您也可以使用 OrderByDescending(s => s.Position.Z).FirstOrDefault() 对骨架数据进行排序。相同但更短。
      • Thnx @florent 回复我发现了这个 KinectSensor.DepthStream.MaxDepth 从中我可以检查最大深度 Can I do some thing by using this?
      • @kevin thnx 回复请帮帮我。
      • 100 ,150 等尺寸是多少?这些是您图像上的尺寸还是?您不需要为此使用深度流。
      • 为什么没有帮助?你能用你已经或尝试过的一些代码更新你的帖子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2021-04-04
      • 2021-04-23
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多