這一期我們將一起來探討揮動手勢的設計
揮動可以說是手勢識別的一大重點
除了第三期說的點擊以外,最常用的就是揮動了,常見的有揮手、拖拉等
—我是目錄—
動作識別
手勢
|- 觸碰
|- 揮動
|- 觸發機制
|- 雙手縮放
姿勢
|- 關鍵知識
|- 設計方案
|- 前景與限制
—目錄結束—
揮手
我們經常有一種需求,就是希望通過特定的動作“喚醒”設備,讓設備登陸用戶或者響應用戶接下來的動作。
揮手就是一種很好的Say Hi的方式,那麼怎麼來實現呢?
首先我們知道,微軟的Kinect SDK把人的關節點分爲20個關節。
於是一種簡單的實現就是通過關節點的X軸位置(如handLeft.X和elbowLeft.X)來判斷
利用一個自動生成時間戳的鏈表,我們就可以知道當它們的X軸在什麼時候重合
通過在檢查在特定時間內,有多少個時間戳,就可以得知手揮動了多少次。
更進一步的,我們希望elbow.Y 在hand.Y上方時才視爲一次有效的擺手,這樣就避免了下襬手的誤觸發。
當然,也可以限制elbow.Z比hand.Z 遠,這樣就避免了背身時的觸發。
拖拉
有了揮手做基礎,拖拉就更好理解了。
之前我們說過,人手臂的活動有一個範圍限制。
於是我們可以把圖中藍色的空間用二元一次方程(y=ax+b)映射到屏幕上
具體的,針對不同人羣,這個空間到底該設多大呢?
如果採用固定的像素點數,考慮到大人/小孩、遠/近等差別,顯然很難取出合適的寬高值。
美術中有“頭身”這個概念,通過這個粗略的估算,程序很快就能截取出適合自己的空間範圍。
首先,人體平均的的身高爲7個半頭身(注:若套用模型時請注意藝術中通常用8頭身),即身高約等於7個半頭部的高度。
其次,鎖骨到腰部爲2頭,這個距離也等同於上頸部到上臀部。
水平方向上,左右肩寬約爲2頭
據此,我們通過獲取用戶shoulderLeft到shoulderRight的距離(也可以是其他關節),取2頭作爲單位,配合關節點做參考點(可採用不容易受手勢影響的點,如shoulderCenter),很快就可以根據前面藍色的圖取出大致合適的控件,剩下的就是優化的工作了。
比較常見的做法是選取一個1:1大小的控件,然後映射到1:1或者4:3的屏幕上,具體比例問題可以由方程控制。
此時當我們的手在指定空間內移動時,就充當了“鼠標”的指向作用,有了這個功能,再配合特定的觸發機制就可以完成拖拉等手勢。
小結
由於這些手勢的判斷多爲幀間運算,我們需要時刻注意避免使用過於複雜的算法,否則每秒60次的運算有可能會拖垮CPU,造成嚴重的延遲。從最簡單的方法開始,根據實際情況不斷優化是一個很好的發現合適算法的途徑。
下一期我們將一起探討觸發機制的問題
謝謝觀賞
轉載自http://www.kinectutorial.com/?p=824本人純粹是收藏,方便以後查看~