Kinect 动作识别组件概要设计
這是數(shù)年前在一個公司做的;Kinect手勢識別的一個DLL,供其他應(yīng)用開發(fā)調(diào)用。
這是概要設(shè)計文檔。可以了解Kinect技術(shù),以及作為文檔寫作的參考。代碼恕不能提供。
?
Kinect 動 作 識 別 組 件 概 要 設(shè) 計
目錄
一. 設(shè)計背景與設(shè)計目的?? ?1
1. 設(shè)計背景?? ?1
2. 設(shè)計目的?? ?1
3. 參考資料?? ?1
二. Kinect技術(shù)概述?? ?1
三.系統(tǒng)的性能與可靠性設(shè)計?? ?1
四.系統(tǒng)運行環(huán)境?? ?2
五.需要識別的身體動作和手勢匯總?? ?2
六. 動作和手勢識別算法設(shè)計概述?? ?2
七.動作和手勢識別算法具體設(shè)計?? ?3
<一>.身體動作識別?? ?3
<二>. 手勢識別?? ?4
八. 類設(shè)計?? ?6
九. 接口設(shè)計?? ?8
十. 異常情況處理?? ?8
一. 設(shè)計背景與設(shè)計目的
1. 設(shè)計背景
體感技術(shù)是通過“傳感器”或者“視覺設(shè)備”對“人的動作”進行捕捉,根據(jù)捕捉到的動作來 “控制應(yīng)用程序”的技術(shù)。
體感技術(shù)應(yīng)用廣泛,例如三維演示,游戲操控,機械控制,健康醫(yī)療,運動監(jiān)測,全息影像等。
2. 設(shè)計目的
設(shè)計一個基于微軟體感技術(shù)(Kinect)的動作識別工具包,包裝為動態(tài)鏈接庫。該工具包既可以在公司內(nèi)部的項目中使用,也可以單獨作為一個產(chǎn)品在市場上銷售。
該工具包完成后,可以識別出各種身體動作和手勢,不同的動作和手勢會產(chǎn)生相應(yīng)的事件,在應(yīng)用程序中檢測到相應(yīng)的事件后進行不同的處理,從而實現(xiàn)用手勢和動作來控制應(yīng)用程序。
3. 參考資料
Windows Kinect SDK文檔和示例;
Kinect應(yīng)用開發(fā)實戰(zhàn)-用最自然的方式與機器對話,機械工業(yè)出版社,余濤著。
二. Kinect技術(shù)概述
Kinect傳感器會產(chǎn)生三種數(shù)據(jù)流,彩色影像數(shù)據(jù),深度數(shù)據(jù),骨骼數(shù)據(jù)。本工具包獲取其骨骼數(shù)據(jù)流,然后根據(jù)獲取到的數(shù)據(jù)進行計算、比較、判斷,來識別出身體的動作和手勢。Kinect傳感器產(chǎn)生每秒30幀的骨骼數(shù)據(jù)流。每幀有全身20個關(guān)節(jié)點的坐標(biāo)位置,每個關(guān)節(jié)點有X、Y、Z三個坐標(biāo)。骨骼空間坐標(biāo)系以米為單位。
三.系統(tǒng)的性能與可靠性設(shè)計
進行動作和手勢的判斷需要進行一定的計算和比較,每秒30幀數(shù)據(jù),在每幀中進行計算和比較,計算和比較要盡量精簡,達(dá)到好的性能。
該工具包需要被別的應(yīng)用程序調(diào)用,所以要有良好的異常處理機制。產(chǎn)生異常情況,要給調(diào)用方相應(yīng)的提示,調(diào)用方可根據(jù)提示進行相應(yīng)處理。
四.系統(tǒng)運行環(huán)境
在硬件方面,需要在電腦上連接微軟Kinect傳感器。
軟件方面,該工具包用C#語言開發(fā),所運行系統(tǒng)為Windows XP 以上版本,需要.NET運行時環(huán)境的支持,并需要Windows Kinect SDK。
五.需要識別的身體動作和手勢匯總
身體動作:身體左傾,身體右傾,身體前傾,身體后傾,左(右)手前伸,左(右)手舉起,左(右)手放下,左(右)手向左(右)伸,左(右)手向右(左)伸,左(右)腳往前,左(右)腳往后,左(右)腳抬起,左(右)腳往左(右),跳,走。
手勢:推,往上揮,往下?lián)],往左揮,往右揮;
縮放手勢,動作為兩手抬起,手高于腕,兩手基本保持平行,兩手逐步向外打開為放大,逐步向里合攏為縮小;
拖動手勢,動作為手朝向屏幕,向各個方向移動;
偏轉(zhuǎn)和旋轉(zhuǎn)手勢,動作為左手放到左肩前,右手向各個方向移動。
六. 動作和手勢識別算法設(shè)計概述
對于單個動作或手勢的識別,算法目前有以下幾種情況:
1 根據(jù)各個關(guān)節(jié)點的相對位置,或某個或某幾個關(guān)節(jié)點相對于某個參考點的相對位置,進行比較來識別是那種動作或手勢,
2 根據(jù)一個關(guān)節(jié)相對于另一個關(guān)節(jié)移動的距離,或一個關(guān)節(jié)點相對于某個參考點移動的距離來識別;
3 計算由某三個關(guān)節(jié)點構(gòu)成的三角形的某個夾角來識別;
4 統(tǒng)計某個關(guān)節(jié)點在某個范圍內(nèi)的移動次數(shù)來判斷;
5 需要定時器來作輔助進行判斷;
首先如果用1和2的算法能完全識別出動作和手勢,就采用1和2,這樣算法簡單、代碼簡潔;
如果識別不出,再考慮3和4,
最后識別不出再考慮5的情況;
七.動作和手勢識別算法具體設(shè)計
<一>.身體動作識別
1 身體左(右)傾
? ? 以中心肩關(guān)節(jié)和中心髖關(guān)節(jié)的X值的差值來判斷,大于某個閾值識別為右傾,否則為左傾;
? ? 觸發(fā)事件后需要拋出的參數(shù):中心肩關(guān)節(jié),中心髖關(guān)節(jié),中心肩關(guān)節(jié)X值,中心髖關(guān)節(jié)X值。
2. 身體前(后)傾
? ? 以中心肩關(guān)節(jié)和中心髖關(guān)節(jié)的Z值的差值來判斷,大于某個閾值識別為后傾,反之為前傾;
? ? 觸發(fā)事件后需要拋出的參數(shù):中心肩關(guān)節(jié),中心髖關(guān)節(jié),中心肩關(guān)節(jié)Z值,中心髖關(guān)節(jié)Z值。
3 左(右)手前伸
以肩關(guān)節(jié)和手關(guān)節(jié)的Z值的差值來判斷,大于某個閾值識別為前伸;
觸發(fā)事件后需要拋出的參數(shù):左(右)關(guān)節(jié),左(右)肩關(guān)節(jié),左(右)關(guān)節(jié)Z值,左(右)肩關(guān)節(jié)Z值。
4 左(右)手舉起
? ? 以手關(guān)節(jié)和肩關(guān)節(jié)的Y值的差值來判斷,小于某個閾值識別為手舉起;
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),左(右)肩關(guān)節(jié),左(右)手關(guān)節(jié)Y值,左(右)肩關(guān)節(jié)Y值。
5 左(右)手放下
? ? 以手關(guān)節(jié)和肩關(guān)節(jié)的Y值的差值來判斷,大于某個閾值識別為手放下;
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),左(右)肩關(guān)節(jié),左(右)手關(guān)節(jié)Y值,左(右)肩關(guān)節(jié)Y值。
6 左手向右伸,右手向左伸
以手交錯過身體到肩膀的距離來判斷,左手關(guān)節(jié)與右肩關(guān)節(jié)X值小于一定域值,識別為左手向右伸,反之為右手向左伸;
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),右(左)肩關(guān)節(jié),左(右)手關(guān)節(jié)X值,右(左)肩關(guān)節(jié)X值。
7 左手向左伸,右手向右伸
以手到肩膀的距離來判斷,左肩關(guān)節(jié)與左手關(guān)節(jié)X值的差值大于一定域值,識別為左手向左伸,右手關(guān)節(jié)與右肩關(guān)節(jié)X值的差值大于一定域值,識別為右手向右伸;
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),左(右)肩關(guān)節(jié),左(右)手關(guān)節(jié)X值,左(右)肩關(guān)節(jié)X值。
8. 左(右)腳往前
以左(右)腳關(guān)節(jié)(Foot Left, Foot Right)與脊關(guān)節(jié)(Spine)的Z值的差值來判斷,脊關(guān)節(jié)與左腳關(guān)節(jié)Z值的差值大于某個域值,識別為左腳向前伸,反之為右腳向前伸;
觸發(fā)事件后需要拋出的參數(shù):左(右)腳關(guān)節(jié),脊關(guān)節(jié),左(右)腳關(guān)節(jié)Z值,脊關(guān)節(jié)Z值。
9. 左(右)腳往左(右)
以左(右)腳關(guān)節(jié)與中心髖關(guān)節(jié)的X值的差異來識別,中心髖關(guān)節(jié)與左腳關(guān)節(jié)的X值的差值大于某個域值識別為左腳往左伸,右腳關(guān)節(jié)與中心髖關(guān)節(jié)的X值的差值大于某個域值識別為右腳向右伸;
觸發(fā)事件后需要拋出的參數(shù):左(右)腳關(guān)節(jié),中心髖關(guān)節(jié),左(右)腳關(guān)節(jié)X值,中心髖關(guān)節(jié)X值。
10. 左(右)腳往后
以左(右)腳關(guān)節(jié)(Foot Left, Foot Right)與脊關(guān)節(jié)(Spine)的Z值的差值來判斷,左(右)腳關(guān)節(jié)與脊關(guān)節(jié)的Z值的差值大于某個域值,識別為左(右)腳往后;
觸發(fā)事件后需要拋出的參數(shù):左(右)腳關(guān)節(jié),脊關(guān)節(jié),左(右)腳關(guān)節(jié)Z值,脊關(guān)節(jié)Z值。
11. 左(右)腳抬起?
以左和右腳關(guān)節(jié)Y值的差值來判斷,左腳Y值大于右腳Y值超過某個域值識別為左腳抬起,右腳Y值大于左腳Y值超過某個閾值識別為右腳抬起;
觸發(fā)事件后需要拋出的參數(shù):左腳關(guān)節(jié),右腳關(guān)節(jié),左腳關(guān)節(jié)Y值,右腳關(guān)節(jié)Y值。
12. 跳
以兩腳關(guān)節(jié)同時離開地板的距離來判斷,超過某個閾值識別為跳;
觸發(fā)事件后需要拋出的參數(shù):左腳關(guān)節(jié),右腳關(guān)節(jié),左腳關(guān)節(jié)Y值,右腳關(guān)節(jié)Y值,地板位置。
13. 走
方法一:統(tǒng)計一個腳關(guān)節(jié)Y值高于另一個腳關(guān)節(jié)Y值的次數(shù),達(dá)到一定的域值次數(shù)識別為走;
觸發(fā)事件后需要拋出的參數(shù):一個腳關(guān)節(jié)高于另一個腳關(guān)節(jié)的次數(shù),左腳關(guān)節(jié),右腳關(guān)節(jié)。
方法二:以脊關(guān)節(jié)移動的距離來判斷,大于一定閾值識別為走,脊關(guān)節(jié)X值減小、增大判走動方向為左、右走動,脊關(guān)節(jié)Z值減小、增大判走動方向為前、后走動;
觸發(fā)事件后需要拋出的參數(shù):脊關(guān)節(jié),脊關(guān)節(jié)X值,脊關(guān)節(jié)Z值,走動方向。
<二>. 手勢識別
1. 推手勢
探測手勢在Z軸負(fù)方向的移動距離,大于某個域值識別為檢測到推手勢。
觸發(fā)事件后需要拋出的參數(shù):手關(guān)節(jié),手關(guān)節(jié)Z值。
2. 往上揮
探測左(右)手在Y軸方向的移動距離,大于某個域值識別為檢測到往上揮;
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),左(右)手關(guān)節(jié)Y值。
3. 往下?lián)]
? ? 探測左(右)手在Y軸負(fù)方向的移動距離,大于某個域值識別為檢測到往下?lián)];
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),左(右)手關(guān)節(jié)Y值。
4. 往左揮
探測左手在X軸方向的移動距離,大于某個域值識別為檢測到往左揮;
觸發(fā)事件后需要拋出的參數(shù):左手關(guān)節(jié),左手關(guān)節(jié)X值。
5. 往右揮
探測右手在X軸負(fù)方向的移動距離,大于某個域值識別為檢測到往右揮;
觸發(fā)事件后需要拋出的參數(shù):右手關(guān)節(jié),右手關(guān)節(jié)X值。
6. 畫圈
以左(右)手的肘關(guān)節(jié)為中心,連續(xù)檢測五個點:第一點 - 手關(guān)節(jié)Y值大于肘關(guān)節(jié)Y值一定值且手關(guān)節(jié)X值與肘關(guān)節(jié)X值的差值小于一個很小的值,第二點 -手關(guān)節(jié)Y值與肘關(guān)節(jié)Y值的差值小于一個很小的值且手關(guān)節(jié)X值大于肘關(guān)節(jié)X值一定值,第三點 – 手關(guān)節(jié)Y值小于肘關(guān)節(jié)Y值一定值且手關(guān)節(jié)X值與肘關(guān)節(jié)X值的差值小于一個很小的值,第四點 -手關(guān)節(jié)Y值與肘關(guān)節(jié)Y值的差值小于一個很小的值且手關(guān)節(jié)X值小于肘關(guān)節(jié)X值一定值,第五點 – 即第一個點;
連續(xù)檢測到此五個點,則識別為左(右)手畫圈;
觸發(fā)事件后需要拋出的參數(shù):五個點時手和肘關(guān)節(jié)的X和Y坐標(biāo),共10個值。
7. 左(右)手揮手
以左(右)手的肘關(guān)節(jié)為中心,統(tǒng)計手關(guān)節(jié)在肘關(guān)節(jié)附件來回移動的次數(shù),達(dá)到一定次數(shù)時識別為揮左(右)手;
觸發(fā)事件后需要拋出的參數(shù):左(右)手關(guān)節(jié),左(右)肘關(guān)節(jié),來回移動次數(shù)。
8. 縮放手勢
左右手關(guān)節(jié)均高于左右腕關(guān)節(jié),左右手關(guān)節(jié)均低于左右肩關(guān)節(jié),識別為縮放手勢;
觸發(fā)事件后需要拋出的參數(shù):左手關(guān)節(jié),右手關(guān)節(jié),左手關(guān)節(jié)X值,右手關(guān)節(jié)X值。
9. 拖動手勢
檢測到右手移動,且右手關(guān)節(jié)和右腕關(guān)節(jié)的差值小于一定值,則判為拖動;
觸發(fā)事件后需要拋出的參數(shù):右手關(guān)節(jié),右腕關(guān)節(jié),右手關(guān)節(jié)X值。
10. 旋轉(zhuǎn)和偏轉(zhuǎn)手勢
計算左手關(guān)節(jié)和左肩關(guān)節(jié)的X、Y、Z坐標(biāo)的差值,如果均小于一定域值,則識別為旋轉(zhuǎn)和偏轉(zhuǎn);
觸發(fā)事件后需要拋出的參數(shù):左手關(guān)節(jié),左肩關(guān)節(jié),右手關(guān)節(jié),右手關(guān)節(jié)X值,右手關(guān)節(jié)Y值。
八. 類設(shè)計
身體動作識別和其拋出的事件封裝為一個類ActionRecognize,手勢識別和其拋出的事件封裝為一個類GestureRecognize,事件參數(shù)封裝為一個類RecognizeEventArg,所用到的計算作為幫助類封裝為一個類KinectHelper。
?
?
九. 接口設(shè)計
此處主要是外部的調(diào)用接口。在調(diào)用程序中注冊本DLL的事件,然后檢測手動作或手勢對應(yīng)的事件,等同于識別到相應(yīng)的手勢,然后就可以根據(jù)自己的需要進行自己的處理,還可以根據(jù)事件所傳遞的參數(shù)做一些更細(xì)致的處理。事件所傳遞的參數(shù),是一到數(shù)個關(guān)節(jié),和關(guān)節(jié)的具體的某個X或Y或Z坐標(biāo),以及其他一些必要的數(shù)值,還需要說明關(guān)節(jié)的數(shù)量和類型。所以在事件參數(shù)中需要傳遞:關(guān)節(jié)數(shù)量,關(guān)節(jié)類型數(shù)組,關(guān)節(jié)數(shù)組,關(guān)節(jié)的具體X、Y、Z值,一些必要的數(shù)值。
十. 異常情況處理
? ? Kinect傳感器設(shè)備的連接或未連接等情況,以及Kinect傳感器的設(shè)備狀態(tài),由調(diào)用方自行處理。其他異常通過事件參數(shù)傳遞該調(diào)用方。
?
總結(jié)
以上是生活随笔為你收集整理的Kinect 动作识别组件概要设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于联通短信发送程序(SGIP协议)没有
- 下一篇: using 指令是不需要的和其他两个C#