分享

kinect2.0的骨骼节点坐标的获取与handstate

 流水晨香 2016-09-29

kinect2.0的骨骼追踪相比较上一代算是有了大幅度提升,最多可以同时追踪6个人身上的25个骨骼节点(图为v1和v2的对比)


其实单纯的获取骨骼节点的坐标还是很简单的,我就讲一下在控制台程序中实时的输出骨骼坐标的方法吧

当然 只要需要调用kinect 第一步肯定是添加引用


因为所声明的变量在获取骨骼的监听事件中还要调用 ,所以需要声明为全局静态变量,首先还是要声明个kinectsensor

  1. public static KinectSensor kinect;  
  2. public static BodyFrameReader bodyframereader;  
  3. public static Body[] bodies = null;  
变量声明完,下一步就应该获取并打开传感器了

  1. kinect = KinectSensor.GetDefault();  
  2. kinect.Open();  
然后开始读入数据

  1. bodyframereader = kinect.BodyFrameSource.OpenReader();  
  2. if (bodyframereader != null)  
  3. {  
  4.                 bodyframereader.FrameArrived +=       Bodyframereader_FrameArrived;  
  5.  }  

  1. private static void Bodyframereader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)  
  2. {  
  3.     bool data = false;  
  4.     using (BodyFrame bodyframe = e.FrameReference.AcquireFrame())  
  5.     {  
  6.         if (bodyframe != null)  
  7.         {  
  8.             if (bodies == null)  
  9.             {  
  10.                 bodies = new Body[bodyframe.BodyCount];  
  11.             }  
  12.   
  13.         }  
  14.         bodyframe.GetAndRefreshBodyData(bodies);  
  15.         data = true;  
  16.     }  
  17.     if (data)  
  18.     {  
  19.         foreach (Body body in bodies)  
  20.         {  
  21.             if (body.IsTracked)  
  22.             {  
  23.                 IReadOnlyDictionary<JointType, Joint> joints = body.Joints;  
  24.                 CameraSpacePoint position = joints[JointType.HandRight].Position;  
  25.                 Console.WriteLine(position.X.ToString() + "," + position.Y.ToString() + "," + position.Z.ToString());  
  26.                 CameraSpacePoint position2 = joints[JointType.ShoulderRight].Position;  
  27.                 Console.WriteLine(position2.X.ToString() + "," + position2.Y.ToString() + "," + position2.Z.ToString());  
  28.                 Console.WriteLine();  
  29.                   
  30.   
  31.             }  
  32.         }  
  33.   
  34.   
  35.     }  
  36. }  



插上kinect运行就可以看到输出了


在此基础上想要得到handstate也就是手势 也就是几行代码了

类似  在

  1. if (body.IsTracked)的大括号下添加  
  1. if (body.HandRightState == HandState.Closed)  
  2.     Console.WriteLine("close\n\n");  
  3. if (body.HandRightState == HandState.Open)  
  4.     Console.WriteLine("open\n\n");  
  5. if (body.HandRightState == HandState.Lasso)  
  6.     Console.WriteLine("lesso\n\n");  

t同时把上面的输出给注释掉(全选后ctrl+k+c可以快速注释 ,ctrl+k+u取消注释)

运行后对着kinect把右手合上张开就可以看到输出了,还有那个lesso ,完全合上是close 完全张开是open 其他情况就都是lesso了

附上全部handstate

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多