2.1 軟件編程導(dǎo)論
多點(diǎn)觸摸輸⼊編程和其他任何形式的編程⼀樣,不過(guò)在多點(diǎn)觸摸編程⾥,有⼀套⾃⼰的某些協(xié)議,⽅法和標(biāo)準(zhǔn)。通過(guò)NUI Group 與其他組織和社團(tuán)的⼯作,多點(diǎn)觸摸編程已經(jīng)有了針對(duì)多種編程語(yǔ)⾔的開(kāi)發(fā)框架, 這些語(yǔ)⾔包括ActionScript 3,Python,C,C++,C#以及Java。
多點(diǎn)觸摸編程分為兩步:⾸先,從攝像頭或者其他輸⼊設(shè)備讀取和轉(zhuǎn)化輸⼊的觸點(diǎn)信息,傳遞這些原始的觸點(diǎn)信息通過(guò)之前制定的協(xié)議組合成⼿勢(shì),然后⾼級(jí)編程語(yǔ)⾔就可以使⽤⼿勢(shì)來(lái)讓⼀個(gè)應(yīng)⽤程序配合。TUIO(Tangible UserInterface Protocol,可觸摸的⽤戶界⾯協(xié)議)已經(jīng)成為追蹤觸點(diǎn)信息的⾏業(yè)標(biāo)準(zhǔn)協(xié)
議。
以下章節(jié)將討論多點(diǎn)觸摸軟件的兩個(gè)⽅⾯:觸點(diǎn)追蹤和應(yīng)⽤程序運(yùn)⾏框架。
2.2 觸點(diǎn)追蹤
對(duì)象追蹤⼀直是計(jì)算機(jī)視覺(jué)基礎(chǔ)研究領(lǐng)域的⼀個(gè)⽅⾯。它的⼯作是跟蹤包括能夠準(zhǔn)確的反復(fù)識(shí)別包含特定對(duì)象的⼀系列視頻幀(估算)。⼀般來(lái)說(shuō),這是⼀個(gè)⾮常困難的問(wèn)題,因?yàn)?#12216;先要在所有的幀中發(fā)現(xiàn)對(duì)象(⽽且往往是在雜亂,封閉,或者是不斷變換的照明條件下),以及讓數(shù)據(jù)能夠和幀之間以某種⽅式聯(lián)系起來(lái)以便識(shí)別我們所需要的對(duì)象。
現(xiàn)在很多的問(wèn)題已經(jīng)被解決,在追蹤這個(gè)問(wèn)題上最普遍的模式就是“⽣成模式”(Generative Model),這是⼀些諸如Kalman 粒⼦過(guò)濾器等流⾏解決⽅案的基礎(chǔ)。
在⼤多數(shù)的系統(tǒng)中,⼀個(gè)完善的背景相減算法需要對(duì)每幀進(jìn)⾏預(yù)處理,這確保靜態(tài)或者背景圖像能夠被忽略掉。對(duì)于⼀些光照不穩(wěn)定的視頻流,像“⾼斯混合模型”(Gaussian Mixture Model)這樣的⾃適應(yīng)模型已經(jīng)能夠⽐較智能的識(shí)別出不均勻的動(dòng)態(tài)背景。
把背景過(guò)濾掉之后,剩下就是我們需要的前景對(duì)象了。我們往往確定這些對(duì)象的質(zhì)⼼,⽽且這些點(diǎn)會(huì)被⼀幀⼀幀被追蹤。追蹤算法會(huì)根據(jù)這些萃取的質(zhì)⼼估算在下⼀幀觸點(diǎn)的位置。
稍稍說(shuō)⼀下這個(gè)追蹤,例如,⼀個(gè)基于Kalman 過(guò)濾器的簡(jiǎn)單模式可能是⼀個(gè)線性恒定速度模型。⼀個(gè)Kalman 過(guò)濾器有兩個(gè)動(dòng)⼒學(xué)⽅程,⼀個(gè)是STATE⽅程(“狀態(tài)⽅程”),另⼀個(gè)是OBSERVATION ⽅程(“觀察⽅程”),在這個(gè)例⼦中,
這套⽅程分別是
該狀態(tài)⽅程描述了在有噪聲的情況下?tīng)顟B(tài)變量‘xk’的變化情況。如果我們說(shuō)‘xk-1’表⽰物體在‘k-1’時(shí)刻的真實(shí)位置,那么這個(gè)模型就可以基于⼀定的速度、‘Vuk’和噪⾳因素,根據(jù)線性組合的⽅式,推測(cè)出‘k’時(shí)刻物體的位置。到⽬前為⽌,根據(jù)這個(gè)模型,我們還不能直接的通過(guò)觀察預(yù)測(cè)物體的位置Xk,我們需要觀察⽅程。觀察⽅程⽤來(lái)描述實(shí)際觀察變量‘yk’,在這⾥,‘yk’被定義為真正位置‘xk’的⼀個(gè)噪⾳觀察值。噪⾳的值也假定是均值為零的⾼斯⽩噪聲。運(yùn)⽤這兩個(gè)⽅程,卡爾曼濾波器就能根據(jù)物體的上⼀個(gè)位置,通過(guò)遞歸的⽅式預(yù)測(cè)出物體的位置。
每個(gè)狀態(tài)的預(yù)測(cè),數(shù)據(jù)追蹤模塊都會(huì)去按照事先的預(yù)測(cè)和觀測(cè)數(shù)據(jù)去追蹤對(duì)象。如果沒(méi)有找到符合預(yù)想的對(duì)象,那么這個(gè)對(duì)象就會(huì)被視為⼀個(gè)新的對(duì)象⽽被追蹤。
2.2.1 多點(diǎn)觸摸的追蹤
追蹤是多點(diǎn)觸摸⾮常重要的技術(shù)。它允許多個(gè)⼿指同時(shí)進(jìn)⾏控制。我們也可以識(shí)別出⼿勢(shì),因?yàn)槊總(gè)⼿指的軌跡都可以被記錄并輸出。沒(méi)有追蹤技術(shù),這是不可能的。
值得慶幸的是,今天的多點(diǎn)觸摸硬件⼤⼤地簡(jiǎn)化了追蹤對(duì)象的流程,因此,即使是最簡(jiǎn)單的Kalman 濾波器實(shí)際上也成為不必要的了,F(xiàn)在的追蹤系統(tǒng)性能瓶頸趨向于怎么產(chǎn)⽣并維持⼀個(gè)背景模型。⼤量的計(jì)算會(huì)使CPU 嚴(yán)重超負(fù),除⾮出現(xiàn)更加智能的⽅案。然⽽現(xiàn)在的基于紅外線(IR)的硬件⽅案,⽐如FTIR 或DI,⾃適應(yīng)背景模型(adaptive background model)會(huì)被扼殺掉。由于⾮紅外光⼏乎都會(huì)被過(guò)濾掉,所以⼤部分的背景就被硬件給刪除了。為了這些紅外圖像,捕捉⼀個(gè)靜態(tài)的背景圖往往會(huì)刪除⼏乎所有的環(huán)境光。這個(gè)背景圖像會(huì)減去其后所有的幀,剩下的這些幀將作為閾值應(yīng)⽤給系統(tǒng),然后我們就只剩下了那些突起的點(diǎn),這些點(diǎn)也就是我們想要捕捉的⼿指或者表⾯對(duì)象,稱之為“觸點(diǎn)”。[譯者注:這個(gè)可能⽐較難理解,我給⼤家舉個(gè)例⼦吧,⽐如我們?cè)赑S 中的“閾值”命令,可以將灰度或彩⾊圖像轉(zhuǎn)換為⾼對(duì)⽐度的⿊⽩圖像。“閾值”命令可以確定圖像的最亮和最暗區(qū)域。想想我們的在CCV 或者tbeta 中看到的捕捉后的圖像,不就是⿊⽩對(duì)⽐⾮常明顯的圖像么?背景是純⿊,⼿指尖是純⽩。]
此外,只要給出范圍,那么追蹤問(wèn)題就⽐較簡(jiǎn)單了。我們知道,從⼀幀到下⼀幀,以標(biāo)準(zhǔn)的30Hz 計(jì)算的話為33ms,⼀個(gè)⼈的⼿指在這段時(shí)間⾥移動(dòng)的距離⾮常有限。根據(jù)這種預(yù)測(cè),我們不⽤研究物體的動(dòng)⼒學(xué),只需要找兩幀之間最近的匹配物就是了。近鄰⽐較的⽅式是⽐較相應(yīng)的數(shù)據(jù),⼀般是⽐較歐⼏⾥德⼏何距離。通過(guò)這種⽅式,⼀個(gè)數(shù)據(jù)點(diǎn)和⼀系列靠近它的‘k’點(diǎn)進(jìn)⾏⽐較,得到該點(diǎn)的新位置。通過(guò)這種⽅式,我們可以⽐較可靠的追蹤某個(gè)具體的觸點(diǎn)。試誤法是經(jīng)常采⽤的⽅法,當(dāng)情況不確定的時(shí)候,我們總是試探著處理這些情況,⽐如,當(dāng)⼀個(gè)物體擋住另外⼀個(gè)物體的時(shí)候。
在Touchlib 和CCV 框架中都有追蹤器的實(shí)例。使⽤OpenCV,⼀個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù),可以直接處理圖像和視頻流,能夠⾮常準(zhǔn)確地實(shí)時(shí)追蹤到觸點(diǎn)。當(dāng)⼀個(gè)觸點(diǎn)被發(fā)現(xiàn),消失或者移動(dòng)的時(shí)候,這些觸點(diǎn)的相關(guān)信息(位置,ID,區(qū)域等)都會(huì)以事件的形式發(fā)送出去。開(kāi)發(fā)者就可以利⽤這些信息去監(jiān)聽(tīng)這些觸點(diǎn)開(kāi)發(fā)出應(yīng)⽤程序。