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