在我上一篇博客中:http://blog.csdn.net/soft2buy/article/details/6589326
介紹了一個用微軟的Kinect Sensor 捕捉雙手動作的簡單例子。今天我給大家介紹用Kinect來進行操作者手勢的識別。
看完本篇文章,你可以使用C#(WPF)程序來判斷操作者左右手的幾個手勢:
1.從左 到右揮動
2.從右到左揮動
3.從后到前(按下動作)
4.從前到后(按下后離開)
要正確運行本文的程序,你需要下載和安裝:
1.Kinect for Windows SDK
http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx
2.Microsoft XNA Game Studio 4.0
http://www.microsoft.com/download/en/details.aspx?id=23714
因為我們要利用XNA來計算雙手的X,Y,Z坐標。
3.微軟最新版的Kinect Toolkit :
http://kinecttoolkit.codeplex.com/
微軟最新版的Kinect Toolkit 還有很多其他的動作,比如 SwipeToLeft(左下擺),SwipeToRight(右下擺),LeftHello(左手揮手),RightHello(右手揮手)動作,大家有興趣可以自己好好研究,本篇文章不做解釋。
唯一不足的是,沒有LeftToRight(左到右揮手)和RightToLeft(右到左揮手),FrontToBack(按下動作),BackToFront(離開動作),我們知道這4個動作是非常有用的。前兩個可以用在界面圖片或文章的上下翻頁,而后兩個可以用來選擇所需要的圖片或者文章。
所以我在微軟的Kinect Toolkit里添加了這兩個動作的支持,代碼如下:
大家可以在Gestures/SwipeGestureDetector.cs
內(nèi)添加:
void LookForGesture()
{
// 左到右
if (ScanPositions((p1, p2) => Math.Abs(p2.Y - p1.Y) < 0.20f, (p1, p2) => p2.X - p1.X > - 0.01f , (p1, p2) => Math.Abs(p2.X - p1.X) > 0.2f, 250, 2500))
{
RaiseGestureDetected(“LeftToRight”);
return;
}
// 右到左
if (ScanPositions((p1, p2) => Math.Abs(p2.Y - p1.Y) < 0.20f, (p1, p2) => p2.X - p1.X < 0.01f, (p1, p2) => Math.Abs(p2.X - p1.X) > 0.2f, 250, 2500))
{
RaiseGestureDetected(“RightToLeft”);
return;
}
// 后到前
if (ScanPositions((p1, p2) => Math.Abs(p2.Y - p1.Y) < 0.15f, (p1, p2) => p2.Z - p1.Z < 0.01f, (p1, p2) => Math.Abs(p2.Z - p1.Z) > 0.2f, 250, 2500))
{
RaiseGestureDetected(“BackToFront”);
return;
}
// 前到后
if (ScanPositions((p1, p2) => Math.Abs(p2.Y - p1.Y) < 0.15f, (p1, p2) => p2.Z - p1.Z > -0.04f, (p1, p2) => Math.Abs(p2.Z - p1.Z) > 0.4f, 250, 2500))
{
RaiseGestureDetected(“FrontToBack”);
return;
}
}
我們稍微修改下上一篇文章的代碼:
void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
SkeletonFrame skeletonFrame = e.SkeletonFrame;
foreach (SkeletonData data in skeletonFrame.Skeletons)
{
if (SkeletonTrackingState.Tracked == data.TrackingState)
{
foreach (Joint joint in data.Joints)
{
Point jointPos = getDisplayPosition(joint);
//判斷左手或右手的手勢
switch (joint.ID)
{
case JointID.HandLeft://左手
if (joint.Position.W > 0.6f) //準確概率>0.6,1.0f 為100% 準確
leftHandGestureRecognizer.Add(joint.Position.ToVector3());
break;
case JointID.HandRight://右手
if (joint.Position.W > 0.6f) //準確概率>0.6,1.0f 為100% 準確
rightHandGestureRecognizer.Add(joint.Position.ToVector3());
break;
}
}
}
}
}
下面就可以接收手勢判斷的事件了:
#region 手勢判斷
void rightHandGestureRecognizer_OnGestureDetected(SupportedGesture gesture)//右手手勢
{
switch (gesture)
{
case SupportedGesture.LeftToRight:
_receiveGestures("右手:從左到右");
break;
case SupportedGesture.RightToLeft:
_receiveGestures("右手:從右到左");
break;
case SupportedGesture.BackToFront:
_receiveGestures("右手:從后到前");
break;
case SupportedGesture.FrontToBack:
_receiveGestures("右手:從前到后");
break;
}
}
void leftHandGestureRecognizer_OnGestureDetected(SupportedGesture gesture)//左手手勢
{
switch (gesture)
{
case SupportedGesture.LeftToRight:
_receiveGestures("左手:從左到右");
break;
case SupportedGesture.RightToLeft:
_receiveGestures("左手:從右到左");
break;
case SupportedGesture.BackToFront:
_receiveGestures("左手:從后到前");
break;
case SupportedGesture.FrontToBack:
_receiveGestures("左手:從前到后");
break;
}
}
#endregion
KinectLib for Xbox 360 (含 驅(qū)動)
作者做的范例視頻:
//v.youku.com/v_show/id_XMjkxODc3NzEy.html