劉偉民
(四川大學(xué)計算機(jī)學(xué)院,成都610065)
近年來,隨著人們生活水平的不斷提高,對視頻播放系統(tǒng)的需求也在不斷增加。傳統(tǒng)的視頻播放系統(tǒng)僅能夠播放固定視點下單一視線方向捕獲的畫面,導(dǎo)致用戶觀看場景的自由度不高,體驗感下降。為了提升用戶的體驗,許多學(xué)者對此進(jìn)行了大量研究。在虛擬現(xiàn)實領(lǐng)域,可以通過VR 眼鏡實現(xiàn)360°的場景觀看,并支持用戶移動等交互。但是由于硬件計算性能的限制,目前無法實時渲染高質(zhì)量的畫面。NVDIA 推出了VR 視頻解碼框架,通過實時解碼全景高清視頻,能夠支持用戶360°的自由觀看場景。然而,該方案限制了用戶的移動,僅能夠在固定視點觀看周圍場景。為了允許用戶自由觀看場景并且達(dá)到實時渲染的目的,F(xiàn)ujii T 等人[1]提出了自由視點電視系統(tǒng)(Free Viewpoint Television,F(xiàn)TV)概念,使得這一需求成為可能。
FTV 系統(tǒng)主要采用基于深度圖像的渲染技術(shù)(Depth Image Based Render,DIBR)[2],將周圍已經(jīng)捕獲的圖像信息映射到虛擬視點處,得到虛擬視點的圖像信息。DIBR 技術(shù)無需進(jìn)行場景的幾何建模,也無需計算復(fù)雜的光照信息,能夠滿足實時渲染的需求[3]。
然而,基于深度的圖像渲染技術(shù)中存在很多問題,例如空洞、偽影、重疊等[4],影響合成圖像的質(zhì)量??斩磫栴}主要分為兩類:采樣不足造成的細(xì)小空洞以及信息缺失導(dǎo)致的空洞。細(xì)小空洞又稱為裂紋,如圖1(a)所示。造成該現(xiàn)象的主要原因是映射過程中,像素映射到非整數(shù)像素上,需要進(jìn)行取整操作,從而造成舍入誤差,采樣率不足[5]。較大的空洞如圖1(b)所示,主要由于虛擬視點視角發(fā)生變化,導(dǎo)致參考圖像中前景物體后的背景物體重新暴露在虛擬視點下,而參考圖像無法提供對應(yīng)的背景信息。偽影現(xiàn)象如圖1(c)所示,背景物體上出現(xiàn)前景物體的部分信息,造成圖像失真。造成偽影的主要原因是物體輪廓處的深度值與顏色值不匹配造成的,通常采用深度圖邊緣預(yù)處理解決[6]。在進(jìn)行視圖合成時,參考圖像的多個像素可能映射到虛擬視點的同一像素位置上,造成如圖1(d)所示的前景顏色被背景顏色覆蓋的情況,這種現(xiàn)象稱為重疊現(xiàn)象[7]。Fehn 等人[8]利用控制繪制順序的方式解決重疊問題,但是該方案不適用于GPU 并行框架,Greene 等人[9]提出Z-buffer 策略,利用深度過濾掉背景物體,可以很好地支持并行計算結(jié)構(gòu)。
為了解決空洞問題,本文提出一種基于GPU 加速的逆向映射算法。該算法基于不動點迭代的思想,利用移動向量構(gòu)建不動點迭代關(guān)系式,能夠很好地避免細(xì)小空洞的產(chǎn)生。同時利用兩幅參考圖像合成虛擬視圖,能夠有效地減少空洞的產(chǎn)生。最后針對存在的空洞,采用基于深度引導(dǎo)的空洞修復(fù)方式進(jìn)行填充。本文使用OpenGL 的計算著色器實現(xiàn)并行計算,并驗證了算法的有效性。
圖1 DIBR技術(shù)中存在的問題
在視圖合成算法中,根據(jù)像素映射方式不同,可以將DIBR 技術(shù)分為前向映射方式與逆向映射方式。前向映射方式如圖2(a)所示,使用3D-Warping 方程將參考圖像的每一個像素映射到虛擬視圖上。其中(x',y')可能存在浮點數(shù)情況,需要進(jìn)行像素取整或者采用Splatting 算法[10]進(jìn)行處理。像素取整會造成虛擬視圖中出現(xiàn)大量“裂紋”,而Splatting 算法需要對映射的點做加權(quán)計算,不利于并行計算。逆向映射方式如圖2(b)所示,利用逆向映射函數(shù)T-1( )x,y將虛擬視圖上的每一個像素映射到參考圖像上,通過雙線性插值或者三線性插值等方式采樣圖像,可以得到虛擬視點的圖像信息。相較于前向映射方式,逆向映射方式能夠更好地支持GPU 并行計算,而且可以避免“裂紋”現(xiàn)象的出現(xiàn),但是需要找到對應(yīng)的逆向映射關(guān)系。
當(dāng)多個參考圖像上的像素點同時投影到虛擬視圖的同一位置上時,會出現(xiàn)寫入數(shù)據(jù)競爭的問題,為了解決這個問題,可以采用原子寫入的思想?;谠拥哪嫦駾IBR 算法首先通過前向映射方式將像素點投影到虛擬視圖上,通過舍入取整得到要寫入的像素位置,然后利用深度信息進(jìn)行原子最小寫入,即將深度最小的點寫入到GPU 內(nèi)存中。此時會得到帶有裂紋的深度圖,對深度圖進(jìn)行濾波處理能夠得到虛擬相機(jī)的粗略深度圖。之后根據(jù)虛擬相機(jī)的深度圖進(jìn)行重投影,利用投影到參考相機(jī)的點進(jìn)行采樣,最終能夠得到虛擬視圖的信息。
基于原子的DIBR 算法能夠適用并行計算框架,可以快速得到虛擬視點的圖像信息。但是,對帶有裂紋的深度圖進(jìn)行濾波可能會造成圖像失真現(xiàn)象,影響合成的圖像質(zhì)量。本文提出一種基于迭代的DIBR 算法,無需對深度圖進(jìn)行濾波,可以得到高質(zhì)量的虛擬視圖,接下來對基于迭代的DIBR 算法進(jìn)行詳細(xì)的闡述。
圖2 前向映射與逆向映射示意圖
本文采用的基本思想是不動點迭代思想。不動點迭代是求解復(fù)雜方程f(x)=0 的重要方法。如圖3 所示,假設(shè)要求解方程f(x)=x-g(x),不動點迭代思想會將函數(shù)f(x)分解成兩個函數(shù)y=x與y=g(x)。其中兩個函數(shù)的交點x*就稱作不動點,也是函數(shù)f(x)的零點。任取一點x0,根據(jù)公式(1)進(jìn)行迭代計算,若迭代序列收斂到g(x)的不動點,即,則不動點迭代收斂,否則不動點迭代發(fā)散。
對于二維圖像而言,虛擬視圖上的點p與參考圖像上的點q存在如公式(2)所示的對應(yīng)關(guān)系:
其中,V(q)表示q點移動到p點的移動向量。
在基于DIBR 的視圖合成算法中,移動向量可以根據(jù)深度快速計算得到。已知參考相機(jī)的內(nèi)外參矩陣Mr以及虛擬相機(jī)的內(nèi)外參矩陣Mv,可通過公式(3)計算得到參考圖像的點q投影到虛擬圖像上點p' 的對應(yīng)位置:
然后利用公式(4)得到每個像素映射的移動向量,得到一張移動向量圖。
根據(jù)公式(2)的對應(yīng)關(guān)系,我們可以構(gòu)建不動點迭代關(guān)系式:
其中,在逆向映射過程中,p為已知信息,表示虛擬視圖的每個像素位置。V(qi)為qi位置處對應(yīng)的移動向量。w(qi)表示一次迭代后的結(jié)果,將該結(jié)果賦值給qi+1進(jìn)行進(jìn)一步的迭代。
圖像迭代過程中,前一次迭代結(jié)果qi-1與當(dāng)前迭代結(jié)果qi之間的距離小于一個像素大小時,迭代可看作收斂。當(dāng)?shù)諗繒r,可通過得到的迭代結(jié)果采樣得到對應(yīng)的顏色值。
圖3 不動點迭代示意圖
在進(jìn)行虛擬視圖合成時,會出現(xiàn)重疊現(xiàn)象,即在本文算法中,公式(5)可能存在多個迭代收斂的結(jié)果。引起該問題的主要因素是初始點的選擇。針對此問題,本文采取選擇多個初始點進(jìn)行迭代的策略:當(dāng)多個初始點進(jìn)行迭代時,若存在多個收斂結(jié)果,則對比每個迭代收斂結(jié)果的深度,選擇深度最小的點作為最終的采樣結(jié)果,從而避免重疊現(xiàn)象。
當(dāng)增加選擇的初始點數(shù)目時,圖像質(zhì)量提升,但是同時增加了計算開銷,導(dǎo)致性能降低。為了降低開銷,增加系統(tǒng)的運(yùn)行效率,本文采用局部包圍盒策略對初始點的選擇范圍做了進(jìn)一步縮小,能夠在保證收斂的情況下,減少初始點的選擇數(shù)目。
局部包圍盒策略采用的主要思想是利用移動向量在局部的最大值,構(gòu)成矩形包圍盒,由于采用的是最大值,所以在該包圍盒中一定存在收斂的點,從而保證了迭代收斂。如圖4 所示,具體步驟如下:當(dāng)計算移動向量時,同時計算該移動向量沿著圖像坐標(biāo)系X-Y 的分量。若當(dāng)前分量大于局部區(qū)域存儲的最大分量,則將其進(jìn)行替換。最終劃分的每個區(qū)域都會存儲最大的局部包圍盒,在該包圍盒下進(jìn)行初始點的選擇,能夠減少計算開銷。
圖4 局部包圍盒示意圖
本文算法通過C++與OpenGL 進(jìn)行計算與繪制。算法流程如圖5 所示,首先通過計算著色器將參考圖像的每個像素根據(jù)深度重投影到虛擬視圖上,計算像素的移動向量以及對應(yīng)的局部包圍盒,并通過可寫入的Image2D 圖像紋理進(jìn)行存儲。之后再利用計算著色器進(jìn)行第二遍并行計算,讀取局部包圍盒的數(shù)據(jù),隨機(jī)初始化N個點,進(jìn)行迭代計算,當(dāng)?shù)螖?shù)大于規(guī)定次數(shù)時,迭代不收斂,舍棄結(jié)果。當(dāng)?shù)諗繒r,將其存入到候選點集中,最后通過對投影的深度進(jìn)行排序,選擇最小的深度作為最終的采樣坐標(biāo)進(jìn)行采樣。通過前兩遍的計算著色器已經(jīng)能夠得到最終合成的圖像了,第三遍為繪制渲染,通過渲染屏幕大小的一張二維網(wǎng)格并對其著色,最終呈現(xiàn)出合成的圖像。由于本文采用的是兩個參考視點進(jìn)行虛擬視點的合成,最終合成的圖像空洞信息較少,但是依然不能避免空洞的出現(xiàn)。本文在渲染繪制遍時對這些較少的空洞進(jìn)行修復(fù),主要利用已知的深度信息進(jìn)行前景與背景物體的識別,利用背景物體的顏色進(jìn)行填充能夠得到較好的結(jié)果。
圖5 算法流程圖
本節(jié)的實驗設(shè)備信息如表1 所示。
表1 實驗設(shè)備信息表
圖6 展示了本次算法輸入的兩張參考圖像以及對應(yīng)的深度圖像。
圖6 輸入的左右參考圖像與深度圖像
圖7展示了基于原子的DIBR 算法、本文基于迭代的DIBR 算法以及Ground Truth 參照圖,其中基于原子的DIBR 算法出現(xiàn)了明顯的失真情況,造成該失真情況的主要原因是投影時取整造成的裂紋被背景物體填充。本文利用峰值信噪比PSNR 以及結(jié)構(gòu)相似性SSIM進(jìn)行測試,結(jié)果如表2 所示。
圖7 實驗結(jié)果對比
表2 實驗設(shè)備信息表
本文給出了基于迭代的DIBR 算法的基本思想,并利用C++與OpenGL 實現(xiàn)并行計算架構(gòu)。該算法比基于原子的DIBR 算法在PSNR 和SSIM 上有一定提升。但是本文算法需要進(jìn)行額外的移動向量計算以及多個初始化迭代點的選擇,當(dāng)?shù)c數(shù)目增多時需要的時間代價十分昂貴。在后續(xù)的研究中,會針對初始點的選擇進(jìn)行進(jìn)一步優(yōu)化,減少初始點的選擇數(shù)目以提升算法的運(yùn)行效率。