1
雷鋒網(wǎng)按:作者王銳,VR行業(yè)資深從業(yè)者,寫過(guò)不少?gòu)V受歡迎的VR好文,有興趣可移步其專欄。本文是《如何用極客范兒打造一個(gè)HTC Vive虛擬演播室?(上)》的下篇,文章將繼續(xù)講述,如何動(dòng)手打造HTC Vive虛擬演播?
購(gòu)買和搭建摳像拍攝的環(huán)境并不是多么復(fù)雜的事情,選擇質(zhì)量較好,不易起皺的綠色(藍(lán)色)背景布,用背景架支起后應(yīng)當(dāng)有良好的下垂感。而延伸到地面的部分要處理起來(lái)可能更為麻煩一些,因?yàn)檠輪T的運(yùn)動(dòng)很難保證不會(huì)把地上的幕布弄皺,尤其是美麗的女主角可能穿了高跟鞋,或者需要在場(chǎng)景里來(lái)一段即興街舞的時(shí)候。這種時(shí)候也可以考慮使用摳像地膠,它更適用于直接在平整地面上進(jìn)行鋪設(shè),并且可以穩(wěn)定放置一些摳像網(wǎng)格定位用的標(biāo)記點(diǎn)。
更為專業(yè)的布置就需要摳像攝影棚,用柔光箱來(lái)做整體的立體布光,并且盡可能避免演員身上出現(xiàn)明顯的投影,以及因?yàn)榉椇偷谰叩母吡敛馁|(zhì)而產(chǎn)生反射光點(diǎn)。這些都可能對(duì)未來(lái)的實(shí)際拍攝和疊加工作產(chǎn)生影響。
當(dāng)然筆者的工作環(huán)境并不會(huì)那么理想,或者說(shuō)因?yàn)槭艿綀?chǎng)地條件,資金,非專業(yè)性,以及自己屌絲的背影等因素所限,最后能夠?yàn)檫@個(gè)標(biāo)題搭建出的拍攝場(chǎng)景只是區(qū)區(qū)如下圖而已。沒(méi)錯(cuò),連美麗的女演員都請(qǐng)不起,只好用一只熊貓玩偶來(lái)充數(shù)了……
不過(guò)這并不妨礙我們對(duì)實(shí)時(shí)摳像方法的實(shí)驗(yàn)。也就是說(shuō),我們期望將正在拍攝的視頻內(nèi)容即時(shí)轉(zhuǎn)換為扣去了背景色的畫面(只剩下孤零零的小熊貓自己),然后傳輸?shù)揭粋€(gè)簡(jiǎn)單的類似三維游戲的場(chǎng)景當(dāng)中,進(jìn)行疊加,從而呈現(xiàn)出現(xiàn)實(shí)角色身處虛擬世界的情景——如果把這里的小熊貓?zhí)鎿Q成一位頭戴HTC VIVE頭盔進(jìn)行虛擬游戲的朋友,而這個(gè)游戲場(chǎng)景又恰恰就是他正在體驗(yàn)的場(chǎng)景的話,那么就如本文開(kāi)頭所述的那樣,可以做到一種理想的VR游戲第三人稱視角直播的效果了。
把當(dāng)前拍攝的畫面輸出到用于摳像和疊加的PC電腦也許并不是什么難事,至少我們有多種途徑可以選擇:手機(jī)拍攝可以通過(guò)App轉(zhuǎn)換到Live Stream的視頻流,單反和攝像機(jī)的話可以直接通過(guò)視頻采集卡輸入,更專業(yè)一點(diǎn)還可以用到Decklink的專業(yè)采集和轉(zhuǎn)換設(shè)備。當(dāng)然了,如果手頭有專業(yè)控臺(tái)的話,大可不必考慮筆者后面要描述的復(fù)雜摳像過(guò)程,直接啟用控臺(tái)的Chroma Keying功能即可。不過(guò)這種硬件直接摳像的實(shí)現(xiàn)方案往往可供調(diào)節(jié)的參數(shù)繁多,操作復(fù)雜,并且價(jià)格極為昂貴,并非筆者之流所能及了。
如果拍攝的內(nèi)容并不需要實(shí)時(shí)傳輸?shù)脑?,整套流程也不需要如此?fù)雜。比如我們可以把視頻文件直接導(dǎo)入到After Effects或者NUKE這樣的后期軟件,然后直接做摳像參數(shù)的精細(xì)調(diào)節(jié)和輸出即可。不過(guò)這顯然不適用于直播的場(chǎng)合,因此也不在我們的考慮之列。
實(shí)時(shí)摳像的一個(gè)重要的中間產(chǎn)物,叫做Matte。它通常是一幅黑白圖像,其中黑色區(qū)域表示完全被扣去,而白色區(qū)域表示完全被保留,中間色(灰色)的區(qū)域則會(huì)在疊加之后呈現(xiàn)出半透明的效果。
上圖就是剛才的小熊貓經(jīng)過(guò)處理后得到的Matte圖結(jié)果,雖然因?yàn)榄h(huán)境本身的影響以及算法的不完善性,這張圖看起來(lái)還有明顯的邊緣瑕疵,并不能盡如人意。但是如果我們將它與虛擬場(chǎng)景的畫面疊加的話,應(yīng)當(dāng)已經(jīng)可以得到一個(gè)正確混合的效果了。當(dāng)然了,這是下一步要考慮的問(wèn)題,我們首先要知道的是,如何得到這樣一幅Matte圖。這里業(yè)界通常的做法有兩種,其一名為Luma Keying(亮度摳像)。
Luma Keying的基本原理是通過(guò)圖像的亮度(luminance,明暗)來(lái)區(qū)分和構(gòu)建Matte。而對(duì)于某一個(gè)RGB像素點(diǎn)的亮度,我們可以簡(jiǎn)單地通過(guò)下面的公式來(lái)表達(dá):
Lum = 0.29 * R + 0.59 * G + 0.12 * B
之后我們可以根據(jù)一個(gè)固定的閾值來(lái)劃分黑色和白色,低于這個(gè)閾值的顏色為黑色(扣去顏色),而高于這個(gè)閾值的顏色為白色。這樣的分類方法顯然是粗暴的,一個(gè)更為合理一些的方案是設(shè)定一個(gè)閾值的[min, max]區(qū)間,小于最小值min的亮度值輸出黑色,大于最大值max的亮度值輸出白色,而中間值輸出0-1區(qū)間的灰色值。實(shí)際過(guò)程中這個(gè)閾值范圍是要根據(jù)輸入畫面來(lái)做調(diào)整的,而這種方案本身也并非針對(duì)綠幕或者藍(lán)幕場(chǎng)景,而是更適用于較暗的背景顏色與較亮的前景人物,因此并不在我們計(jì)劃采用之列。
另一種做法名為Chroma Keying(色度摳像)。我們假設(shè)RGB顏色是一個(gè)三維空間的坐標(biāo)系統(tǒng)的話,那么每一個(gè)像素點(diǎn)都可以被認(rèn)為是這個(gè)坐標(biāo)系中的一個(gè)向量。因此,我們可以認(rèn)為兩個(gè)相近的顏色在這個(gè)顏色空間(color space)中距離更近——那么對(duì)于綠幕摳像的需求而言,就可以轉(zhuǎn)化成“計(jì)算RGB像素點(diǎn)與綠色像素的距離,并且扣去更接近綠色的顏色”這樣一個(gè)更有邏輯性的要求了。至于如何判斷這個(gè)摳像的閾值,我們也完全可以借鑒之前的做法,采用一個(gè)手動(dòng)調(diào)節(jié)的[min, max]區(qū)間來(lái)完成Matte(黑色,白色和中間色)的輸出。
(Via wikipedia.org)
這種方法理論上適合任何色鍵(也就是綠色或者藍(lán)色,當(dāng)然也可以是其它顏色)的摳像處理,是否一定是基于RGB顏色空間,則要多少商榷一番。有些算法會(huì)選擇HSV顏色空間(即Hue-Saturation-Value,色調(diào)-飽和度-明度)來(lái)進(jìn)行當(dāng)前像素向量與目標(biāo)向量之間距離的計(jì)算,這種方式對(duì)于顏色的直觀特性也許會(huì)有更為清晰的表達(dá)。
筆者通過(guò)GPU編程的方法實(shí)現(xiàn)了上述的Chroma Keying方案,并且使用簡(jiǎn)單的UI界面來(lái)做快速的參數(shù)調(diào)節(jié)。當(dāng)然了,為了確保更好的輸出效果和穩(wěn)定性,我們多少還要在摳像算法的基礎(chǔ)上做一些功能的增補(bǔ),比如輸出圖像的飽和度和對(duì)比度調(diào)節(jié),以及Matte邊緣的模糊處理等等?;镜膶?shí)現(xiàn)效果如下:
實(shí)際上現(xiàn)在的Matte圖已經(jīng)可以和任何一個(gè)背景視頻直接進(jìn)行疊加了,即使它們的內(nèi)容之間并沒(méi)有什么直接的聯(lián)系;而如果這個(gè)背景視頻恰恰就是我們需要的虛擬場(chǎng)景畫面,并且虛擬攝像機(jī)的姿態(tài)設(shè)置已經(jīng)與真實(shí)相機(jī)做到了一致,那么我們幾乎就可以認(rèn)為這一艱巨的任務(wù)已經(jīng)接近完成了!在此之前,一個(gè)簡(jiǎn)單疊加輸出的效果如下:
現(xiàn)在,我們下一步的目標(biāo)就是星辰大海,哦不,應(yīng)該說(shuō)是混合現(xiàn)實(shí)(Mixed Reality)輸出方法的實(shí)現(xiàn)。
顯然,因?yàn)橛辛薓atte作為遮罩圖存在,我們已經(jīng)可以將外部輸入的實(shí)際攝像機(jī)畫面與虛擬場(chǎng)景進(jìn)行疊加,扣去綠色背景并保留前景的角色。而因?yàn)樘摂M攝像機(jī)與實(shí)際的VIVE手柄之間實(shí)現(xiàn)了姿態(tài)的聯(lián)動(dòng),我們也可以保證攝像機(jī)視場(chǎng)角和姿態(tài)的一致性??雌饋?lái)萬(wàn)事俱備,但是有一個(gè)問(wèn)題卻依然值得我們考慮,那就是景物之間的互相遮擋。
一個(gè)最簡(jiǎn)單的應(yīng)用如下圖所示,我們的角色要放置到這個(gè)小街道的中心位置,當(dāng)虛擬攝像機(jī)與角色之間不存在任何遮擋的時(shí)候,這看起來(lái)毫無(wú)問(wèn)題。但是一旦有虛擬的房屋出現(xiàn)在視野中,擋在了角色的前面,事情恐怕就會(huì)變得棘手起來(lái)。
沒(méi)錯(cuò),因?yàn)槲覀冎皇怯肕atte遮罩圖將實(shí)際畫面與虛擬場(chǎng)景的輸出結(jié)果做了2D的疊加,并不會(huì)考慮到虛擬場(chǎng)景本身的深度遮擋問(wèn)題,因此小熊貓會(huì)永遠(yuǎn)處于畫面的最上層,就仿佛它是粘在觀看者的眼鏡片上,而非真的和街道房屋處于同一個(gè)場(chǎng)景當(dāng)中。
這當(dāng)然不是我們想要的結(jié)果,不過(guò)想針對(duì)這個(gè)問(wèn)題實(shí)現(xiàn)一個(gè)通用的解決方案也不是一件容易的事情。因?yàn)槲覀?strong>并不能獲得實(shí)際相機(jī)拍攝畫面的深度信息,也就無(wú)法預(yù)知它與虛擬場(chǎng)景之間的深度關(guān)系。如果使用帶有深度信息的攝像設(shè)備,例如雙目立體攝像機(jī),或者Kinect之類的RGBD相機(jī),那么前者的問(wèn)題是價(jià)格昂貴;后者的問(wèn)題是分辨率粗糙,深度信息在物體邊緣的可信度很低,因而造成圖像疊加的結(jié)果產(chǎn)生很不穩(wěn)定的毛邊。如果是制作一般的體感游戲,那么這無(wú)傷大雅;如果是要輸出虛擬演播室的視頻圖像的話,那么這樣的畫質(zhì)顯然是無(wú)法接受的。
(Via codeproject.com)
聽(tīng)起來(lái)讓人沮喪,不過(guò)在實(shí)際工程中,我們總有更為簡(jiǎn)單的方法來(lái)解決問(wèn)題。
最直接有效的做法莫過(guò)于:對(duì)真人角色在直播時(shí)的走位做出提示,比如放一臺(tái)小型的輸出畫面監(jiān)視器在他能夠看到的地方,讓他盡可能避開(kāi)所有影響到遮擋關(guān)系的虛擬物體。
當(dāng)然有的時(shí)候我們就是希望虛擬場(chǎng)景的某些物體遮擋住真人主角們,比如虛擬世界的花瓶,石柱,虛構(gòu)生物,或者一些特效效果。這個(gè)時(shí)候我們就需要手動(dòng)設(shè)置這些虛擬物體為“前景”物體,也就是說(shuō),它們的渲染總是會(huì)在真實(shí)角色之前。而其它的虛擬場(chǎng)景,例如地面和遠(yuǎn)處的建筑,則總是處于“背景”上。這樣就構(gòu)成了一個(gè)前景-中景-背景組成的畫面層次,如圖所示:
當(dāng)然了,隨著真實(shí)攝像機(jī)和虛擬攝像機(jī)的運(yùn)動(dòng),原本處于前景的虛擬物體可能會(huì)變化到主角身后,變成了背景;原本是背景的物體也可能轉(zhuǎn)到主角身前,將他遮擋在后面。如果有這種復(fù)雜的需求,那么就需要在直播進(jìn)行過(guò)程中手動(dòng)切換每個(gè)虛擬物體的“前景/背景”標(biāo)簽,并且切換動(dòng)作一定要及時(shí)和準(zhǔn)確,以免發(fā)生穿幫。當(dāng)然了,所謂的“前景-中景-背景”這三個(gè)深度層次還可以進(jìn)一步擴(kuò)展,衍生出更多層次和更為復(fù)雜的遮擋關(guān)系。不過(guò)那樣負(fù)責(zé)切換的工作人員估計(jì)也是要罵娘的節(jié)奏就是了。
那么是否存在某種自動(dòng)切換虛擬物體遮擋層次的方法呢?
回答是肯定的。如果我們能夠知道真實(shí)角色在虛擬場(chǎng)景中的詳細(xì)XYZ位置的話,也就可以知道他在虛擬場(chǎng)景中對(duì)應(yīng)的位置,進(jìn)而知道渲染輸出的結(jié)果中,我們的角色應(yīng)當(dāng)處于什么樣的深度層次上,從而自動(dòng)計(jì)算虛擬物體與角色之間的遮擋關(guān)系。對(duì)于傳統(tǒng)的虛擬演播室應(yīng)用來(lái)說(shuō),可能的方法包括:在頭頂陣列布置紅外攝像機(jī)矩陣,識(shí)別主角身上的紅外放射源并進(jìn)而判斷他在空間的位置;或者在綠幕環(huán)境中使用同樣色鍵,但是明暗不同的膠帶粘貼出大小不一的網(wǎng)格,然后判斷角色與網(wǎng)格之間的位置關(guān)系來(lái)完成跟蹤和深度的識(shí)別。
不過(guò)對(duì)于HTC VIVE的使用者來(lái)說(shuō),這卻成了一個(gè)天然的福音。因?yàn)閂IVE頭盔本來(lái)就可以記錄自身在空間的位置和姿態(tài),這樣玩家和場(chǎng)景之間的遮擋關(guān)系問(wèn)題,也就迎刃而解了。
不過(guò),對(duì)于更為復(fù)雜的畫面疊加要求,目前的技術(shù)手段往往還是無(wú)能為力的——比如多個(gè)角色在虛擬場(chǎng)景里進(jìn)行復(fù)雜的互動(dòng),或者讓真實(shí)角色準(zhǔn)確地陷入到虛擬的席夢(mèng)思床里,或者環(huán)抱一個(gè)虛擬布娃娃——這種時(shí)候再?gòu)?fù)雜的層次關(guān)系,或者再準(zhǔn)確的獨(dú)立深度信息跟蹤,都無(wú)法妥善解決這類問(wèn)題。如果這是一部制作精良的大商業(yè)電影,那么后期制作的工作人員只好熬夜加班逐幀修圖,哭著把任務(wù)完成;如果這是實(shí)時(shí)直播中的需求,那么還是保持清醒,實(shí)事求是吧……
幸好,無(wú)論是基于HTC VIVE的真正演播室搭建,還是在本文的簡(jiǎn)陋示例中,我們都不需要考慮上述的復(fù)雜情況。既然已經(jīng)解決了如此多的問(wèn)題,那就讓我們炫耀一下,然后休息,休息就好。
雷鋒網(wǎng)注:作者王銳,雷鋒網(wǎng)獨(dú)家約稿文章,轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán),不得刪減內(nèi)容。
相關(guān)VR課程力薦:
1、如何用極客范兒打造一個(gè)HTC Vive虛擬演播室?(上)
2、如何用極客范兒做一款VR頭盔?不是插個(gè)手機(jī)的那種
3、開(kāi)發(fā)一款像Hololens這樣的產(chǎn)品需要學(xué)習(xí)哪些技術(shù)?
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。