2012-02-22 76 views
1

我已经在C#中使用Kinect SDK和WPF创建了Kinect应用程序。使用Kinect创建简单静态手势的手势定义

我要创建当用户在他们的“头部”在运行时(JointID.Head)联合提高了他们的“右手”(JointID.HandRight)接头,其输出一个MessageBox一个简单的静态手势识别方法。

我知道我需要为此手势创建一个定义,并在每次触发SkeletonFrameReady事件时对骨架执行此操作。有没有人可以帮助解决这个问题,或者指出我需要存储/比较哪些骨架数据,我会非常感谢,谢谢。

回答

2

我认为你必须比较你的右手的每一轮的右手的当前位置的右手的初始位置。例如,如果你想看看你的右手是否抬起,你必须比较x和y的位置。我希望我能理解你的问题。对不起我的英语不好!

2

在MS SDK V1中,您必须使用JointType而不是JointID。这是一个非常简单的示例。

//this event fires when Color/Depth/Skeleton are synchronized 
void newSensor_AllFramesReady(object sender, AllFramesReadyEventArgs e) 
{ 
    //Get a skeleton 
    Skeleton skeleton = GetFirstSkeleton(e); 

    if (skeleton == null) 
    { 
     return; 
    } 
    else if (skeleton != null) 
    { 
     checkHand(skeleton.Joints[JointType.Head], skeleton.Joints[JointType.HandRight], skeleton.Joints[JointType.HandLeft]); 
    } 
} 

Skeleton GetFirstSkeleton(AllFramesReadyEventArgs e) 
{ 
    using (SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame()) 
    { 
     if (skeletonFrameData == null) 
     { 
      return null; 
     } 

     skeletonFrameData.CopySkeletonDataTo(allSkeletons); 

     //get the first tracked skeleton 
     Skeleton first = (from s in allSkeletons 
          where s.TrackingState == SkeletonTrackingState.Tracked 
          select s).FirstOrDefault(); 

     return first; 
    } 
} 

public void checkHand(Joint head, Joint rhand, Joint lhand) 
{ 
    if (rhand.Position.Y > head.Position.Y) 
    { 
     MessageBox.Show("Right hand up!"); 
    } 
    else if (lhand.Position.Y > head.Position.Y) 
    { 
     MessageBox.Show("Left hand up!"); 
    } 
}