2016-07-05 103 views
2

我正在用kinect设备开发一个手势应用程序。在这里,我正在用X,y,z坐标检查手势。什么是XYZ坐标骨骼与kinect的本质是什么

我想知道特定手势骨架的性质。我正在检查手势是否推手。

private handpush() 
{ 

bool MovedFront = false; 
float refDistance = 0.2F; 


SkeletonPoint refPos = SkeletonHistory[0].Joints[JointType.ShoulderCenter].Position; 
SkeletonPoint startPos = SkeletonHistory[0].Joints[JointType.HandRight].Position; 

//printing all intial cordinates 

Console.WriteLine(" ShoulderCenter[0].Z = " + refPos.Z); 

Console.WriteLine(" HandRight[0].X = " + startPos.X); 
Console.WriteLine(" HandRight[0].Y = " + startPos.Y); 
Console.WriteLine(" HandRight[0].Z = " + startPos.Z); 


    for (int i = 20; i < SkeletonHistory.Count; i++) 
    { 
      Console.WriteLine(" ShoulderCenter[i].Z = " + SkeletonHistory[i].Joints[JointType.ShoulderCenter].Position.Z); 
      Console.WriteLine(" HandRight[i].X = " + SkeletonHistory[i].Joints[JointType.HandRight].Position.X); 
      Console.WriteLine(" HandRight[i].Y = " + SkeletonHistory[i].Joints[JointType.HandRight].Position.Y); 
      Console.WriteLine(" HandRight[i].Z = " + SkeletonHistory[i].Joints[JointType.HandRight].Position.Z); 


      if (!(SkeletonHistory[i].Joints[JointType.HandRight].Position.Y < SkeletonHistory[i].Joints[JointType.Head].Position.Y && 
        Math.Abs(SkeletonHistory[i].Joints[JointType.ShoulderCenter].Position.Z - refPos.Z) < 0.05F && 
        Math.Abs(SkeletonHistory[i].Joints[JointType.HandRight].Position.Y - startPos.Y) < 0.1F && 
        Math.Abs(SkeletonHistory[i].Joints[JointType.HandRight].Position.X - startPos.X) < 0.1F)) 
      { 
       Console.WriteLine("CheckHandPush breaking !!"); 
       break; 
      } 

      if (SkeletonHistory[i].Joints[JointType.HandRight].Position.Z <= (startPos.Z - refDistance)) 
      { 
       Console.WriteLine("CheckHandPush sucess"); 
       bMovedFront = true; 
       temp_SkeletonHistory.Clear(); 
      } 
    } 

    return MovedFront; 
} 

但我正在逐渐INTIAL值,如:

输出:

ShoulderCenter[0].Z = 1.246491 
HandRight[0].X = 0.1519185 
HandRight[0].Y = -0.2328865 
HandRight[0].Z = 1.014945 

ShoulderCenter[i].Z = 1.248788 
HandRight[i].X = 0.1397971 
HandRight[i].Y = -0.2452036 
HandRight[i].Z = 1.054223 

----- 
ShoulderCenter[0].Z = 1.26865 
HandRight[0].X = 0.1545139 
HandRight[0].Y = -0.3375102 
HandRight[0].Z = 1.057466 

ShoulderCenter[i].Z = 1.25049 
HandRight[i].X = 0.09602752 
HandRight[i].Y = -0.283217 
HandRight[i].Z = 1.150237 


--- 

ShoulderCenter[0].Z = 1.243356 
HandRight[0].X = 0.1406149 
HandRight[0].Y = -0.2458241 
HandRight[0].Z = 1.065399 

ShoulderCenter[i].Z = 1.250542 
HandRight[i].X = 0.1392216 
HandRight[i].Y = -0.2418006 
HandRight[i].Z = 1.046706 

我推着我的手,让Z轴应增加值或减少值?是指Z坐标长度是从运动装置还是人体开始的?

手推是否适合这种情况?有什么建议么 ?我可以得到一个示例代码?

任何有用的链接x,y,z坐标检查手推,手拉?

我对坐标检查感到困惑。

回答

3

这些值是在Kinect的V2米“Camera Space”(有链接的页面上漂亮的图片):

摄像机空间是指的Kinect使用的3D坐标系。的坐标系统被定义为如下:

  • 的原点(x = 0,Y = 0,Z = 0)位于在IR传感器的上Kinect的中心
  • X生长到传感器的左
  • ÿ长大(注意,此方向是基于传感器的倾斜)
  • 中的Z传感器面向
  • 1单元=1米
方向生长出

因此,当您站在相机的前方并将手推向它时,Z值应该降低。
要根据用户位置&方向获取坐标,您必须自己旋转并转换坐标。

+0

太好了。感谢Henning。我了解了坐标系统。现在我可以编写手推算法 – user2986042