国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用微軟Kinect進行手勢識別操作的一個簡單范例(2)(WPF
2011-07-29 00:17 8265人閱讀 評論(9) 收藏 舉報

在我上一篇博客中: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

 


 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Unity + Kinect基本上所有的手勢二次封裝(一)
Kinect OpenNI學(xué)習(xí)筆記之7(OpenNI自帶的類實現(xiàn)手部跟蹤)
C#動手實踐:Kinect V2 開發(fā)(3): V2中的大殺器
都2012了,你還在用遙控器? | 科學(xué)人 | 果殼網(wǎng) 科技有意思
Gesture
借助Kinect,你的浴缸可“變成”一個超大的液體觸摸屏 | 36氪
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服