也許你曾經(jīng)聽說過增強(qiáng)現(xiàn)實(shí)——目前是移動(dòng)領(lǐng)域一個(gè)熱門的技術(shù)因谎。你將會(huì)從這篇介紹性的文章當(dāng)中繁仁,學(xué)習(xí)到什么是增強(qiáng)現(xiàn)實(shí)技術(shù)肴敛,以及如何在你的安卓應(yīng)用程序當(dāng)中利用這門技術(shù)缰猴。
增強(qiáng)現(xiàn)實(shí)的定義
在我們開始討論如何去編寫增強(qiáng)現(xiàn)實(shí)應(yīng)用之前,讓我們退一步看一下它的定義是什么喊递。維基百科定義增強(qiáng)現(xiàn)實(shí)如下:
"增強(qiáng)現(xiàn)實(shí)(AR)是一種通過計(jì)算機(jī)虛擬化技術(shù)随闪,把真實(shí)世界中的聲音和圖像信息加到用戶的感官感覺上的方式。它通常也被稱作叫介導(dǎo)現(xiàn)實(shí)(mediated reality)骚勘,像是現(xiàn)實(shí)被計(jì)算機(jī)給修改了(更可能是減弱而不是增強(qiáng))铐伴。總而言之俏讹,這項(xiàng)技術(shù)主要提升了個(gè)人對現(xiàn)實(shí)的感知当宴。"
最近移動(dòng)開發(fā)者已經(jīng)開始利用起增強(qiáng)現(xiàn)實(shí)技術(shù),他們獲取攝像頭的輸入并且實(shí)時(shí)地疊加圖像泽疆,通常來說是根據(jù)圖像去顯示一些真實(shí)世界的東西或者一個(gè)虛擬的標(biāo)志或者對象户矢。
這并不是說今天產(chǎn)生了什么新的對增強(qiáng)現(xiàn)實(shí)技術(shù)的更寬泛的定義。有人可能會(huì)說殉疼,你看逗嫡,Google 的 Sky Map 就不是通過攝像頭去繪制的,但是我們也稱之增強(qiáng)現(xiàn)實(shí)株依,它已經(jīng)把其他增強(qiáng)現(xiàn)實(shí)做的事情都做了(見下圖)驱证。其實(shí),真的不要太糾結(jié)于這些定義恋腕,更應(yīng)該去想想你的應(yīng)用程序有哪些可以利用實(shí)時(shí)地現(xiàn)實(shí)數(shù)據(jù)的機(jī)會(huì)抹锄。比如說,eBay 最近宣稱他們加了增強(qiáng)現(xiàn)實(shí)特性到他們的時(shí)尚應(yīng)用程序當(dāng)中荠藤。這個(gè)特性允許用戶去看自己戴不同太陽眼鏡的樣子伙单。
本基礎(chǔ)教程的剩下內(nèi)容會(huì)討論虛擬現(xiàn)實(shí)技術(shù)的各個(gè)方面,以及他們?nèi)绾螒?yīng)用在安卓上哈肖。教程不會(huì)深入到具體的實(shí)現(xiàn)過程上吻育。那樣的話會(huì)超出本教程的范圍,當(dāng)然如果讀者對這部分特別感興趣淤井,我們可以繼續(xù)沿著這條路往前走并且提供一些具體的教程布疼。
為什么要重新發(fā)明輪子摊趾?你應(yīng)用程序上已經(jīng)存在簡單的 AR 底層支持
已經(jīng)覺得不堪重負(fù)了?也許你有一些數(shù)據(jù)游两,希望別人在增強(qiáng)現(xiàn)實(shí)的環(huán)境中去探索砾层,但是你不想在你的應(yīng)用程序中把整個(gè) AR 底層都實(shí)現(xiàn)一遍。如果真的把這些東西都加到你的項(xiàng)目中贱案,看上去會(huì)毀了你的整個(gè)項(xiàng)目肛炮,這個(gè)時(shí)候你打算怎么辦?
試著去用一些已經(jīng)存在的 AR 服務(wù)宝踪,比如 Layar侨糟。他們同時(shí)提供了安卓和蘋果平臺(tái)的客戶端。舉例來說瘩燥,這個(gè) Layar 服務(wù)允許任何人去添加數(shù)據(jù)粟害,然后顯示給用戶,并且封裝了 AR 的一些細(xì)節(jié)颤芬。更好的是,它是跨平臺(tái)的套鹅,所以你可以同時(shí)做安卓和蘋果平臺(tái)的客戶端站蝠。
提供你自定義的 AR 實(shí)現(xiàn):基礎(chǔ)部分
現(xiàn)在我們有一個(gè)共同的增強(qiáng)現(xiàn)實(shí)的定義,讓我們開始討論把它和你 AR 應(yīng)用程序中的安卓組件結(jié)合在一起卓鹿。
典型的 AR 實(shí)現(xiàn)包含兩個(gè)主要的部分:我們正在增強(qiáng)地“實(shí)時(shí)”數(shù)據(jù)菱魔,以及用于增強(qiáng)的“元”數(shù)據(jù)。以真實(shí)世界的例子來說吟孙,我們正在增強(qiáng)地實(shí)時(shí)數(shù)據(jù)通常會(huì)結(jié)合后者攝像頭的取景器信息澜倦,當(dāng)前的位置,以及設(shè)備面對的方向杰妓。這些信息稍后會(huì)跟“元”數(shù)據(jù)進(jìn)行交叉引用藻治。
例如,如果我們想在取景器中看到加油站的位置巷挥,AR “服務(wù)”必須有每個(gè)加油站的增強(qiáng)數(shù)據(jù)桩卵,包括他們的維度和經(jīng)度。使用這些信息倍宾,結(jié)合設(shè)備/攝像頭指向的方向雏节,我們可以大致地得到每個(gè)加油站在取景器窗口的位置,并且在上面顯示一個(gè)燃料圖標(biāo)高职。
增強(qiáng)數(shù)據(jù)源(比如:加油站位置列表)可以是任何東西钩乍,但是通常預(yù)讀取的數(shù)據(jù)庫或者是網(wǎng)絡(luò)服務(wù),可以過濾一些附近有趣的地點(diǎn)怔锌。
剩下的 AR 實(shí)現(xiàn)部分由這些內(nèi)容組成:使用設(shè)備攝像頭的 API寥粹,圖像 的API变过,以及利用傳感器 的API去實(shí)時(shí)數(shù)據(jù)上加入增強(qiáng)數(shù)據(jù),創(chuàng)建一個(gè)良好的增強(qiáng)體驗(yàn)排作。
關(guān)鍵 AR 組件 #1:攝像頭數(shù)據(jù)
在增強(qiáng)現(xiàn)實(shí)中牵啦,安卓攝像頭里面顯示的實(shí)時(shí)反饋叫做現(xiàn)實(shí)。通過 android.hardware.Camera 包的一些 API 可以獲取到攝像頭數(shù)據(jù)妄痪。
如果你的應(yīng)用不需要分析幀數(shù)據(jù)哈雏,那么可以使用一個(gè)帶有 SetPreviewDisplay() 方法的 SurfaceHolder 對象去開啟一個(gè)預(yù)覽。通過這個(gè)方法衫生,你就可以顯示現(xiàn)在攝像頭正在錄制什么內(nèi)容裳瘪。無論如何,如果你的應(yīng)用需要幀數(shù)據(jù)罪针,可以通過一個(gè)合法的 Camera.PreviewCallback 對象去調(diào)用 SetPreviewCallback() 方法彭羹。
關(guān)鍵 AR 組件 #2:位置數(shù)據(jù)
對于大多數(shù)增強(qiáng)現(xiàn)實(shí)的應(yīng)用來說,只有攝像頭的反饋是不夠的泪酱。你還需要去確定設(shè)備的位置(以及用戶的位置)派殷。想要完成這個(gè)任務(wù)的話,你通常會(huì)需要用到 android.location 包以及 LocationManager 類的一些 API墓阀,它們會(huì)提供給你合適的或者是大概的位置信息毡惜。這樣的話,你的應(yīng)用就可以監(jiān)聽到位置事件斯撮,并且用這些去確定設(shè)備附近有哪些有趣的實(shí)時(shí)的東西经伙。
如果你正在構(gòu)建一個(gè)增強(qiáng)現(xiàn)實(shí)的應(yīng)用,并且準(zhǔn)備利用計(jì)算機(jī)視覺技術(shù)去分析攝像頭的反饋(換句話說勿锅,通過對輸入的圖像進(jìn)行數(shù)據(jù)提取帕膜,計(jì)算機(jī)會(huì)“看到”一些東西),從而確定在哪兒放置增強(qiáng)數(shù)據(jù)溢十,你也許不需要去知道設(shè)備的位置垮刹。計(jì)算機(jī)視覺技術(shù)目前研究的比較深入。大多數(shù)的解決方案可以從 OpenCV 庫中獲取到张弛。更多關(guān)于 OpenCV 的信息可以從 OpenCV wiki 里面找到危纫。
當(dāng)不使用位置數(shù)據(jù)的時(shí)候,經(jīng)常會(huì)用一個(gè) “marker” 或者是 “tag” 代替乌庶。那是一個(gè)非常易于識別的對象种蝶,可以方便我們快速的確定要繪制的物體的方向和縮放情況。比如說瞒大,AndAR 使用一個(gè)非常簡單的 marker 螃征,方便在上面繪制一個(gè)立方體,作為 AR 能力的測試透敌。
關(guān)鍵 AR 組件 #3:傳感器數(shù)據(jù)
傳感器數(shù)據(jù)對 AR 實(shí)現(xiàn)是非常重要的盯滚。比如說踢械,當(dāng)我們需要試著去保持跟攝像頭反饋的數(shù)據(jù)同步的時(shí)候,知道手機(jī)的旋轉(zhuǎn)方向非常有用魄藕。
在安卓設(shè)備上去確定旋轉(zhuǎn)方向内列,你會(huì)需要利用到 android.hardware.SensorManager 包。有一些你可能會(huì)用到的傳感器:
? 1. Sensor.TYPE_MAGNETIC_FIELD
? 2. Sensor.TYPE_ACCELEROMETER
? 3. Sensor.TYPE_ROTATION_VECTOR
這些傳感器的使用背率,讓用戶移動(dòng)設(shè)備的同時(shí)话瞧,在屏幕里面可以看到相關(guān)的變化,從而使得用戶有一種身臨其境的感覺寝姿。當(dāng)攝像頭的反饋展現(xiàn)出來的時(shí)候交排,效果值得商榷,但是在其他應(yīng)用當(dāng)中饵筑,比如說探索已經(jīng)預(yù)先存儲(chǔ)好的圖像數(shù)據(jù)的時(shí)候(比如說 Google Sky Map 或者是 Street View)埃篓,這項(xiàng)技術(shù)還是挺有用的,特別是對用戶來說很直觀根资。
結(jié)合到一起:圖層遮罩
當(dāng)然架专,整個(gè)增強(qiáng)現(xiàn)實(shí)的重點(diǎn)當(dāng)然是通過攝像頭的反饋區(qū)繪制一些東西,增強(qiáng)用戶所實(shí)時(shí)看到的玄帕。概念上部脚,基于攝像頭的反饋繪制東西是非常簡單的。至于你如何去實(shí)現(xiàn)呢桨仿,看你自己了。
你可以讀取攝像頭反饋的每一幀案狠,加入一個(gè)遮罩服傍,并且在屏幕上繪制一層(允許是一個(gè) BitMap 或者是 一個(gè) 3D 表面的紋理)。具體來說骂铁,你可以利用 ?android.hardware.Camera.PreviewCallback 類吹零,它允許你去得到應(yīng)用每一幀的圖像。
另外拉庵,你可以使用一個(gè)標(biāo)準(zhǔn)的 Surface Holder 加上 android.hardware.Camera 對象灿椅,然后就可以輕松地繪制在該表面的上方了。
最后钞支,你繪制什么茫蛹,以及如何繪制,都取決于你不同的應(yīng)用程序的需求——安卓有不少的 2D 或者是 3D 圖像的 API 可以用烁挟,尤其是一些 android.graphics 和 android.opengl 包里面的 API婴洼。
存儲(chǔ)和訪問增強(qiáng)數(shù)據(jù)
所以說,這些增強(qiáng)的數(shù)據(jù)從哪里來呢撼嗓?通常來說柬采,你應(yīng)該是從你自己的數(shù)據(jù)庫里面獲取得到欢唾,有可能是存儲(chǔ)在本地,或者是通過云服務(wù)存儲(chǔ)在線上的數(shù)據(jù)庫粉捻。如果你已經(jīng)想預(yù)先把數(shù)據(jù)存在設(shè)備里面礁遣,你可能會(huì)想使用一個(gè) SQLite 數(shù)據(jù)庫簡單快速的查詢;你會(huì)發(fā)現(xiàn) SQLite 的 API 在 android.database.sqlite 包里面肩刃。對于基于 web 的數(shù)據(jù)來說祟霍,你可能會(huì)想要連接到一個(gè) web 的服務(wù)上,然后用通常的方法:HTTP 和 XML 解析來處理树酪。對于這種情況妆丘,你可以簡單的使用 java.net.URL 類以及一個(gè) XML 解析的類碍彭,比如說 XmlPullParser 類,來解析出結(jié)果。
結(jié)論
增強(qiáng)現(xiàn)實(shí)是一個(gè)很廣泛的話題臊岸,觸及到了安卓開發(fā)的方方面面,以及許多的 API吝梅。在這個(gè)基礎(chǔ)教程中员咽,你已經(jīng)學(xué)到了什么是增強(qiáng)現(xiàn)實(shí),以及安卓組件如何處理(以及相關(guān)安卓 API)×κ裕現(xiàn)在徙邻,你可以結(jié)合這些新的知識,加上你對安卓 SDK 的了解畸裳,去加強(qiáng)你已經(jīng)寫好的應(yīng)用程序缰犁,或者是構(gòu)建新的增強(qiáng)現(xiàn)實(shí)的應(yīng)用程序。
原文地址:http://code.tutsplus.com/tutorials/android_augmented-reality--mobile-4457