使用Kinect为简单的静态手势创建手势定义

本文关键字:创建 定义 静态 Kinect 简单 使用 | 更新日期: 2023-09-27 18:25:26

我使用C#中的Kinect SDK和WPF创建了一个Kinect应用程序。

我想创建一个简单的静态手势识别方法,当用户在运行时将"右手"(JointID.HandRight)关节举过"头"(JointID.Head)关节时,该方法会输出一个Messagebox。

我知道我需要为这个手势创建一个定义,并在每次SkeletonFrameReady事件启动时对骨骼运行这个定义。有谁能帮我做这件事,或者为我指明正确的方向,告诉我需要存储/比较什么样的骨架数据,我将不胜感激,谢谢。

使用Kinect为简单的静态手势创建手势定义

我认为每一轮线程都必须将右手的初始位置与右手的当前位置进行比较。例如,如果你想看看你的右手是否抬起,你必须比较x和y的位置。我希望我已经理解了你的问题。对不起我的英语!

在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!");
    }
}