陳先宇
(重慶交通大學,重慶 400074)
近年來,有大量關于增強現(xiàn)實技術的研究,并且將該技術應用于各種設備上的開發(fā),如頭戴式顯示器、智能手機、專用的嵌入式設備等。[1-3]增強現(xiàn)實技術可以用來探索周邊環(huán)境、游戲或者導航。[4]無論何種目的,開發(fā)者的目標都是提供一個豐富的體驗,盡可能地接近于真實,但對于設備的資源來說承受很大壓力。通常情況下,這些設備尺寸小、重量輕、易攜帶。因為智能手機是上述設備中能力最強的,也是最常用的,所以將智能手機作為應用開發(fā)的載體。
研究更吸引人和內容更豐富的推送信息給智能手機用戶的新方式,來代替?zhèn)鹘y(tǒng)的信息版面。一個帶有攝像頭的智能手機可以帶用戶進入一個虛擬世界,例如,在一個博物館里,一張簡單的地圖可以疊加上一個描繪部隊行動的動畫,而圖片海報可以疊加上短視頻。
將QR 碼作為增強現(xiàn)實系統(tǒng)的初始研究標志,是因為它在不同的移動平臺上有相關的實現(xiàn)。[5]QR碼提供兩個重要特征:
(1)存儲壓縮信息,容量足夠大,可以實現(xiàn)一個客戶端-服務器系統(tǒng)來獲取信息;
(2)提供簡單的檢測平面的手段,即通過其邊角來進行定位。
以Android 系統(tǒng)為例,提出一個基于QR 碼的智能手機增強現(xiàn)實系統(tǒng),它讓用戶可以在室外和室內使用增強現(xiàn)實技術,也可以顯示不同類型的內容。
系統(tǒng)的基本要求就是在特殊的標志上面覆蓋圖片、動畫或影片。例如當人們游覽一個博物館時,可以通過智能手機拍攝標志,利用增強現(xiàn)實技術展示更吸引人、內容更豐富的信息,豐富人們的感受。
系統(tǒng)使用QR 碼作為標志來實現(xiàn)增強現(xiàn)實技術,因為QR 碼有如下優(yōu)點:包含可以用來定義內容的數(shù)據(jù)、包含關于標志物理位置的數(shù)據(jù)。但是,QR 碼也存在如下缺點:識別速度慢,有效識別的角度有限等。[5]不過,一般情況下,用戶使用手機拍攝QR 碼時,不會與QR 碼保持太大的角度,因此有效識別角度有限這一缺點可以不予考慮。而QR 碼識別速度慢,但在現(xiàn)實應用場景中,不要求用戶與虛擬信息進行實時互動,所以識別速度慢的缺點也可以接受,而且在識別完當前幀的QR 碼,會沿用上一幀的增強現(xiàn)實內容,不會中斷顯示,對用戶來說顯示的內容是連續(xù)的。
系統(tǒng)的架構如圖1 所示,由一個客戶端和一個服務器組成,服務器的工作是存儲內容、響應客戶端下載內容的請求和管理數(shù)據(jù)庫存在的內容;客戶端接收內容并將其在智能手機上顯示出來;服務器和客戶端間采用一定的通信協(xié)議進行信息和數(shù)據(jù)交換。
圖1 增強現(xiàn)實系統(tǒng)架構
客戶端應用周期運行如圖2 所示,那些步驟代表順序執(zhí)行的操作。
圖2 客戶端運行周期
服務器的架構則十分簡單,它包含一系列響應客戶端請求的Java servlet 和足夠存儲所有內容的空間。另外,使用一個Web 管理模塊,負責內容的增加、刪除或修改。系統(tǒng)使用Google 公司提供云計算平臺——Google App Engine,作為集成的存儲系統(tǒng)。
為了加快實際內容的展示,充分利用設備的處理能力,設計了一系列模塊,模塊彼此之間獨立運行。另外,為了確保內容顯示模塊不會被其他進程拖慢速度,使用管道編程模型。每個模塊讀取輸入緩存區(qū)的數(shù)據(jù),處理之后將數(shù)據(jù)寫入另一個緩存區(qū)給另一個模塊使用。例如,當內容下載模塊必須連接服務器并獲取內容時,其他模塊不需要等待,而是保持運行狀態(tài),處理它們現(xiàn)有的數(shù)據(jù)。
系統(tǒng)將運行過程整合成幾個獨立的模塊,這些模塊可以通過獨立的線程并行運行。這樣一來,可以盡可能快地將需要顯示的內容顯示在屏幕上。
系統(tǒng)的模塊如下:
(a)圖像獲取模塊:初始化攝像頭,獲取每一幀圖像;
(b)QR 碼識別模塊:搜索圖像幀中的QR碼,并將其解碼;
(c)平面檢測模塊:使用QR 碼的四個定位點,計算透視變換矩陣;
(d)內容獲取模塊:搜索設備內存,獲取相應內容,搜索不到則連接服務器下載;
(e)內容變換模塊:將需要顯示的內容按照(c)模塊得出的透視變換矩陣進行透視變換;
(f)內容顯示模塊:將正確的增強現(xiàn)實效果,即(e)模塊變換后的內容呈現(xiàn)在獲取的視頻幀上。
如圖2 所示,內容變換模塊和內容顯示模塊作為一個步驟,只要內容變換模塊不提供新的輸出,內容顯示模塊將一直呈現(xiàn)同一個圖像,這樣可以減小QR 碼識別速度慢的問題對顯示的影響。
圖3 為所有模塊的分層結構,更好地解釋數(shù)據(jù)的獨立性和所有模塊處理一組數(shù)據(jù)的順序。圖4 為應用于之前定義的模塊中的管道編程模型,相鄰兩個模塊之間設置一個緩存區(qū),供兩者交換數(shù)據(jù),前者將其作為輸出地址,后者將其作為輸入源,采用管道編程模型后。
圖3 系統(tǒng)模塊的分層結構
圖4 模塊間的管道編程模型
客戶端應用程序將所有已下載的內容存儲到本地設備中,以便這些內容可以再次載入顯示,并且不需再次連接服務器去獲取。
當客戶端解碼QR 碼后,獲取了內容ID,應用程序檢查這些內容是否在本地可以找到。為了實現(xiàn)這一功能,設計了一個固定的文件夾格式,將所有內容存儲路徑設置為:/sdcard/ARinfo/ [ContentID],其中[ContentID]為內容ID。如果某個內容文件沒有被找到,那么應用程序將發(fā)送請求給服務器,下載相應內容。
本系統(tǒng)設計內容高速緩存的原因是從內存中載入內容比從服務器下載快得多。就圖像或動畫來說,處理過程幾乎是實時的;但視頻的載入需要更多的時間,獲取視頻文件所需的緩存機制也需要高速緩存,當整個視頻文件過大時,是無法完全載入到內存中的。如果沒有高速緩存,就無法快速加載視頻,實現(xiàn)不了實時視頻流。
永久的內容存儲在服務器上實現(xiàn),系統(tǒng)使用Google App Engine API 提供的Datastore 和Blobstore。Blobstore 用來存儲實際內容文件和它的索引;而所有其他元數(shù)據(jù)(如內容ID)則存儲在Datastore。服務器的接口允許管理員輕松地通過客戶端添加內容。
系統(tǒng)使用兩個Java 庫確保應用運行得正確而快速:Open CV 和Zxing,Open CV 用來檢測平面,Zxing 用來讀取二維碼,客戶端執(zhí)行程序的偽代碼如下:
while (app 在前臺){
從攝像機緩存中復制視頻幀
使用Zxing 尋找視頻幀中的QR 碼if (QR 碼存在){
解碼服務器地址
解碼內容ID
保存QR 碼的定位角信息
}
else
continue
if (內容在內部存儲器)
將內容載入內存
else {
從服務器下載內容
將內容載入內存
}
使用QR 碼定位角信息檢測平面
將內容進行相應的透視變換
顯示變換后的內容
}
對于無聲動畫,本系統(tǒng)采用GIF 格式,將圖像幀與主執(zhí)行線程同步。因為不需要所有幀都被處理或者顯示,所以加快了處理速度。
對于音頻/視頻材料,本系統(tǒng)獲取視頻源的單個幀后,與音頻源同步,但是這樣一來,處理速度大大下降,以致圖像最終顯示中斷。為了顯示這些視頻,ffmpeg 庫的移植是必要的。本文使用Android Native Development Kit (原生開發(fā)工具包,簡稱NDK)對ffmpeg 庫進行編譯,以便它可以在本文的Java 應用程序使用。庫內的C 代碼可以很容易地通過Java Native Interface (Java 本機接口,簡稱JNI)從Java 中調用。這個庫主要用于在特定的時間戳從視頻文件中提取單個幀。視頻文件的音頻流的渲染使用Android-specific MediaPlayer (針對Android 的媒體播放器),音頻通過使用相同的時間戳與視頻同步。
應用程序的內容類提供對所有可以顯示的文件類型的統(tǒng)一訪問。因此,無論處理一幅圖像、一個動畫或一段影片,都確保內容變換模塊使用正確的圖像。對于視頻或動畫,主執(zhí)行線程負責調用nextFrame ()方法,發(fā)送信號到需要一個新圖象的內容類。
用戶界面包括兩個activities:
Main Activity 用來顯示攝像頭拍攝到的畫面,同時疊加上相應的虛擬圖像。從操作系統(tǒng)而來的重要信息,如事件(當應用程序退到后臺或提到前臺),也在這接收。當應用程序啟動或者提到前臺時,重要的操作被執(zhí)行,如啟動工作線程或獲取接入和初始化攝像頭。
Settings Activity 負責顯示配置選項。用戶可以選擇顯示內容的語言,攝像頭分辨率,也可以選擇打開調試信息。這個activity 可以通過按下Settings按鈕來接入,允許用戶在較低性能的設備上降低分辨率,以提高內容顯示的速度。
由于應用程序依賴攝像頭提供的圖像,所以無法在沒有攝像頭的設備上運行。應用程序最重要的一個方面是操作系統(tǒng)執(zhí)行的方式,來確保攝像頭提供的預覽不受影響或延誤,在Android 操作系統(tǒng)中使用線程要遵循兩個重要的規(guī)則:
(1)管理用戶界面的主線程不允許因為長操作(long operations)而停滯。如果發(fā)生這樣的事情,用戶將被告知應用程序需要一段很長時間來執(zhí)行,它可以決定它是否被停止或等待它恢復正常操作;
(2)任何屬于用戶界面的圖像元素只可以通過主線程獲取。
圖5 應用程序截屏
基于QR 碼的增強現(xiàn)實系統(tǒng)旨在成為一個通用的增強現(xiàn)實應用程序,可以用在任何場景,將豐富和動態(tài)的內容覆蓋到場景中的QR 碼。系統(tǒng)通過平面檢測,得到透視變換矩陣,來計算并呈現(xiàn)最終的圖像,讓它們看起來像是周圍環(huán)境的一部分??蛻舳说募軜嫽诠艿澜Y構,目的是最小化負責在設備屏幕上顯示圖像的模塊的延遲。每個模塊在自己的線程中運行,從上一級緩存獲取輸入數(shù)據(jù),然后將輸出數(shù)據(jù)寫入下一級緩存。這很好地匹配了Android 應用設計模式,負責顯示攝像頭預覽的主UI線程不會被延遲。另外,系統(tǒng)提供了一個內容高速緩存的機制,來提高屏幕顯示增強現(xiàn)實內容的速度。本系統(tǒng)達到了虛擬與現(xiàn)實相結合的目的,增強了用戶體驗,具有一定的研究和實用價值。
[1]Hirokazu Kato,Mark Billinghurst.Marker tracking and hmd calibration for a video-based augmented reality conferencing system[C].San Francisco,Proceedings of the 2nd IEEE and ACM International Workshop on Augmented Reality,1999:85-94.
[2]史曉琳,邊耐政. 手機增強現(xiàn)實室內向導的研究與實現(xiàn)[J]. 計算機應用與軟件,2013,30(2):320-323.
[3]陳燦鑫. 移動增強現(xiàn)實中跟蹤注冊的關鍵技術研究[D]. 華南理工大學,2013:1-4.
[4]幸國王. 基于Android 平臺的移動增強現(xiàn)實技術綜述[J]. 電子科學技術,2014,01(02):206-211.
[5] MacRae,Duncan A.Introducing QR codes:linking print and digital content via smartphone[J].Neurosurgery,2011,68(4):854-855.