product/產(chǎn)品中心
為品牌創(chuàng )造核心價(jià)值
您當前位置>: 首頁(yè) > 新聞 > 行業(yè)動(dòng)態(tài)
(肢勢觸摸IC)設想的根本概念以及肢勢辨認的發(fā)展進(jìn)程
發(fā)表時(shí)間:2015年08月30日
文章來(lái)源:深圳市英菲智科技有限公司
瀏覽次數:120
(肢勢觸摸IC)設想的根本概念以及肢勢辨認的發(fā)展進(jìn)程
像點(diǎn)擊(clicks)是GUI平臺的中心,輕點(diǎn)(taps)是觸碰平臺的中心那樣子,用手做姿勢(gestures)是Kinect應用手續的中心。和圖形用戶(hù)界面中的數碼交互不一樣,用手做姿勢是事實(shí)生存中存在的動(dòng)作。假如沒(méi)有電腦我們就不必鼠標,不過(guò)沒(méi)了Kinect,用手做姿勢依舊存在。從另一方面講,用手做姿勢是起居中間人與人之間互相交流的一小批。用手做姿勢能夠加強演說(shuō)的使心服力,能夠用來(lái)著(zhù)重提出和傳交情意。像舉手揮動(dòng)(waving)還是點(diǎn)撥(pointing)這些個(gè)用手做姿勢都是某種無(wú)聲的演說(shuō)。
Kinect應用手續的預設和研發(fā)者的擔任的工作就是將這些個(gè)事實(shí)生存中存在的用手做姿勢照射到計算機交互中去以奉達人的想法。試驗從鼠標或觸碰式的GUI預設移植基于用手做姿勢的天然交互界面要做眾多辦公。吸收以往30積年來(lái)對于這一并念的研討,以及從一點(diǎn)Kinect for Xbox的體感游戲中取得一點(diǎn)預設理念,計算機工程師和交互預設師一塊兒為Kinect開(kāi)創(chuàng )了一系列新的用手做姿勢庫。
本文將會(huì )紹介用戶(hù)體驗認識的一點(diǎn)知識,并商議怎么樣將用手做姿勢應用到Kinect應用手續中。我們將展覽Kinect怎么樣作為天然交互界面(Natural User INTERFACE)的人機交互板型的一小批。我們將商議一點(diǎn)具體的運用Kinect來(lái)施行用手做姿勢辨別及交互的例子。更關(guān)緊的是,將會(huì )議覽一點(diǎn)已經(jīng)作為Kinect用手做姿勢辨別庫中的用手做姿勢。
1. 啥子是用手做姿勢
在很多不一樣的學(xué)科中,用手做姿勢(gesture)有著(zhù)其獨有特別的涵義,有可能這些個(gè)涵義之間有某些異同。在藝術(shù)領(lǐng)域,用手做姿勢被用來(lái)奉達跳舞中最富表達力的局部,尤其是在亞洲跳舞藝術(shù)中,用手做姿勢被作為某些宗教符號還是象征。在交互預設領(lǐng)域,在基于觸碰的天然交互界面中用手做姿勢和操控有非常大差別。
以上這些個(gè)解釋明白用手做姿勢在不一樣的學(xué)科領(lǐng)域都有自個(gè)兒獨有特別的涵義。在學(xué)術(shù)領(lǐng)域都打算對用手做姿勢定義一個(gè)抽象的概念。在用戶(hù)體驗認識預設領(lǐng)域運用最廣泛的關(guān)于用手做姿勢的定義真的Eric Hulteen 和Gord Kurtenbach 1990年刊發(fā)的一篇名為人機交互中的用手做姿勢(Gestures in Human-Computer Communication),定義如下所述:”用手做姿勢是身板子的運動(dòng),他里面含有一點(diǎn)信息。舉手揮動(dòng)分別是一種用手做姿勢。敲打鍵盤(pán)不是用手做姿勢,由于用手指頭的運動(dòng)去敲打按鈕沒(méi)有被仔細查看,也不關(guān)緊,他只表現的鍵盤(pán)被按下這動(dòng)不動(dòng)作。(A gesture is a motion of the body that contains information. Waving goodbye is a gesture. Pressing a key on a KEYBOARD is not a gesture because the motion of a finger on its way to hitting a key is neither observed nor significant. All that matters is which key was pressed)”
這個(gè)定義既詮釋了啥子是用手做姿勢也詮釋了啥子不是用手做姿勢。像這么的下一個(gè)正式的定義一般有兩個(gè)方面的艱難,既要防止太具體也要防止太抽象。假如一個(gè)定義太具體-如,定義某項技術(shù)-有可能會(huì )隨著(zhù)UI技術(shù)的變動(dòng)會(huì )變得茫茫。作為一種學(xué)術(shù)定義而不是以常見(jiàn)的用處為基礎的定義,它也務(wù)必足夠普通,況且合乎還是說(shuō)廣大的研討機構先前已刊發(fā)在HCI的研討成果及藝術(shù)中符號學(xué)。另一方面,定義過(guò)于寬泛,也會(huì )有有無(wú)要緊急重要的風(fēng)險:假如一切都是一種姿勢,那末就啥子都不是了。
Eric Hulteen 和Gord Kurtenbach關(guān)于用手做姿勢的定義的核心在于用手做姿勢能夠用來(lái)交流,用手做姿勢的意義在于講評而不是執行。
有趣兒的是將語(yǔ)講和行徑引入到人機交互接口中來(lái),這是一種徹底的變法。我們與計算機交互語(yǔ)音變?yōu)闊o(wú)聲的語(yǔ)言(mute):我們經(jīng)過(guò)點(diǎn)撥和用手做姿勢而不是語(yǔ)言與計算設施施行溝通。當和計算機施行交互時(shí),我們點(diǎn)擊鍵盤(pán)按鈕或觸碰熒幕。我們仿佛好象更喜歡這種方式的靜音通信縱然現時(shí)的技術(shù)能夠支持更簡(jiǎn)單的語(yǔ)音指令。我們不擁有操作(manipulation)的力氣,和虛擬的對象而不是真實(shí)的物體施行交互,故而沒(méi)有長(cháng)久性。運動(dòng)變成完全的用手做姿勢。
基于Eric Hulteen 和Gord Kurtenbach的定義,我們都清楚啥子是 UI 操作 ——短時(shí)間之內不是一種用手做姿勢 ——了解啥子是用手做姿勢以及用手做姿勢表達"重大"行徑還是符號還是有非常大的艱難。移動(dòng)交互的涵義是啥子?用手做姿勢施行溝通和語(yǔ)言施行溝通的最表面化不一樣是啥子?我們做用手做姿勢的象征意義往往很抽象簡(jiǎn)單。
在人機交互領(lǐng)域,用手做姿勢一般被作為奉達一點(diǎn)簡(jiǎn)單的指令而不是交流某些事情的真實(shí)情況、描寫(xiě)問(wèn)題還是陳說(shuō)想法。運用用手做姿勢操作電腦一般是指示式的,這一般不是許多人運用用手做姿勢的目標。例如,舉手揮動(dòng)(wave)這動(dòng)不動(dòng)作,在事實(shí)世界中一般是打招呼的一種形式,不過(guò)這種打招呼的形式在人機交互中卻不太常用。一般首次寫(xiě)手續通例會(huì )顯露“hello”,但我們對和電腦打招呼并不有興致。
不過(guò),在一個(gè)不得空的飯館,舉手揮動(dòng)這一用手做姿勢有可能就有不一樣的涵義了。當向跑堂兒的招收時(shí),有可能是要引開(kāi)始跑堂兒的注意,需求它們供給服務(wù)。在計算機中,要引動(dòng)計算機注意有時(shí)也有其特別意義,譬如,計算機休眠時(shí),普通都會(huì )敲打鍵盤(pán)還是移動(dòng)鼠標來(lái)喚醒,以提示計算機“注意”。當運用Kinect時(shí),可以運用更加直觀(guān)的形式,就行少量派報告陳述阿湯哥那樣子,抬起雙手,還是簡(jiǎn)單的朝計算機揮舉手揮動(dòng),計算機便會(huì )從休眠狀況喚醒。
在人機交互領(lǐng)域,用手做姿勢一般有一點(diǎn)涵義,表達有意讓某些事物發(fā)生。用手做姿勢是一種指令。當經(jīng)過(guò)鼠標還是觸控板去點(diǎn)擊UI界面上的按鍵時(shí),我們期望按鍵會(huì )被觸動(dòng)引發(fā)其身后的事情。一般,按鍵上會(huì )有一個(gè)標簽來(lái)指使按鍵的功能如:著(zhù)手、消除、敞開(kāi)、關(guān)閉。我們的用手做姿勢操作就是想要成功實(shí)現這些個(gè)事情。
上頭的定義中的第1點(diǎn)兒可以得出,用手做姿勢的另一個(gè)獨特的地方是比較隨心(arbitrary)。用手做姿勢有框定的領(lǐng)域,那末在該領(lǐng)域以外沒(méi)有不論什么意義。令人驚奇的是除開(kāi)指向(pointing)和聳肩膀(shurg),人類(lèi)科學(xué)家沒(méi)有發(fā)覺(jué)不論什么物品我們可以稱(chēng)之為一種通用的用手做姿勢。不過(guò),在計算機的UI中,指向(pointing)一般被覺(jué)得是直接操作由于它涉及跟蹤,同時(shí)聳肩膀的涵義太微妙而非常不好辨認。因為這個(gè),我們想要運用的不論什么Kinect用手做姿勢務(wù)必基于應用手續的用戶(hù) 和應用手續的預設和研發(fā)者之間就某種用手做姿勢代表的涵義得到完全一樣。
由于用手做姿勢是恣意的(arbitrary)所以它們也是基于約定的(conventional)。應用手續的預設者務(wù)必奉告用戶(hù)正在運用的用手做姿勢的意義,還是是這些個(gè)用手做姿勢是約定俗稱(chēng)大家都曉得的。這個(gè)之外,這些個(gè)約定不是基于語(yǔ)言文化,而是對已確認的技術(shù)規則。我們曉得怎么樣運用鼠標 (行徑學(xué)習) 并不是由于這是我們已經(jīng)從我們的文化導入的物品,而是由于這是基于特別指定的圖形用戶(hù)界面的跨文化約定。一樣地,我們曉得怎么樣點(diǎn)擊或滑動(dòng)智強手機,不是由于這些個(gè)都是文化的約定,而是由于這些個(gè)都是跨文化天然用戶(hù)界面項約定。有趣兒的是,我們在一定程度上曉得怎么樣點(diǎn)擊平板電腦,由于我們曾經(jīng)學(xué)習了怎么樣運用鼠標裸機。技術(shù)約定之間可以互相轉化,這是由于語(yǔ)講和用手做姿勢可以經(jīng)過(guò)不一樣的語(yǔ)講和文化之間來(lái)改換。
不過(guò),用手做姿勢的這種恣意性和基于約定的特別的性質(zhì)也帶來(lái)了曲解性(misunderstanding),這是在預設不論什么用戶(hù)界面,特別是像Kinect這么的沒(méi)有不論什么預先設定好的操作約定的用戶(hù)界面時(shí)需求關(guān)心注視的風(fēng)險。就像在有點(diǎn)國度,頷首表達否決搖頭表達有可能。用手做姿勢,還是不論什么身板子的運動(dòng),都可能萌生曲解。
總之,在人機交互領(lǐng)域,用手做姿勢是:
表現一種簡(jiǎn)單的指示
天然生成有隨心性
基于某種協(xié)定
有可能被曲解
注意:實(shí)際的直接操作(manipulation)不是用手做姿勢。
2. 天然交互界面(NUI)
商議用手做姿勢而不商議天然用戶(hù)界面顯然殘缺。天然用戶(hù)界面是一系列技術(shù)的合計,他涵蓋:語(yǔ)音辨別,多點(diǎn)觸控以及大致相似Kinect的動(dòng)感交互界面,他和Windows和Macs操作系統中鼠標和鍵盤(pán)交互這種很常見(jiàn)圖形交互界面不一樣。就像圖像交互界面和之前的起名稱(chēng)行交互界面不一樣那樣子。
天然交互界面天然在哪里呢?早期天然交互界面的發(fā)起者覺(jué)得交互界面的預設應當對用戶(hù)十分直觀(guān),運用用戶(hù)先天便會(huì )的行徑來(lái)施行交互操作。他的目的是不必操作由圖標和點(diǎn)菜單構成的基于GUI 的應用手續界面,由于這種界面一般具備陡峻的學(xué)習曲線(xiàn)。相反,理想化的狀況是,用戶(hù)應當能夠走到應用手續面前,就能夠啟用它。在以往的幾年里隨著(zhù)觸碰功能的智強手機和平板電腦的流行,漸漸代替了鍵盤(pán)鼠標,當我們看見(jiàn)孩子們起步到不論什么觸碰屏設施前面,用手去觸碰它,期望它的響應,在這一點(diǎn)兒上看這一理念已經(jīng)成功實(shí)現。
固然天然用戶(hù)界面的天然性仿佛好象是直接操作的最佳寫(xiě)照,當運用手指頭來(lái)施行觸碰交互時(shí),先天天然和后天學(xué)習行徑之間的對立被突破。一點(diǎn)用手做姿勢,如輕觸熒幕,在某種意義上就是先天便會(huì )的動(dòng)作。其它的動(dòng)作譬如說(shuō)雙擊,取得點(diǎn)擊而后拖拉等,沒(méi)有先天便會(huì )。并且隨著(zhù)不一樣的設施制作商著(zhù)手支持不一樣觸碰用手做姿勢,為了要得相同的用手做姿勢在不一樣的觸碰平臺上有相同的意義和行徑,為某些用手做姿勢定義一點(diǎn)約定顯得更加關(guān)緊。
天然用戶(hù)界面(NUI)的天然性更多的是一種相對天然的概念。對于NUI的更現代的了解受Bill Buxton所影響。他覺(jué)得NUI界面的預設充分利用了用戶(hù)預先便會(huì )的技能,用戶(hù)和UI施行交互覺(jué)得很天然,要得它們甚至于忘了是從哪兒學(xué)到這些個(gè)和UI施行交互所需的技能的。換言之,首次操作時(shí),我們沒(méi)想到的起來(lái)我們以前學(xué)過(guò)這些個(gè)知識。例如,輕點(diǎn)(tap)這個(gè)用手做姿勢早平板電腦和手機中運用的很次數多,這個(gè)技能是從我們之前在傳統的人機交互界面上運用鼠標來(lái)指向并點(diǎn)擊某一個(gè)界面上的元素學(xué)來(lái)的。點(diǎn)擊(click)和輕點(diǎn)(tap)的最主要差別在于,點(diǎn)擊需求鼠標,對于觸碰屏,不必另外的設施,只消用手指頭輕輕觸碰一下子熒幕就可以了。
這引出了天然用戶(hù)界面的另一個(gè)獨特的地方。用戶(hù)和計算機之間的交互看起來(lái)不必不論什么中介,這種互動(dòng)的中介是不可以見(jiàn)的。例如,在語(yǔ)音辨別界面中,人機交互是經(jīng)過(guò)具備復雜電子過(guò)淋去噪的邁克風(fēng)成功實(shí)現的,其內里有解析發(fā)音語(yǔ)義單元的各種算法,將這些個(gè)語(yǔ)義傳交給其他軟件來(lái)施行將特別指定的短語(yǔ)詮釋為指示,并將該指示照射到某種軟件功能操作。不過(guò),內里的這一切,對用戶(hù)是不可以見(jiàn)的。當用戶(hù)對計算機散發(fā)這么的指示,"嘿,注意我",她會(huì )覺(jué)得計算機緣像大致相似大部分數人的本能那樣子的響應這個(gè)指示。
天然用戶(hù)界面的 倚賴(lài)于先驗知識和不必中介的交互這兩個(gè)特點(diǎn)標志是每一種NUI界面的并肩特點(diǎn)標志,其它方面如觸碰,語(yǔ)音和動(dòng)態(tài)交互界面則因設施的不一樣而各異。到現在為止,大部分數關(guān)于NUI的預設都是基于多點(diǎn)觸控體驗認識的。這就是為何面前對于用手做姿勢的標準定義是那樣子定義的。它是將多點(diǎn)觸碰的場(chǎng)景施行改正并將用手做姿勢和操作區別開(kāi)來(lái)。
關(guān)于用手做姿勢(gesture)和操作(manipulation)的爭辯也存在于語(yǔ)音交互界面中,指示等同于用手做姿勢,語(yǔ)音等同于直接操作,在動(dòng)態(tài)交互界面中,將手還是身板子追蹤展覽在可視化界面上手和身板子的運動(dòng)等同于直接操作。自由方式的運動(dòng)像舉手揮動(dòng)這動(dòng)不動(dòng)作就歸屬用手做姿勢。
不過(guò)Kinect還有第三種交互界面,他和觸碰和語(yǔ)音交互不一樣。那就上一篇文章中所講的姿態(tài)(pose),姿態(tài)是身板子的某一小批和其它局部之間的一種靜態(tài)關(guān)系,他不是運動(dòng)的。Kinect中的姿態(tài)和起居中的姿態(tài)是同樣的,例如,左臂伸出45度表達將現時(shí)的窗戶(hù)變?yōu)榛顒?dòng)的交互窗體,右臂伸出45度還是135度表達鉛直滾興工具欄。
額外,交互形式可以從一品類(lèi)型的交互界面改換到額外一種交互界面。以按鍵為例,按鍵實(shí)際上就是一個(gè)符號,這是一個(gè)先驗的圖形用戶(hù)界面。從最基本的功能來(lái)講,按鍵就是一個(gè)經(jīng)過(guò)鼠標點(diǎn)擊在一個(gè)可視化元素的書(shū)契還是圖像上被觸動(dòng)引發(fā)一點(diǎn)指示的工具。在以往15年,按鍵被作為人機交互界面的一個(gè)集成局部,被改換到多點(diǎn)觸碰界面,以及Kinect用戶(hù)界面中來(lái)。
天然用戶(hù)界面預設師所尋求的似的是天然,按鍵正好供給了這一點(diǎn)兒。不過(guò)按鍵在每一種用戶(hù)界面中的改換都面對著(zhù)一點(diǎn)挑戰。
圖形用戶(hù)界面中按鍵的一個(gè)一般的特點(diǎn)標志是他供給了一個(gè)懸浮狀況來(lái)指使用戶(hù)光標已經(jīng)懸停在的按鍵上方的準確位置。這種懸浮狀況將點(diǎn)(click)這個(gè)動(dòng)作失散開(kāi)來(lái)。懸浮狀況可以為按鍵供給一點(diǎn)另外的信息。當將按鍵移植到觸碰屏交互界面時(shí),按鍵不可以供給懸浮狀況。觸碰屏界面只能響應觸碰。因為這個(gè),和電腦上的圖像用戶(hù)界表情形,按鍵只能供給“擊”(click)操作,而沒(méi)有“點(diǎn)”(point)的有經(jīng)驗。
當將按鍵移植到基于Kinect的用戶(hù)界面上時(shí),按鍵的行徑就變得更加特別了?;贙inect的圖形界面中,按鍵的行徑和觸碰界面中的剛好相反,他只供給了懸?。╤over)的“點(diǎn)”(point)的有經(jīng)驗,沒(méi)有“擊”(click)的有經(jīng)驗。按鍵這種更令用戶(hù)體驗認識預設者覺(jué)得懊喪的弱項,在以往的幾年里,強迫做預設者不斷的對Kinect界面上的按鍵施行改進(jìn),以供給更多靈巧高明的形式來(lái)點(diǎn)擊視物感覺(jué)元素。這些個(gè)改進(jìn)涵蓋:懸停在按鍵上時(shí)期、將巴掌向外推(拙笨地臨摹點(diǎn)擊一個(gè)按鍵的行徑)等。
固然觸碰界面也有用手做姿勢,但Kinect 界面有點(diǎn)相互作用不是用手做姿勢,然而軟件的研發(fā)和預設者傾向于以 Kinect 用手做姿勢操作作為交互界面。這仿佛好象是由于運用用手做姿勢作為物理操作是 Kinect 應用手續的最大的獨特的地方。與此相反的是,觸碰界面的冒尖獨特的地方是直接操作。固然有可能不正確,許多人一般將天然交互界面區分清楚為三類(lèi):語(yǔ)音交互界面,觸碰交互界面和用手做姿勢交互界面。
不過(guò),在關(guān)于Kinect的有關(guān)紹介文檔中,你會(huì )發(fā)覺(jué)有時(shí)姿態(tài)(pose)和操作(manipulation)都被描寫(xiě)為用手做姿勢。這些個(gè)都沒(méi)有錯。要記取的是,當我們商議Kinect中的一點(diǎn)專(zhuān)門(mén)用語(yǔ),如舉手揮動(dòng)(wave),滑動(dòng)(swipe),我們會(huì )作為完全的用手做姿勢,而姿態(tài)和操控只有在暗喻意義上才稱(chēng)之為用手做姿勢。
以上的商議都很關(guān)緊,由于我們會(huì )進(jìn)一步預設Kinect相互作用的語(yǔ)意,我們將最后移除從其它圖形界面上吸收過(guò)來(lái)的關(guān)于按鍵的語(yǔ)意,而后試驗樹(shù)立基于Kinect的先驗的語(yǔ)意。舉手揮動(dòng)(wave)這是Kinect中完全的用手做姿勢,是最早的這種試驗。喬治亞技術(shù)研討所的研討擔任職務(wù)的人正在利用 Kinect 來(lái)詮釋美國手勢語(yǔ)言。相反,其它研討擔任職務(wù)的人,正在利用 Kinect 詮釋身板子語(yǔ)言——另一種預先形成的用手做姿勢和姿態(tài)的溝通。諸這么類(lèi)的研討可以視為對于NUI的第二層研討。這些個(gè)漸漸靠近了起初NUI人機交互的原始的幻想,不僅是看不見(jiàn),并且NUI能夠自適合以了解我們的行徑,而不是強迫做我們理解我們和電腦的人機交互。
3. 用手做姿勢從哪兒來(lái)
在用手做姿勢交互界面中,完全的用手做姿勢,姿態(tài)和追蹤以及它們之間的組合構成了交互的基本專(zhuān)門(mén)用語(yǔ)。對于Kinect來(lái)說(shuō),到現在為止可以運用的有8個(gè)通用的用手做姿勢:舉手揮動(dòng)(wave),懸浮按鍵(hover BUTTON),磁吸按鍵(magnet button),推按鍵(push button),磁吸幻燈片(magnetic slide),通用暫停(universal pause),鉛直骨碌條(vertical scrolling)和滑動(dòng)(swipping)。那里面的一點(diǎn)專(zhuān)門(mén)用語(yǔ)是微軟自個(gè)兒引入的,有一點(diǎn)是游戲攝理商預設的,還有一點(diǎn)是Kinect for PC研發(fā)擔任職務(wù)的人為了研發(fā)應用而引入的。
很少事情狀況下會(huì )為人際交互界面專(zhuān)門(mén)用語(yǔ)施行定制。一般要將這8種用手做姿勢區別開(kāi)來(lái),并在一點(diǎn)應用中通用也不常見(jiàn)。相仿的事情狀況在web專(zhuān)門(mén)用語(yǔ)和手機用手做姿勢中預設新的界面時(shí)也會(huì )碰到,那里面只有局部的預設能夠成為標準。在網(wǎng)頁(yè)預設領(lǐng)域,走防水煤油燈和光標動(dòng)畫(huà)流行一時(shí),并在一片不耐煩聲中迅疾消逝。在握機預設領(lǐng)域因為水果企業(yè)在觸碰屏領(lǐng)域的早期地位這種專(zhuān)門(mén)用語(yǔ)獲得了美好的規范。水果引入了一點(diǎn)觸碰用手做姿勢專(zhuān)門(mén)用語(yǔ),如輕點(diǎn)(tap),點(diǎn)住不放(tap and hold),滑動(dòng)swipe及pinch。
交互專(zhuān)門(mén)用語(yǔ)形成規范有幾個(gè)絆腳石。第1個(gè)就是為了取得好處而防止標準化。在90時(shí)代后期的瀏覽器大戰中,盡管各大廠(chǎng)商在口頭上說(shuō)標準化協(xié)議很關(guān)緊,不過(guò)在瀏覽器研發(fā)上依然不已的研發(fā)自個(gè)兒的HTML版本,以吸引研發(fā)者運用它們的技術(shù)。設施制作商可以利用市場(chǎng)霸占率的優(yōu)勢來(lái)鎖定消費者,經(jīng)過(guò)在它們的手機上成功實(shí)現自個(gè)兒定義語(yǔ)意的觸屏,來(lái)推行自個(gè)兒的用手做姿勢操作。這些個(gè)都是不天然的行徑,由于不一樣廠(chǎng)商對于同一用手做姿勢的語(yǔ)意都不一樣,況且它們看起來(lái)不天然,運用不一樣廠(chǎng)商的產(chǎn)品需求再學(xué)習。
另一種形成規范化的絆腳石是上下文用手做姿勢的專(zhuān)利。例如,水果企業(yè)不可以對“滑動(dòng)”(swipe)操作提出請求專(zhuān)利,不過(guò)它可以對“滑動(dòng)解鎖手機”這個(gè)用手做姿勢提出請求專(zhuān)利,這要得其它企業(yè)需求運用這一技術(shù)還是預設理念時(shí)要不給水果企業(yè)付出專(zhuān)利費,要不將水果告上法庭以防止專(zhuān)利費,或則索性不運用這一上下文用手做姿勢。假如不運用這一上下文用手做姿勢,那末產(chǎn)品就毀傷了之前我們學(xué)習到運用很天然的形式滑動(dòng)解鎖手機,音樂(lè )播放器,平板電腦等這一約定了。
最終一個(gè)絆腳石是,預設一個(gè)用手做姿勢很艱難。用手做姿勢專(zhuān)門(mén)用語(yǔ)會(huì )晤對一點(diǎn)App Store中手機應用手續和YouTube中視頻文件應用所碰到的一點(diǎn)問(wèn)題:許多人要不會(huì )要不不會(huì )。用手做姿勢需求深刻思考怎么樣定義的簡(jiǎn)單要得許多人能夠去用,這就是長(cháng)尾理論遺留的問(wèn)題。
那末啥子樣的用手做姿勢專(zhuān)門(mén)用語(yǔ)才是好的呢。假如一個(gè)用手做姿勢便于運用,那末他就被覺(jué)得是預設令人滿(mǎn)意的。在交互預設中,易用性有兩個(gè)方面:可用(affordance)和反饋(feedback)。反饋就是說(shuō)用戶(hù)曉得現時(shí)正在施行的操作。在網(wǎng)頁(yè)中,點(diǎn)擊按鍵會(huì )看見(jiàn)按鍵有一點(diǎn)兒偏移,這就表達交互成功。鼠標按鈕按下時(shí)的聲響在某種意義上也是一種反饋,他表達鼠標在辦公。對于Winodw Phone Metro風(fēng)格的界面上的磁貼,研發(fā)這覺(jué)得這些個(gè)按鍵應當足夠大,以容下大平面或物體表面的大小的觸碰地區范圍,不過(guò)它們也覺(jué)得過(guò)大的觸碰地區范圍會(huì )要得用戶(hù)觸碰到地區范圍外面也會(huì )被觸動(dòng)引發(fā)注冊的事情。額外,狀況信息還是明確承認會(huì )話(huà)框會(huì )在應用手續飲彈出以提醒用戶(hù)發(fā)生了一點(diǎn)事物。在 Xbox 的儀表板中,運用Kinect傳感器萌生的光標懸停在的熱點(diǎn)上著(zhù)手動(dòng)畫(huà)播放。
假如說(shuō)反饋發(fā)生在操作施行中還是在這以后,那末可用性(affordance)就發(fā)生在操作之前了??捎眯跃褪且环N提醒還是指導,奉告用戶(hù)某一個(gè)可視化元素是可以交互的,指使用戶(hù)該元素的用法。在GUI交互界面中,按鍵是能夠最好的完成這些個(gè)理念的元素。按鍵經(jīng)過(guò)書(shū)契還是圖標提醒來(lái)執行一點(diǎn)函數操作。GUI界面上的按鍵經(jīng)過(guò)懸浮狀況可以提醒用戶(hù)其用場(chǎng)。最好的可用性-有可能有些繞圈-就是約定俗成。用戶(hù)曉得某一個(gè)可視化元素的用場(chǎng),由于之前在其它應用中運用過(guò)大致相似的可視化控件,還是是在其它設施中執行過(guò)大致相似的操作。不過(guò),這一點(diǎn)兒對于基于Kinect的用手做姿勢交互界面來(lái)說(shuō)有些艱難,由于一切都是新的。
一般的作法就是運用假座其它類(lèi)型交互界面中的約定。在觸碰交互界面中,一個(gè)輕點(diǎn)(tap)用手做姿勢和一般的鼠標點(diǎn)擊是等同的。響應輕點(diǎn)事情的兩個(gè)可視化元素,圖標和按鍵,也被預設的和傳統的GUI界面上的圖標和按鍵同樣,來(lái)達到提醒用戶(hù)該元素的效用這一目標。Kinect也運用按鍵和圖標來(lái)要得用戶(hù)能夠更加容易運用。由于Kinect基本上是基于”點(diǎn)”(pointing)而原生不支持“擊”(clicking)。在此之前,軟件界面預設者和研發(fā)者的消耗的錢(qián)了眾多精神力來(lái)對用手做姿勢交互界面施行定制以成功實(shí)現“擊”這動(dòng)不動(dòng)作。
和觸碰交互界面不同,用手做姿勢交互界面可以從社會(huì )形態(tài)中間人的普通用手做姿勢中假座一點(diǎn)用手做姿勢操作。這就要得舉手揮動(dòng)(wave)變成Kinect應用手續的經(jīng)典用手做姿勢。由于這一姿態(tài)和事實(shí)生存中的姿態(tài)有象征性結合要得不費吹灰之力了解和運用。軌跡追蹤,固然在技術(shù)上不是用手做姿勢,不過(guò)他是另一個(gè)在事實(shí)生存中和點(diǎn)撥有結合的專(zhuān)門(mén)用語(yǔ)。當在電視機還是顯露器前揮舞手時(shí),好的Kinect應用手續應當能夠追蹤拿到手的運動(dòng),并顯露一個(gè)光標隨開(kāi)始一開(kāi)始運出動(dòng)。當我們在事實(shí)生存三拇指點(diǎn)物體時(shí),Kinect中的手部追蹤顯露的手形圖標的反饋要得手續更加易用。
到現在為止,事實(shí)生存中的易用性用手做姿勢在Kinect交互界面中用的比較少,大多的易用性都是從傳統的GUI界面上的可用性移植過(guò)來(lái)的。隨著(zhù)時(shí)間的變更,這一點(diǎn)兒會(huì )獲得改善。在觸碰屏設施上新的用手做姿勢經(jīng)過(guò)在傳統的已經(jīng)樹(shù)立的約定中添加手指頭來(lái)形成。兩指輕點(diǎn)和一指輕點(diǎn)有點(diǎn)不一樣,運用兩個(gè)手指頭還是多個(gè)手指頭施行滑動(dòng)有其獨有特別的涵義。最后,觸碰用手做姿勢所有由手指頭完成。另一方面,真正的用手做姿勢用戶(hù)界面,有一個(gè)接近于無(wú)限的語(yǔ)意庫,要得我們可以基于事實(shí)生存中有關(guān)聯(lián)的用手做姿勢施行改進(jìn)。
本文接下來(lái)從理論到成功實(shí)現,商議怎么樣成功實(shí)現用手做姿勢辨別,并展覽了Kinect中八中基本用手做姿勢中的舉手揮動(dòng)(wave)用手做姿勢的辨別。
4. 成功實(shí)現用手做姿勢辨別
Microsoft Kinect SDK并沒(méi)有里面含有用手做姿勢辨別引擎。因為這個(gè)需求研發(fā)者來(lái)定義和用手做姿勢辨別。從SDK的Beta版放出以來(lái),一點(diǎn)第三方研發(fā)者開(kāi)創(chuàng )的用手做姿勢引擎已初見(jiàn)端倪。不過(guò),微軟沒(méi)有將它們作為標準的引擎??磥?lái)這有可能還要等微軟將用手做姿勢辨別引擎添加到SDK中來(lái),還是指明可代替的解決方案。本節對用手做姿勢辨別技術(shù)施行了簡(jiǎn)單紹介,期望能夠幫忙研發(fā)者在標準的用手做姿勢辨別引擎出來(lái)之前,可以自個(gè)兒動(dòng)手研發(fā)用手做姿勢辨別引擎。
用手做姿勢辨別相對來(lái)說(shuō)可以簡(jiǎn)單也可以很復雜,這決定于與要辨別的用手做姿勢。有三種基本的辦法可以用來(lái)辨別用手做姿勢:基于算法,基于神經(jīng)器官網(wǎng)絡(luò )和基于用手做姿勢樣本庫。每一種辦法都有其優(yōu)欠缺。研發(fā)者具體認為合適而使用那種辦法決定于與待辨別的用手做姿勢、項目需要,研發(fā)時(shí)間以及研發(fā)水準?;谒惴ǖ挠檬肿鲎藙荼鎰e相對簡(jiǎn)單容易成功實(shí)現,基于神經(jīng)器官網(wǎng)絡(luò )和用手做姿勢樣本庫則有點(diǎn)復雜。
4.1 基于算法的用手做姿勢辨別
算法是解決軟件研發(fā)中幾乎全部問(wèn)題的最基本辦法。運用算法的基本流程就是定義處置規則和條件,這些個(gè)處置規則和條件務(wù)必合乎處置最后結果的要求。在用手做姿勢辨別中,這種算法的最后結果要求是一個(gè)二值型對象,某一用手做姿勢要不合乎預先規定的用手做姿勢要不不合。運用算法來(lái)辨別用手做姿勢是最基本的辦法,由于對于有一點(diǎn)兒編程有經(jīng)驗的研發(fā)這來(lái)說(shuō),用手做姿勢辨別的代碼便于了解,編著(zhù),保護和調整。
不過(guò),最簡(jiǎn)單直接的辦法也有其欠缺。算法的簡(jiǎn)單性限止了其能辨別到的用手做姿勢的門(mén)類(lèi)。對于舉手揮動(dòng)(wave)辨別較好的算法不可以夠辨別扔(throw)和擺(swing)動(dòng)作。前者動(dòng)作相對簡(jiǎn)單和歸置,后者則更加微小且多變。有可能能夠寫(xiě)一個(gè)辨別來(lái)回搖動(dòng)(swing)的算法,不過(guò)代碼有可能比較不好懂和薄弱。
算法還有一個(gè)外在的擴展性問(wèn)題。固然一點(diǎn)代碼可以重用,不過(guò)每一種用手做姿勢務(wù)必運用定制的算法來(lái)施行辨別。隨著(zhù)新的用手做姿勢辨別算法參加類(lèi)庫,類(lèi)庫的體積會(huì )迅疾增加。這就對手續的性能萌生影響,由于需求運用眾多算法來(lái)對某一個(gè)用手做姿勢施行辨別以判斷該用手做姿勢的類(lèi)型。
最終,每一個(gè)用手做姿勢辨別算法需求不一樣的參變量,例如時(shí)間間隔和閾值。特別是在根據流程辨別特別指定的用手做姿勢的時(shí)刻這一點(diǎn)兒顯得特別表面化。研發(fā)者需求不斷測試和實(shí)驗以為每一種算法確認合宜的參變量值。這本身是一個(gè)有挑戰也很沒(méi)情趣的辦公。不過(guò)每一種用手做姿勢的辨別有著(zhù)自個(gè)兒特別的問(wèn)題。
4.2 基于神經(jīng)器官網(wǎng)絡(luò )的用手做姿勢辨別
當用戶(hù)在做用手做姿勢時(shí),用手做姿勢的方式并不老是足夠清楚到能夠判斷用戶(hù)的意向。例如跳躍用手做姿勢,跳躍用手做姿勢就是用戶(hù)短暫的跳起來(lái),腳離去地面。這個(gè)定義不可以夠供給足夠的信息來(lái)辨別這動(dòng)不動(dòng)作。
咋一看,這個(gè)動(dòng)作仿佛好象足夠簡(jiǎn)單,要得可以運用算法來(lái)施行辨別。首先,思索問(wèn)題到有眾多種不一樣方式的跳躍:基本跳躍(basic jumping)、 跨欄(hurdling)、 跳遠(long jumping)、 跳躍(hopping),等等。不過(guò)這處有一個(gè)大的問(wèn)題就是,因為遭受Kinect視場(chǎng)地區范圍的限止,沒(méi)可能老是能夠探量觀(guān)測到地板的位置,這要得腳部何時(shí)離去地板很難確認。假想一下子,用戶(hù)在膝蓋到下蹲點(diǎn)處彎下,而后跳起來(lái)。用手做姿勢辨別引擎應當覺(jué)得這是一個(gè)用手做姿勢仍然多個(gè)用手做姿勢:下蹲或 下蹲跳起還是是跳起?假如用戶(hù)在蹲下的時(shí)間和跳躍的時(shí)間相形過(guò)長(cháng),那末這一用手做姿勢有可能應被辨別為下蹲而不是跳躍。
看見(jiàn)這些個(gè),最著(zhù)手對跳躍的定義便會(huì )變得依稀。這一姿態(tài)很難定義明白,要得不可以夠經(jīng)過(guò)定義一點(diǎn)算法來(lái)施行辨別,同時(shí)這些個(gè)算法因為需求定義過(guò)多的規則和條件而變得難于管理和不定。運用對或錯的二值策略來(lái)辨別用戶(hù)用手做姿勢的算法太簡(jiǎn)單和不夠壯健,不可以夠美好的辨別出大致相似跳躍,下蹲等動(dòng)作。
神經(jīng)器官網(wǎng)絡(luò )的團體和判斷是基于計數和幾率的,因為這個(gè)要得像辨別用手做姿勢這些個(gè)過(guò)程變得容易扼制?;谏蹲泳W(wǎng)絡(luò )的用手做姿勢辨別引擎對于下蹲而后跳躍動(dòng)作,80百分之百的幾率判斷為跳躍,10百分之百會(huì )分辨斷定為下蹲。
除開(kāi)能夠辨別復雜和精密細致的用手做姿勢,神經(jīng)器官網(wǎng)絡(luò )辦法還能解決基于算法用手做姿勢辨別存在的擴展性問(wèn)題。神經(jīng)器官網(wǎng)絡(luò )里面含有眾多神經(jīng)器官元,每一個(gè)神經(jīng)器官元是一個(gè)好的算法,能夠用來(lái)判斷用手做姿勢的微小局部的運動(dòng)。在神經(jīng)器官網(wǎng)絡(luò )中,很多用手做姿勢可以共享神經(jīng)器官元。不過(guò)每一中用手做姿勢辨別有著(zhù)獨有特別的神經(jīng)器官元的組合。并且,神經(jīng)器官元具備高效的數值結構來(lái)處置信息。這要得在辨別用手做姿勢時(shí)具備頎長(cháng)的速率。
運用基于神經(jīng)器官網(wǎng)絡(luò )施行用手做姿勢辨別的欠缺是辦法本身復雜。固然神經(jīng)器官網(wǎng)絡(luò )以及在計算機科學(xué)中對其的應用已經(jīng)有了好幾十年,樹(shù)立一個(gè)好的神經(jīng)器官網(wǎng)絡(luò )對于大部分數程序開(kāi)發(fā)人員來(lái)說(shuō)仍然有一點(diǎn)艱難的。大部分數研發(fā)者有可能對數值結構中的圖和樹(shù)比較知道得清楚,而對神經(jīng)器官網(wǎng)絡(luò )中尺度和依稀思維規律的成功實(shí)現有可能一點(diǎn)兒都不成解。這種匱缺樹(shù)立神經(jīng)器官網(wǎng)絡(luò )的經(jīng)驗是一個(gè)很大的艱難,縱然能夠成功的構建一個(gè)神經(jīng)器官網(wǎng)絡(luò ),手續的調整相當艱難。
和基于算法的辦法相形,神經(jīng)器官網(wǎng)絡(luò )倚賴(lài)數量多的參變量來(lái)能獲得非常準確的最后結果。參變量的個(gè)數隨著(zhù)神經(jīng)器官元的個(gè)數提高。每一個(gè)神經(jīng)器官元可以用來(lái)辨別多個(gè)用手做姿勢,每一個(gè)神經(jīng)器官遠的參變量的變動(dòng)都會(huì )影響其它節點(diǎn)的辨別最后結果。配備布置和調試這些個(gè)參變量是一項藝術(shù),需求經(jīng)驗,并沒(méi)有特別指定的規則可循。不過(guò),當神經(jīng)器官網(wǎng)絡(luò )配合成雙機器學(xué)習過(guò)程中手動(dòng)調試參變量,隨著(zhù)時(shí)間的推移,系統的辨別精密度會(huì )隨之增長(cháng)。
4.3 基于樣本的辨別
基于樣本還是基于模版的用手做姿勢辨別系統能夠將人的用手做姿勢和已知的用手做姿勢相般配。用戶(hù)的用手做姿勢在模型板庫中已經(jīng)規范化了,要得能夠用來(lái)計算用手做姿勢的般配精密度。有兩種樣本辨別辦法,一種是儲存一系列的點(diǎn),另一種辦法是運用大致相似的Kinect SDK中的骨骼追蹤系統。在后面的那一個(gè)辦法中,系統中里面含有一系列骨骼數值和景深幀數值,能夠運用計數辦法對萌生的影像幀數值施行般配以辨別出已知的幀數值來(lái)。
這種用手做姿勢辨別辦法高度倚賴(lài)于機器學(xué)習。辨別引擎會(huì )記錄,處置,和重用現時(shí)幀數值,所以隨著(zhù)時(shí)間的推移,用手做姿勢辨別精密度會(huì )逐層增長(cháng)。系統能夠更好的辨別出你想要表現的具體用手做姿勢。這種辦法能夠比較容易的辨別出新的用手做姿勢,并且較其它兩種辦法能夠更好的處置比較復雜的用手做姿勢。不過(guò)樹(shù)立這么一個(gè)系統也不由得易。首先,系統倚賴(lài)于數量多的樣本數值。數值越多,辨別精密度越高。所以系統需求數量多的儲存資源和CPU時(shí)間的來(lái)施行查尋和般配。其次系統需求不一樣高度,不一樣胖瘦,不一樣衣著(zhù)打扮(衣著(zhù)打扮會(huì )影響景深數值提出取得身板子大概輪廓)的樣壓根兒施行某一個(gè)用手做姿勢。
5.辨別常見(jiàn)的用手做姿勢
挑選用手做姿勢辨別的辦法一般是倚賴(lài)于項目標需求。假如項目只消辨別幾個(gè)簡(jiǎn)單的用手做姿勢,那末運用基于算法還是基于神經(jīng)器官網(wǎng)絡(luò )的用手做姿勢辨別就足夠了。對于其它類(lèi)型的項目,假如有興致的話(huà)可以投合乎時(shí)尚間來(lái)樹(shù)立可復用的用手做姿勢辨別引擎,還是運用一點(diǎn)人煙已經(jīng)寫(xiě)好的辨別算法,接下來(lái)本文紹介幾種常用的用手做姿勢,并演習怎么樣運用算法的辦法來(lái)辨別它們,用手做姿勢辨別的額外兩種辦法因為其復雜性本文不做紹介。
無(wú)論挑選哪種用手做姿勢辨別的辦法,都務(wù)必思索問(wèn)題用手做姿勢的變動(dòng)范圍。系統務(wù)必具備靈活性,并準許某一個(gè)用手做姿勢有某個(gè)范圍內的變化。很少有人能夠每每都做一模同樣的用手做姿勢。例如,思索問(wèn)題周伯通現時(shí)左右首畫(huà)圓圈兒這個(gè)用手做姿勢,重復這一用手做姿勢10次,圓形的核心每每都在一個(gè)點(diǎn)嗎,圓形的起點(diǎn)和重點(diǎn)每每都在相同的地方嗎?每每畫(huà)圓的時(shí)長(cháng)都同樣嗎?而后運用右首做這個(gè)動(dòng)作,最終比較最后結果。還是拉幾個(gè)朋友還是家人來(lái)做,而后仔細查看。也可以站在鏡子面前看自個(gè)兒做,還是運用錄像設施錄下來(lái)再看。技法就是對于某一用手做姿勢,讓盡有可能多的人來(lái)做,而后打算標準化這一用手做姿勢。用手做姿勢辨別一個(gè)比較好的形式就是關(guān)心注視用手做姿勢最中心的局部而不是哪一些內在的細枝末節。
5.1 揮舞(wave)用手做姿勢
只要玩過(guò)Xbox上的體感游戲,有可能都運用過(guò)舉手揮動(dòng)這個(gè)用手做姿勢。舉手揮動(dòng)這一用手做姿勢無(wú)論歲數體積都能夠做的一個(gè)簡(jiǎn)單動(dòng)作。這是一個(gè)友善的,歡樂(lè )的用手做姿勢,許多人一般舉手揮動(dòng)還是揮手來(lái)打招呼還是分別。在應用研發(fā)的上下文中,舉手揮動(dòng)用手做姿勢一般奉告應用手續已經(jīng)準備好了,可以著(zhù)手體驗認識應用了。
舉手揮動(dòng)是最簡(jiǎn)單最基本的用手做姿勢。運用算法辦法能夠很容易辨別這一用手做姿勢,不過(guò)之前講到的不論什么辦法也能夠運用。固然舉手揮動(dòng)是一個(gè)很簡(jiǎn)單的用手做姿勢,不過(guò)怎么樣運用代碼來(lái)辨別這一用手做姿勢呢?讀者可以在鏡子前做向自個(gè)兒舉手揮動(dòng),而后仔細仔細查看手的運動(dòng),特別注意仔細查看手和臂膀之間的關(guān)系。接著(zhù)仔細查看手和臂膀之間的關(guān)系,而后仔細查看在做這個(gè)用手做姿勢事身板子的整個(gè)兒姿態(tài)。有點(diǎn)人維持身板子和臂膀的不動(dòng),運用手腕子左右移動(dòng)來(lái)舉手揮動(dòng)。有點(diǎn)人維持身板子和臂膀不動(dòng)運用手腕子前后移動(dòng)來(lái)舉手揮動(dòng)??梢越?jīng)過(guò)仔細查看這些個(gè)姿態(tài)來(lái)理解其它各種不一樣舉手揮動(dòng)的形式。
XBOX中的舉手揮動(dòng)動(dòng)作定義為:從臂膀著(zhù)手到肘部屈曲。用戶(hù)以臂膀肘為焦點(diǎn)往返移動(dòng)小臂,移動(dòng)最簡(jiǎn)單的面和肩部在一個(gè)最簡(jiǎn)單的面上,況且臂膀和地面維持平行,在用手做姿勢的中部(下圖1),小臂鉛直于后臂和地面。下圖展覽了這一姿態(tài)。
從圖中可以仔細查看得出一點(diǎn)規律,第1個(gè)規律就是,手和手腕子都是在肘部和肩部之上的,這也是大部分是舉手揮動(dòng)動(dòng)作的特點(diǎn)標志。這也是我們辨別舉手揮動(dòng)這一用手做姿勢的第1個(gè)標準。
第1幅圖展覽了舉手揮動(dòng)這一姿態(tài)的半中腰位置,小臂和后臂鉛直。假如用戶(hù)手臂變更了這種關(guān)系,小臂在鉛直線(xiàn)左面還是右面,我們則覺(jué)得這是該用手做姿勢的一個(gè)斷片。對于舉手揮動(dòng)這一姿態(tài),每一個(gè)姿態(tài)斷片務(wù)必往返重復多次,否則就不是一個(gè)完整的用手做姿勢。這一運動(dòng)規律就是我們的第二個(gè)準則:當某一用手做姿勢是舉手揮動(dòng)時(shí),手還是手腕子,務(wù)必在半中腰姿態(tài)的左右往返重復特別指定的回數。運用這兩點(diǎn)經(jīng)過(guò)仔細查看獲得的規律,我們可以經(jīng)過(guò)算法樹(shù)立算法準則,來(lái)辨別揮舞用手做姿勢了。
算法經(jīng)過(guò)計算手離去半中腰姿態(tài)地區范圍的回數。半中腰地區范圍是一個(gè)以臂膀肘為原點(diǎn)并給與一定閾值的地區范圍。算法也需求用戶(hù)在一定的時(shí)間段內完成這個(gè)用手做姿勢,否則辨別便會(huì )敗績(jì)。這處定義的揮舞用手做姿勢辨別算法只是一個(gè)單獨的算法,不里面含有在一個(gè)多層的用手做姿勢辨別系統內。算法保護自身的狀況,并在辨別完成時(shí)以事情方式告知用戶(hù)辨別最后結果。揮舞辨別檢查查看多個(gè)用戶(hù)以及兩雙手的揮舞用手做姿勢。辨別算法計算新萌生的每一幀骨骼數值,因為這個(gè)務(wù)必記錄這些個(gè)辨別的狀況。
下邊的代碼展覽了記錄用手做姿勢辨別狀況的兩個(gè)枚舉和一個(gè)結構。第1個(gè)名為WavePosition的枚舉用來(lái)定義手在舉手揮動(dòng)這動(dòng)不動(dòng)作中的不一樣位置。用手做姿勢辨別類(lèi)運用WaveGestureState枚舉來(lái)追蹤每一個(gè)用戶(hù)的手的狀況。WaveGestureTracker結構用來(lái)保留用手做姿勢辨別中所需求的數值。他有一個(gè)Reset辦法,當用戶(hù)的手達不到舉手揮動(dòng)這一用手做姿勢的基本動(dòng)作條件時(shí),譬如當手在臂膀肘以下時(shí),可調配使用Reset辦法來(lái)重置用手做姿勢辨別中所用到的數值。
private enum WavePosition{ None = 0, Left = 1, Right = 2, Neutral = 3 }private enum WaveGestureState{ None = 0, Success = 1, Failure = 2, InProgress = 3 }private struct WaveGestureTracker{ public int IterationCount; public WaveGestureState State; public long Timestamp; public WavePosition StartPosition; public WavePosition CurrentPosition; public void Reset() { IterationCount = 0; State = WaveGestureState.None; Timestamp = 0; StartPosition = WavePosition.None; CurrentPosition = WavePosition.None; } }
下邊代碼顯露了用手做姿勢辨別類(lèi)的最基本結構:它定義了五個(gè)恒量:半中腰地區范圍閾值,用手做姿勢動(dòng)作連續不斷時(shí)間,用手做姿勢離去半中腰地區范圍左右移動(dòng)回數,以及左手和右首標識恒量。這些個(gè)恒量應當作為配備布置文件的配備布置項儲存,在這處為了簡(jiǎn)單方便,所以以恒量聲明。WaveGestureTracker數組保留每一個(gè)有可能的游戲者的雙手的用手做姿勢的辨別最后結果。當舉手揮動(dòng)這一用手做姿勢探量觀(guān)測到達在這以后,被觸動(dòng)引發(fā)GestureDetected事情。
當主手續收繳到一個(gè)新的數值幀時(shí),就調配使用WaveGesture的Update辦法。該辦法循環(huán)遍歷每一個(gè)用戶(hù)的骨骼數值幀,而后調配使用TrackWave辦法對左右首施行舉手揮動(dòng)姿態(tài)辨別。當骨骼數值不在追蹤狀況時(shí),重置用手做姿勢辨別狀況。
public class WaveGesture{ private const float WAVE_THRESHOLD = 0.1f; private const int WAVE_MOVEMENT_TIMEOUT = 5000; private const int LEFT_HAND = 0; private const int RIGHT_HAND = 1; private const int REQUIRED_ITERATIONS = 4; private WaveGestureTracker[,] _PlayerWaveTracker = new WaveGestureTracker[6, 2]; public event EventHandler GestureDetected; public void Update(Skeleton[] skeletons, long frameTimestamp) { if (skeletons != 門(mén)里出身) { Skeleton skeleton; for (int i = 0; i < skeletons.Length; i++) { skeleton = skeletons[i]; if (skeleton.TrackingState != SkeletonTrackingState.NotTracked) { TrackWave(skeleton, true, ref this._PlayerWaveTracker[i, LEFT_HAND], frameTimestamp); TrackWave(skeleton, false, ref this._PlayerWaveTracker[i, RIGHT_HAND], frameTimestamp); } else { this._PlayerWaveTracker[i, LEFT_HAND].Reset(); this._PlayerWaveTracker[i, RIGHT_HAND].Reset(); } } } } }
下邊的代碼是舉手揮動(dòng)姿態(tài)辨別的主要思維規律辦法TrackWave的主體局部。它證驗我們先前定義的構成舉手揮動(dòng)姿態(tài)的條件,并更新用手做姿勢辨別的狀況。辦法辨別左手還是右首的用手做姿勢,第1個(gè)條件是證驗,手和肘關(guān)節點(diǎn)是否處于追蹤狀況。假如這兩個(gè)關(guān)節點(diǎn)信息不可以用,則重置追蹤狀況,否則施行下一步的證驗。
假如姿態(tài)連續不斷時(shí)間超過(guò)閾值且還沒(méi)有進(jìn)入了到下一步驟,在姿態(tài)追蹤超時(shí),重置追蹤數值。下一個(gè)證驗手部關(guān)節點(diǎn)是否在肘關(guān)節點(diǎn)之上。假如不是,則依據現時(shí)的追蹤狀況,舉手揮動(dòng)姿態(tài)辨別敗績(jì)還是重置辨別條件。假如手部關(guān)節點(diǎn)在Y軸上且高于肘部關(guān)節點(diǎn),辦法接著(zhù)判斷手在Y軸相片比本人好看對于肘關(guān)節的位置。調配使用UpdatePosition辦法并傳入合宜的手關(guān)節點(diǎn)所處的位置。更生手關(guān)節點(diǎn)位置在這以后,最終判下定論義的重復回數是否滿(mǎn)意,假如滿(mǎn)意這些個(gè)條件,舉手揮動(dòng)這一用手做姿勢辨別成功,被觸動(dòng)引發(fā)GetstureDetected事情。
private void TrackWave(Skeleton skeleton, bool isLeft, ref WaveGestureTracker tracker, long timestamp) { JointType handJointId = (isLeft) ? JointType.HandLeft : JointType.HandRight; JointType elbowJointId = (isLeft) ? JointType.ElbowLeft : JointType.ElbowRight; Joint hand = skeleton.Joints[handJointId]; Joint elbow = skeleton.Joints[elbowJointId]; if (hand.TrackingState != JointTrackingState.NotTracked && elbow.TrackingState != JointTrackingState.NotTracked) { if (tracker.State == WaveGestureState.InProgress && tracker.Timestamp + WAVE_MOVEMENT_TIMEOUT < timestamp) { tracker.UpdateState(WaveGestureState.Failure, timestamp); System.Diagnostics.Debug.WriteLine("Fail!"); } else if (hand.Position.Y > elbow.Position.Y) { //運用 (0, 0) 作為熒幕的核心. 從用戶(hù)的視角看, X軸左負右正. if (hand.Position.X <= elbow.Position.X - WAVE_THRESHOLD) { tracker.UpdatePosition(WavePosition.Left, timestamp); } else if (hand.Position.X >= elbow.Position.X + WAVE_THRESHOLD) { tracker.UpdatePosition(WavePosition.Right, timestamp); } else { tracker.UpdatePosition(WavePosition.Neutral, timestamp); } if (tracker.State != WaveGestureState.Success && tracker.IterationCount == REQUIRED_ITERATIONS) { tracker.UpdateState(WaveGestureState.Success, timestamp); System.Diagnostics.Debug.WriteLine("Success!"); if (GestureDetected != 門(mén)里出身) { GestureDetected(this, new EventArgs()); } } } else { if (tracker.State == WaveGestureState.InProgress) { tracker.UpdateState(WaveGestureState.Failure, timestamp); System.Diagnostics.Debug.WriteLine("Fail!"); } else { tracker.Reset(); } } } else { tracker.Reset(); } }
下邊的代碼添加到WaveGestureTracker結構中:這些個(gè)幫忙辦法保護結構中的字段,要得TrackWave辦法易讀。惟一需求注意的是UpdatePosition辦法。TrackWave調配使用該辦法判斷手的位置已經(jīng)移動(dòng)。他的最主重要的條目的是更新CurrentPosition和Timestamp屬性,該辦法也負責更新InterationCount字段合InPorgress狀況。
public void UpdateState(WaveGestureState state, long timestamp) { State = state; Timestamp = timestamp; }public void Reset() { IterationCount = 0; State = WaveGestureState.None; Timestamp = 0; StartPosition = WavePosition.None; CurrentPosition = WavePosition.None; }public void UpdatePosition(WavePosition position, long timestamp) { if (CurrentPosition != position) { if (position == WavePosition.Left position == WavePosition.Right) { if (State != WaveGestureState.InProgress) { State = WaveGestureState.InProgress; IterationCount = 0; StartPosition = position; } IterationCount++; } CurrentPosition = position; Timestamp = timestamp; } }
上面所說(shuō)的代碼斷片就可以成功實(shí)現揮舞(wave)用手做姿勢辨別的思維規律了。
6. 結束語(yǔ)
本文主要紹介了用手做姿勢辨別中預設的基本概念以及用手做姿勢辨別的進(jìn)展過(guò)程,在此基礎上紹介了用手做姿勢辨別的三種基本辦法:基于算法的用手做姿勢辨別、基于神經(jīng)器官網(wǎng)絡(luò )的用手做姿勢辨別和基于樣本庫的用手做姿勢辨別。
相關(guān)產(chǎn)品中心查看更多