賈亞娟 盧春光
(河南職業(yè)技術(shù)學(xué)院,河南 鄭州 450046)
虛擬現(xiàn)實(shí)技術(shù)是近幾年的熱門研究課題,并且已經(jīng)在電腦游戲、休閑娛樂、軍事訓(xùn)練、遠(yuǎn)程醫(yī)療等多個(gè)領(lǐng)域得到了廣泛應(yīng)用。從現(xiàn)有的技術(shù)來看,基于圖像的虛擬現(xiàn)實(shí)全景漫游技術(shù)具有場(chǎng)景逼真、交互方便、硬件要求低、可擴(kuò)展性強(qiáng)等一系列優(yōu)點(diǎn),較好地滿足了各種應(yīng)用需求。其中,虛擬場(chǎng)景的獲取、全景漫游模型的構(gòu)建,以及圖像處理算法和信息壓縮技術(shù)等,都是影響虛擬現(xiàn)實(shí)全景漫游系統(tǒng)應(yīng)用效果的關(guān)鍵因素,也成為今后虛擬現(xiàn)實(shí)技術(shù)研究發(fā)展的主要方向。
常見的全景圖有3 種類型,即多面體全景圖、球面全景圖、柱面全景圖。其中,柱面全景圖能夠反映空間任意角度的場(chǎng)景,并且圖像細(xì)節(jié)真實(shí)程度更好,本文以柱面全景圖為例,進(jìn)行虛擬現(xiàn)實(shí)場(chǎng)景的制作。由于虛擬現(xiàn)實(shí)場(chǎng)景來自于現(xiàn)實(shí)環(huán)境,因此首要任務(wù)是利用高清相機(jī)拍攝現(xiàn)實(shí)世界中的場(chǎng)景,然后將圖像數(shù)據(jù)導(dǎo)入計(jì)算機(jī)中。在拍攝時(shí),每30°拍攝一張照片,相鄰兩張照片之間有20%-30%的重疊區(qū)域,保證圖片之間能夠做到平滑過渡。注意整個(gè)拍攝期間盡量不改變相機(jī)焦距,對(duì)提升拍攝畫面的清晰度有積極幫助。
完成全景圖的拍攝后,將所得照片進(jìn)行拼接,假設(shè)需要對(duì)P1 和P2 兩張照片進(jìn)行拼接,具體操作方法為:首先進(jìn)行照片投影。將平面上的P1 和P2 分別投影到兩個(gè)圓柱面上,得到Q1 和Q2。在Q1 的左邊和Q2 的右邊經(jīng)過一定的搜索后,找出兩幅圖像的重疊區(qū)域,此過程稱為“圖像配對(duì)”。然后將兩張照片的重疊部分進(jìn)行擬合,即可拼接成為一張照片。最后剪掉多余部分,完成圖像的拼接。重復(fù)上述流程,直到所有拍攝圖像全部完成拼接,即可得到全景圖。
同一個(gè)虛擬場(chǎng)景中包含了大量的全景圖,在生成虛擬場(chǎng)景時(shí)需要將每一張全景圖作為一個(gè)獨(dú)立的節(jié)點(diǎn),然后按照現(xiàn)實(shí)場(chǎng)景中的位置關(guān)系重新排列這些節(jié)點(diǎn)。同時(shí)在節(jié)點(diǎn)與節(jié)點(diǎn)之間添加過渡圖像,最終生成完整的虛擬場(chǎng)景。這樣在虛擬現(xiàn)實(shí)場(chǎng)景漫游時(shí),用戶可以在任意一個(gè)節(jié)點(diǎn)上進(jìn)行360°環(huán)視,并且可以通過改變所在節(jié)點(diǎn)的位置,達(dá)到在虛擬場(chǎng)景中前進(jìn)、后退的效果,如同身處真實(shí)場(chǎng)景一樣。
基于全景圖像的虛擬現(xiàn)實(shí)漫游系統(tǒng)模型主要由3個(gè)模塊組成,各模塊的功能為:
a.StitchTool 模塊,其功能是按照特定的序列對(duì)拍攝所得圖像進(jìn)行組合、拼接,從而得到平滑且連續(xù)的全景圖。
b.VR Editor 模塊,其功能是使用中間過渡圖像,將所有按照順序排列好的全景圖鏈接起來,形成一個(gè)多視點(diǎn)的虛擬場(chǎng)景。
c.VR Viewer 模塊,主要由反投影裝置、調(diào)度器、I/O 口等組成,其功能是通過I/O 口接收來自計(jì)算機(jī)的控制指令,調(diào)度器根據(jù)當(dāng)前指令調(diào)用數(shù)據(jù),在虛擬場(chǎng)景中反投影,為用戶提供對(duì)應(yīng)場(chǎng)景的視圖。系統(tǒng)模型的結(jié)構(gòu)如圖1 所示。
圖1 虛擬現(xiàn)實(shí)全景漫游模型的架構(gòu)圖
系統(tǒng)的各項(xiàng)功能通過指令驅(qū)動(dòng)來實(shí)現(xiàn),用戶利用鍵盤編輯并發(fā)送命令。該命令經(jīng)由命令接口傳遞給調(diào)度器。調(diào)度器則根據(jù)虛擬場(chǎng)景的一系列環(huán)境變量對(duì)用戶命令進(jìn)行處理,如讀取數(shù)據(jù)、進(jìn)行反投影或者輸出畫面到顯示器等。全景漫游系統(tǒng)的結(jié)構(gòu)如圖2 所示。
圖2 基于指令驅(qū)動(dòng)的漫游系統(tǒng)結(jié)構(gòu)
該系統(tǒng)可支持編輯和發(fā)送的指令包括用戶指令和內(nèi)部處理指令2 種類型。用戶指令屬于公開指令,具體類型有左視/右視指令、前進(jìn)/后退指令,以及瀏覽器初始化指令、結(jié)束瀏覽指令、視點(diǎn)跳轉(zhuǎn)指令等。內(nèi)部處理指令的具體類型有視線轉(zhuǎn)移指令、腳步移動(dòng)指令、文件讀取指令以及重新投影指令等。
如果用戶位于某個(gè)全景視點(diǎn)上,調(diào)度器會(huì)自動(dòng)記錄某個(gè)時(shí)刻下用戶視線的方向。如果調(diào)度器重新接收到新的移動(dòng)命令(如左移指令),就會(huì)自動(dòng)調(diào)整視線角度,并同時(shí)從全景圖中截取該角度對(duì)應(yīng)的視圖,利用反投影裝置進(jìn)行處理,將處理完畢的視圖從輸出模塊反饋給用戶,這樣用戶就可以觀察到不同方向上的虛擬景象。在全景視點(diǎn)瀏覽時(shí),提高系統(tǒng)對(duì)用戶指令的響應(yīng)速度是優(yōu)化虛擬現(xiàn)實(shí)全景漫游體驗(yàn)的關(guān)鍵。而提高響應(yīng)速度的關(guān)鍵點(diǎn)主要有兩個(gè),即反投影算法和調(diào)度策略。通常來說,自然狀態(tài)下動(dòng)態(tài)特性要求每秒生成并同步顯示30 幀圖像,可以保證用戶在轉(zhuǎn)換視線時(shí)獲得良好體驗(yàn);最低不得低于10 幀,否則用戶在轉(zhuǎn)換視線時(shí)會(huì)明顯感到圖像的不連續(xù)性。同樣的,交互響應(yīng)時(shí)間應(yīng)控制在0.2s 以內(nèi),最大不得超過0.5s,否則也會(huì)讓用戶在虛擬現(xiàn)實(shí)全景漫游中產(chǎn)生場(chǎng)景不真實(shí)的感覺。
在整個(gè)虛擬現(xiàn)實(shí)場(chǎng)景中包含了多個(gè)全景視點(diǎn),而相鄰兩個(gè)全景視點(diǎn)中用空間鏈進(jìn)行鏈接,此外每個(gè)空間鏈上還添加了中間過渡圖像,以保證全景視點(diǎn)漫游時(shí)不會(huì)產(chǎn)生明顯的跳躍感。假設(shè)相鄰的兩個(gè)全景視點(diǎn)分別為A和B,兩者之間的過渡處理如圖3 所示。
圖3 視點(diǎn)過渡處理示意圖
用戶在全景視點(diǎn)漫游時(shí),調(diào)度器獲取用戶當(dāng)前視線角度,并根據(jù)當(dāng)前視點(diǎn)和角度在空間鏈的列表立面檢索匹配的空間鏈。如匹配成功,則系統(tǒng)提示用戶可以執(zhí)行下一步操作。用戶根據(jù)系統(tǒng)提示和個(gè)人需求,發(fā)出前進(jìn)(UESR_GO_AHEAD)或后退(UESR_GO_BACK)指令。此時(shí)調(diào)度器經(jīng)過I/O 接口收到指令,并檢索出當(dāng)前空間鏈上第一張中間過渡圖像,在顯示器上展示出來,同時(shí)記錄該圖像的編號(hào)。然后等待接收用戶的下一個(gè)指令,顯示第二張中間過渡圖像,以此類推,直到離開當(dāng)前空間鏈,然后繼續(xù)進(jìn)入到下一個(gè)全景視點(diǎn)。通過視點(diǎn)過渡優(yōu)化處理,能夠保證用戶在虛擬現(xiàn)實(shí)全景漫游中,獲得連續(xù)的漫游體驗(yàn),使得漫游時(shí)的“真實(shí)感”更加強(qiáng)烈,優(yōu)化了漫游體驗(yàn)效果。
通過上文分析可知多視點(diǎn)虛擬現(xiàn)實(shí)場(chǎng)景是由大量的全景圖和中間圖像鏈接形成的。在每次系統(tǒng)啟動(dòng)時(shí),都需要花費(fèi)較長(zhǎng)的時(shí)間完成初始化,占用大量的內(nèi)存。如果剩余的內(nèi)存空間不足,將會(huì)導(dǎo)致用戶在環(huán)視時(shí)出現(xiàn)視角不能360°任意旋轉(zhuǎn)的情況。因此,在全景漫游技術(shù)優(yōu)化時(shí)必須要想辦法降低內(nèi)存消耗。一種方法是將全景圖分成360 份,即每轉(zhuǎn)動(dòng)1°實(shí)現(xiàn)一次變換。假設(shè)瀏覽一張200×1000(24Bits)的全景圖,占用內(nèi)存不會(huì)超過50MB。雖然對(duì)內(nèi)存的消耗有一定降低,但是在多視點(diǎn)連續(xù)瀏覽時(shí)仍然無法避免系統(tǒng)內(nèi)存占用問題。反投影模板則是通過取消緩沖區(qū)的方式降低內(nèi)存占用,其原理是在反投影處理環(huán)節(jié),在源節(jié)點(diǎn)和目標(biāo)點(diǎn)之間建立映射關(guān)系,可以利用設(shè)計(jì)好的模板直接將源節(jié)點(diǎn)包含的所有信息直接映射到反投影模板上,快速生成反投影視圖,如圖4 所示。
圖4 反投影模板示意圖
當(dāng)系統(tǒng)完成初始化后,反投影模板也自動(dòng)進(jìn)入待機(jī)狀態(tài)。當(dāng)用戶需要重復(fù)瀏覽某個(gè)視點(diǎn)時(shí),可直接加載反投影模板上的數(shù)據(jù),而不需要再做反投影,因此簡(jiǎn)化了流程,減少了對(duì)內(nèi)存的消耗。
內(nèi)存漏洞除了會(huì)消耗系統(tǒng)內(nèi)存外,還會(huì)導(dǎo)致程序響應(yīng)速度變慢,瀏覽速度降低,系統(tǒng)運(yùn)行的穩(wěn)定性也會(huì)受到影響。從用戶全景漫游角度來看,在轉(zhuǎn)移視線或轉(zhuǎn)換場(chǎng)景時(shí),則容易出現(xiàn)卡頓現(xiàn)象,嚴(yán)重破壞用戶在虛擬現(xiàn)實(shí)場(chǎng)景中的漫游體驗(yàn)。對(duì)于內(nèi)存漏洞的檢測(cè)方法比較簡(jiǎn)單,對(duì)于系統(tǒng)運(yùn)行前后可用內(nèi)存容量,如果運(yùn)行以后內(nèi)存明顯減少,即說明一部分內(nèi)存未被完全釋放,有較大概率是存在內(nèi)存漏洞。在判斷有內(nèi)存漏洞后,一般會(huì)采取重新定義malloc 和free 函數(shù)的方式,對(duì)內(nèi)存漏洞進(jìn)行監(jiān)測(cè)、定位。在找到內(nèi)存漏洞后,通過釋放內(nèi)存的方式解決這一問題。處理方法也比較簡(jiǎn)單,在內(nèi)存塊已經(jīng)被占用的地方,加上delete 語(yǔ)句即可重新釋放內(nèi)存,消除漏洞。
由于調(diào)度器發(fā)送的環(huán)視移動(dòng)指令,只能以固定的速度進(jìn)行環(huán)視,因此用戶在轉(zhuǎn)換視線時(shí),也只能按照固定的速度,無法快速轉(zhuǎn)換到另一個(gè)角度。為了解決這一問題,讓用戶能夠?qū)崿F(xiàn)可變速的環(huán)視移動(dòng),可采取按固定角度進(jìn)行環(huán)視偏移、按像素進(jìn)行環(huán)視偏移兩種方式加以解決。但是在實(shí)際操作中,根據(jù)固定角度進(jìn)行環(huán)視偏移很難達(dá)到較高的命中率,這是因?yàn)槠平嵌群途彌_速度無法得到兼顧。如果短時(shí)間內(nèi)偏移角度過大,那么新的視圖會(huì)因?yàn)榫彌_速度不夠?qū)е乱晥D無法快速加載完成,從而出現(xiàn)視線轉(zhuǎn)移之后虛擬場(chǎng)景尚未加載出來的問題。對(duì)比之下,按照像素進(jìn)行環(huán)視偏移則是基于像素個(gè)數(shù)來確定偏移量,由于像素單元小,因此場(chǎng)景加載速度快;同時(shí)以像素級(jí)的精度進(jìn)行環(huán)視,也能保證漫游場(chǎng)景更加真實(shí)。
基于圖像的虛擬現(xiàn)實(shí)全景漫游,將高清相機(jī)拍攝到的圖像進(jìn)行拼接得到全景圖,再利用中間過渡圖像鏈接得到虛擬現(xiàn)實(shí)場(chǎng)景。在調(diào)度器的輔助下,可根據(jù)用戶指令和用戶視線變化,靈活加載、呈現(xiàn)不同視角的虛擬圖像,優(yōu)化了全景漫游體驗(yàn)。隨著VR 技術(shù)的成熟發(fā)展,今后要重點(diǎn)從降低內(nèi)存消耗、支持可變速環(huán)視移動(dòng)方面進(jìn)行優(yōu)化改進(jìn),從而進(jìn)一步提升虛擬現(xiàn)實(shí)全景漫游技術(shù)的使用效果。
科學(xué)技術(shù)創(chuàng)新2022年10期