我在C#中使用Kinect SDK和WPF创建了一个Kinect应用程序。
我想创建一个简单的静态手势识别方法,当用户在运行时通过'Head'(JointID.HandRight
)关节提升'rightHand'(JointID.Head
)关节时输出Messagebox。 / p>
我知道我需要为这个手势创建一个定义,并在每次触发SkeletonFrameReady事件时对着骨架运行。是否有人可以帮助解决这个问题,或者指出我需要存储/比较哪些骨架数据,我将非常感激,谢谢。
答案 0 :(得分:2)
我认为你必须在每一轮线程中将右手的初始位置与右手的当前位置进行比较。例如,如果要查看右手是否有凸起,则必须比较x和y位置。我希望我理解你的问题。抱歉我的英文!
答案 1 :(得分: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!");
}
}