【问题标题】:How to detect 1 Skeleton at a time from Kinect?如何从 Kinect 一次检测 1 个骨架?
【发布时间】:2014-04-02 05:36:24
【问题描述】:

我正在使用 Kinect 创建一个应用程序,我想一次只跟踪一个人,现在如果有人进入 Kinect 范围内,Kinect 就会开始检测另一个人。我编写了以下代码,它可以检测到任何进入 Kinect 范围的人。请告诉我如何将其限制为一次仅检测 1 个人。

        /*------------------------------------------
         * SKELETON JOINTS
        --------------------------------------------
         */
        Skeleton[] _skeletons = new Skeleton[0];


        using (SkeletonFrame usingSkeletonFrame = e.OpenSkeletonFrame())
        {
            if (usingSkeletonFrame != null)
            {
               _skeletons = new Skeleton[usingSkeletonFrame.SkeletonArrayLength];
               usingSkeletonFrame.CopySkeletonDataTo(_skeletons);


            }                
        }



        if(_skeletons.Length >0)            
        //  if (_skeletons.Length == SkeletonTrackingState.Tracked)
        {



            isSkeleton = true;
            foreach (Skeleton skl in _skeletons)
            {
                if (skl.TrackingState == SkeletonTrackingState.Tracked)
                {

                    // string str = "";

                    Joint shoulderCenter = skl.Joints[JointType.ShoulderCenter];
                    Joint rightShoulder = skl.Joints[JointType.ShoulderRight];
                    leftShoulder = skl.Joints[JointType.ShoulderLeft];
                    Joint Head = skl.Joints[JointType.Head];

【问题讨论】:

  • 你看过 Skeleton 类的TrackingId 属性了吗?
  • 我想你得到了答案here

标签: c# visual-studio-2010 visual-studio kinect kinect-sdk


【解决方案1】:

我会看到 this answer 我在另一个问题上写的。

int trackingID;
skeletonTracked = new Skeleton();
bool first = true;
Skeleton skeleton;
Skeleton[] skeletons = new Skeleton[6];

...

public void AllFramesReady(object sender, AllFramesReadyEventArgs e)
{
    using (SkeletonFrame sFrame = e.OpenSkeletonFrame())
    {
        sFrame.CopySkeletonDataTo(skeletons);
        skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();
        if (skeleton == null)
            return;

        if (skeleton.TrackingState == SkeletonTrackingState.Tracked)
        {
            if (first)
            {
                skeletonTracked = skeleton;
                trackingId = skeleton.TrackingID;
                ...
                first = false;
            }

            if (skeleton.TrackingID == trackingId)
            {
                ...
            }
        }
    }

【讨论】:

  • 非常感谢..我已经实现了你的代码,但是现在当我运行程序时,我收到了以下错误消息。 Object reference not set to an instance of an object.SFrame.CopySkeletonDataTo(skeletons); 线上。图片->postimg.org/image/l3yu35b7h
  • @TahaKirmani 变量应该是全局的并在文件顶部定义。其余代码应在AllFramesReady 事件中。
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多