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