手機(jī)中的 AR 小應(yīng)用究竟是如何實(shí)現(xiàn)的?
農(nóng)場(chǎng)中一頭奶牛悠閑地吃著草,一個(gè)卡通小人兒在和消費(fèi)者聊著天。出現(xiàn)這一切,都源于一個(gè)簡(jiǎn)單的牛奶瓶。消費(fèi)者通過(guò)手機(jī)或平板掃描牛奶瓶身上的圖案,就會(huì)呈現(xiàn)一個(gè)虛擬農(nóng)場(chǎng),可以選擇各種小動(dòng)物,并和它們進(jìn)行互動(dòng)。
這種深受孩子喜愛(ài)的宣傳方式是怎么實(shí)現(xiàn)的呢?其實(shí)這個(gè)過(guò)程只需要六步:
通過(guò)攝像頭采集實(shí)時(shí)視頻;
將采集到的視頻流數(shù)字化成圖像,然后通過(guò)上文的特征點(diǎn)檢測(cè)、特征點(diǎn)描述子生成、特征點(diǎn)匹配一系列處理,找到識(shí)別標(biāo)識(shí)物;
識(shí)別出標(biāo)識(shí)物后,以標(biāo)識(shí)物作為參考,確定要生成的動(dòng)畫在 AR 環(huán)境中的位置和方向,并確定提前存入手機(jī)中的標(biāo)識(shí)圖位置;
標(biāo)識(shí)物中的標(biāo)識(shí)符號(hào)與預(yù)設(shè)的目標(biāo)圖進(jìn)行匹配;
程序根據(jù)標(biāo)識(shí)物位置調(diào)整動(dòng)畫(虛擬信息)位置;
動(dòng)畫(虛擬信息)被渲染進(jìn)視頻流。
這就是 AR 的實(shí)現(xiàn)過(guò)程,今天將為大家解釋六步中的“精華”——識(shí)別并跟蹤標(biāo)識(shí)物。
牛奶瓶上的特點(diǎn)
當(dāng)消費(fèi)者拿起手機(jī)掃描牛奶瓶時(shí),手機(jī)是怎么判斷這幅圖是不是自己要找的目標(biāo)呢?
目標(biāo)圖是在開(kāi)發(fā)這款 AR 應(yīng)用時(shí)提前讀入 app 的。啟動(dòng) app 后,它就開(kāi)始查找與標(biāo)識(shí)圖相同的幀。
這就像警察在抓逃犯時(shí),會(huì)在各交通要道設(shè)立排查點(diǎn),將過(guò)往行人與逃犯照片進(jìn)行對(duì)比,進(jìn)行排查。警察在比對(duì)照片時(shí),不會(huì)每根頭發(fā),每個(gè)毛孔都要進(jìn)行比較。他們會(huì)關(guān)注嫌疑人的一些顯著外貌特征,與這些特征相似度極高的人視為犯罪嫌疑人。
同理,圖像識(shí)別中的目標(biāo)圖也具有特征,我們將這些特征稱為“特征點(diǎn)”。
那么問(wèn)題來(lái)了,如何找到這些點(diǎn)?
圖像在電子設(shè)備中的狀態(tài)是一堆數(shù)字。特征點(diǎn)就是那些和周圍數(shù)字值相差較大的點(diǎn),檢測(cè)方法一般有:FAST、Harris、SIFT、SURF、MSER 等。
FAST 特征點(diǎn)檢測(cè)法因檢測(cè)速度快而深受研究者喜愛(ài),具體遵循以下步驟:
首先,從圖像中選取一個(gè)像素,記作 P。如果我們想判斷它是否為一個(gè)特征點(diǎn),首先把 P 點(diǎn)的亮度值記作 I。再設(shè)定一個(gè)合適的閾值 t,用來(lái)控制特征點(diǎn)的選取。以 P 為圓心,3 個(gè)像素為半徑做圓,這個(gè)圓的邊界上有 16 個(gè)像素,如下圖所示:
如果這 16 個(gè)像素的像素值都比 I+t 大,或都比 I-t 小,那么 P 就是一個(gè)特征點(diǎn)。一般在實(shí)際檢測(cè)中,這 16 個(gè)像素不用全部與 P 的亮度值進(jìn)行比較,只要有 3/4 個(gè)以上的像素亮度值比 P+t 大或比 P-t 小,就可以認(rèn)為 P 點(diǎn)為特征點(diǎn)。
簡(jiǎn)單來(lái)說(shuō),特征點(diǎn)就是與周圍反差較大的點(diǎn),就像下圖所示:
找到特征點(diǎn)就可以識(shí)別了么?
只知道檢測(cè)到特征點(diǎn)還不行,必須知道兩張圖像中的特征是否一致。如何判斷特征點(diǎn)是否一致,就需要借助特征點(diǎn)描述子了。
特征點(diǎn)描述子是一種描述特征點(diǎn)的方法。比如,我們?cè)谔粑鞴蠒r(shí),會(huì)選根蒂蜷縮、敲起來(lái)聲音濁響的青綠西瓜。這個(gè)挑瓜的過(guò)程就是描述的過(guò)程,挑瓜的依據(jù)就相當(dāng)于生成的描述子。
如果一個(gè)瓜和我們的挑瓜條件相似或相同,那么我們就判斷它是一個(gè)好瓜。同樣的如果一幅圖像中有一個(gè)點(diǎn)和我們的描述子相似或相同,那么就可以判斷它們?yōu)橥惶卣鳌?/p>
找到了特征點(diǎn)描述子,接下來(lái)就是要在目標(biāo)圖和識(shí)別圖之間進(jìn)行匹配。
判斷兩幅圖是否為同一幅圖的標(biāo)準(zhǔn)是人為控制的。我們既可以設(shè)置匹配率為 10% 以上的兩幅圖像是同一圖像,也可以設(shè)置匹配率為 90% 以上。具體標(biāo)準(zhǔn)根據(jù)應(yīng)用所需而定。
目前,特征點(diǎn)匹配技術(shù)大概分為兩類:一類是分別獲取兩幅圖像的特征點(diǎn)及特征點(diǎn)描述子,根據(jù)一定的搜索策略對(duì)這些特征點(diǎn)和描述子進(jìn)行計(jì)算,最終獲得最優(yōu)極值點(diǎn)即為匹配結(jié)果;另一類是只獲取參考幀圖像的特征點(diǎn)信息,并利用它在當(dāng)前幀上尋找最優(yōu)匹配,這種匹配的最大優(yōu)點(diǎn)是只需提取參考幀的特征點(diǎn),節(jié)約了一半的特征點(diǎn)提取時(shí)間。
發(fā)現(xiàn)目標(biāo)要盯緊
從文章開(kāi)頭的視頻中可以看到,當(dāng)小孩拿著 iPad 轉(zhuǎn)動(dòng)時(shí),生成的動(dòng)畫會(huì)保持不動(dòng)。給我們一種“動(dòng)畫和牛奶是一個(gè)整體”的錯(cuò)覺(jué)。要想達(dá)到這種效果,需要對(duì)視頻流中的圖像進(jìn)行特征點(diǎn)跟蹤。
特征跟蹤有兩種方式,一種是對(duì)視頻流中的每一幀圖像,進(jìn)行特征點(diǎn)匹配。另一種則在第一幅圖像中,尋找可能的特征位置,然后在后續(xù)的圖像中搜索它們的對(duì)應(yīng)位置。顯然,這類“先檢測(cè)后跟蹤”的方法適合用在視頻跟蹤應(yīng)用中。
在跟蹤過(guò)程中,相鄰兩幀經(jīng)過(guò)匹配后,得到當(dāng)前幀的目標(biāo)特征點(diǎn)。由于得到的目標(biāo)特征點(diǎn)中存在不穩(wěn)定特征點(diǎn),因此需要將這些不穩(wěn)定的點(diǎn)剔除。
但又出現(xiàn)了一個(gè)新的問(wèn)題,即隨著跟蹤的進(jìn)行,有效特征點(diǎn)會(huì)逐漸減少。尤其是在跟蹤過(guò)程中當(dāng)目標(biāo)姿態(tài)發(fā)生了大幅度變化時(shí),經(jīng)常會(huì)出現(xiàn)目標(biāo)的特征點(diǎn)急劇減少甚至消失的情況,這樣會(huì)導(dǎo)致跟蹤效果不好甚至跟蹤失敗。
這就像賣水果的小商販經(jīng)常會(huì)挑出好的水果擺放在最前面,隨著客人的購(gòu)買,再繼續(xù)往上添加。
解決特征點(diǎn)減少問(wèn)題的方法和賣水果是一樣的。只需擴(kuò)大范圍搜索重新提取特征點(diǎn),即當(dāng)前時(shí)刻目標(biāo)物中得到的特征點(diǎn)的個(gè)數(shù)小于一定的閾值時(shí),擴(kuò)大跟蹤面積重新提取特征點(diǎn),將重新提取到的特征點(diǎn)用在接下來(lái)的跟蹤過(guò)程中。
農(nóng)場(chǎng)中一頭奶牛悠閑地吃著草,一個(gè)卡通小人兒在和消費(fèi)者聊著天。出現(xiàn)這一切,都源于一個(gè)簡(jiǎn)單的牛奶瓶。消費(fèi)者通過(guò)手機(jī)或平板掃描牛奶瓶身上的圖案,就會(huì)呈現(xiàn)一個(gè)虛擬農(nóng)場(chǎng),可以選擇各種小動(dòng)物,并和它們進(jìn)行互動(dòng)。
在跟蹤的同時(shí)還需要完成一件事情,那就是渲染動(dòng)畫。動(dòng)畫必須和識(shí)別圖位置保持一致才能達(dá)到融合效果。
目前手機(jī)端 AR 應(yīng)用開(kāi)發(fā)多數(shù)是采用這種圖像法,這種方法已經(jīng)被模式化。開(kāi)發(fā)者不用考慮上述這些底層實(shí)現(xiàn),可以使用一些插件來(lái)實(shí)現(xiàn)。常用插件國(guó)外的有 Vuforia、Metaio 等,國(guó)內(nèi)有 HiAR、EasyAR、VoidAR 等。