【Alex專欄】Kinect應用設計4

這一期我們將一起來探討揮動手勢的設計

揮動可以說是手勢識別的一大重點

除了第三期說的點擊以外,最常用的就是揮動了,常見的有揮手、拖拉等

—我是目錄—

動作識別

手勢

|- 觸碰

|- 揮動

|- 觸發機制

|- 雙手縮放

姿勢

|- 關鍵知識

|- 設計方案

|- 前景與限制

—目錄結束—

 

揮手

我們經常有一種需求,就是希望通過特定的動作“喚醒”設備,讓設備登陸用戶或者響應用戶接下來的動作。

揮手就是一種很好的Say Hi的方式,那麼怎麼來實現呢?

首先我們知道,微軟的Kinect SDK把人的關節點分爲20個關節。

圖片1

於是一種簡單的實現就是通過關節點的X軸位置(如handLeft.X和elbowLeft.X)來判斷

利用一個自動生成時間戳的鏈表,我們就可以知道當它們的X軸在什麼時候重合

Alex_一種揮手的檢測方法圖解

通過在檢查在特定時間內,有多少個時間戳,就可以得知手揮動了多少次。

更進一步的,我們希望elbow.Y 在hand.Y上方時才視爲一次有效的擺手,這樣就避免了下襬手的誤觸發。

當然,也可以限制elbow.Z比hand.Z 遠,這樣就避免了背身時的觸發。

 

拖拉

有了揮手做基礎,拖拉就更好理解了。

之前我們說過,人手臂的活動有一個範圍限制。

clipboard

於是我們可以把圖中藍色的空間用二元一次方程(y=ax+b)映射到屏幕上

具體的,針對不同人羣,這個空間到底該設多大呢?

如果採用固定的像素點數,考慮到大人/小孩、遠/近等差別,顯然很難取出合適的寬高值。

美術中有“頭身”這個概念,通過這個粗略的估算,程序很快就能截取出適合自己的空間範圍。

首先,人體平均的的身高爲7個半頭身(注:若套用模型時請注意藝術中通常用8頭身),即身高約等於7個半頭部的高度。

其次,鎖骨到腰部爲2頭,這個距離也等同於上頸部到上臀部。

clipboard[6]clipboard[8]

水平方向上,左右肩寬約爲2頭

clipboard[10]

據此,我們通過獲取用戶shoulderLeft到shoulderRight的距離(也可以是其他關節),取2頭作爲單位,配合關節點做參考點(可採用不容易受手勢影響的點,如shoulderCenter),很快就可以根據前面藍色的圖取出大致合適的控件,剩下的就是優化的工作了。

比較常見的做法是選取一個1:1大小的控件,然後映射到1:1或者4:3的屏幕上,具體比例問題可以由方程控制。

此時當我們的手在指定空間內移動時,就充當了“鼠標”的指向作用,有了這個功能,再配合特定的觸發機制就可以完成拖拉等手勢。

 

小結

由於這些手勢的判斷多爲幀間運算,我們需要時刻注意避免使用過於複雜的算法,否則每秒60次的運算有可能會拖垮CPU,造成嚴重的延遲。從最簡單的方法開始,根據實際情況不斷優化是一個很好的發現合適算法的途徑。

下一期我們將一起探討觸發機制的問題

謝謝觀賞 微笑

轉載自http://www.kinectutorial.com/?p=824本人純粹是收藏,方便以後查看~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章