2
本文作者: Nada | 2015-06-11 11:55 |
文/Nada
先看這個視頻,了解下 I/O 大會 VR 部分總覽:
讓我們仔細分析下其中最有趣的東西(至少我認為!):Jump 虛擬現(xiàn)實拍攝裝置。我們來解析下這個玩意兒,看和之前各種拼接的什么環(huán)視啊什么360°啊到底有什么不同。
首先,Jump 是一個 GoPro 陣列,外形上看和各種 VR 影像公司提供的東西沒什么不同,不過是攝像頭數(shù)量的多寡而已。Google 的產品副總監(jiān),VR/AR 部負責人 Clay Bavor 稱這個東西通過自己去買到的些部件就能拼起來。Google 自己不賣這玩意兒,但他們會放出 CAD 圖紙讓任何想搞的人去生產售賣。下圖是渲染圖,但他們也有實體照片,因此這并非停留在概念的層面:
而且,他們也依舊拿紙糊了一個(8000美金的攝像頭以及8塊錢的紙板)。但在你雄心勃勃地想要自己去生產這個玩意兒開始創(chuàng)業(yè),上市老總,成為妖股,迎娶白富美,走向人生巔峰之前,你要曉得 GoPro 是要打算從今年開夏賣這個東西的。GoPro 賣這個了粗糧豈能坐視不管?不過總之吧,如果你想要個性化顏色什么的還是可以自己去做吧,塑料版淘寶上肯定馬上能有的啦。不過要注意的就是這個結構的松緊,因為攝像頭的位置是非常重要的。
一眼瞄過來,這個圓形陣列并沒有朝上或朝下的攝像頭,如果按照 GoPro 4 Black 的規(guī)格,這個陣列能捕捉水平360°的畫面,但垂直只有120°。因此,頂上腳下都會丟失60°的可視角度。此外,Jump 乍一看像非立體的單眼攝像機,每個相機都對著不同方向。多數(shù) 3D GoPro 相機有兩個攝像頭對準某個方向,類似這樣:
當有兩個攝像頭對準某個方向后,你在這個方向上就能給每只眼以不同的畫面,這樣就有了視角差和立體效果。畫面也會有拼接痕跡,因為某個方向的“左”攝像頭離另一個方向的“左”攝像頭有點遠(顯然,如果不管立體效果,平面相機的)。圍繞著對于降低拼接痕跡的各種方式,誕生了一個小微行業(yè)。
而這一點就是 Google 這個解決方案的大牛之處:這個看起來像平面相機組的攝影陣列實際上是立體的。每個攝像頭拍攝的畫面并不是給左眼或者右眼的,這些數(shù)據(jù)可以給兩眼都使用。3D 效果是通過計算機圖形學來得到相對的立體位置,再重新映射到你的眼中,因此根本沒有拼接痕跡(理論上)。非常屌,因為這種不到1W美金的半專業(yè)設備能捕捉流暢的360°3D VR 影片的話,是一個非常大的突破。
工作原理是這樣的:因為軟件知道每兩個攝像頭之間的相對距離、位置,因此只要它能計算出兩個攝像頭之間的場景像素,就能得到場景中某個點的深度。使用這些立體數(shù)據(jù),你可以通過扭曲某個畫面來得到所謂的“立體垂直”視野:基本上,每個攝像頭拍到的畫面都是正確的視差點(對于以前的那些針對雙目的立體拍攝設備,只有在雙眼的攝像頭之間的拍攝畫面才有正確的視角差,也就是說越往邊上去,立體感越差)。當然,這需要大量的計算,不過誰讓 Google 自己電腦多呢。
當你從某個攝像頭的畫面過度到另一個攝像頭的捕捉畫面時,視角會稍微偏一點點。為了連接畫面(或建立3D模型),你從鄰近的攝像頭離找到相匹配的區(qū)域,比如你從 A 攝像頭找到一組像素,然后在 B 攝像頭也去找同樣的一組(這個一組指的是同一個相關部位,比如同一片樹葉,不同位置攝像頭拍出來的畫面會稍有不同),實際上你是能知道往哪找的(相鄰攝像機拍出來的圖像差別不會太大),比起那些未校準的相機也會極大提升處理速度。目前已存在的拼接軟件比如 Videostitch 或者 Kolor (早前被 GoPro 收購了)由于是通用軟件,會對你的拍攝設備結構做一些猜測,但如果是類似 Google 這種校準過的攝像頭,就只需要通過嚴密的數(shù)學算法解決。
當你找到匹配的區(qū)域,同時也知道在圖片上這些區(qū)域的距離差,你就能計算出相機陣列和這個區(qū)域實物之間的距離。如果物體,比如說天空是在無限遠,那么兩個相鄰相機照出來的圖片天空部位會非常接近。當物體離相機很近時,物體在畫面上會變大,同時兩個相鄰相機拍出來的圖像也會有較大距離偏差。具體的偏差完全由物體離攝像陣列的距離決定,因此你可以得到非常精確的物體位置。
更準確一點,你是在右邊尋找這條對極幾何線。由于 GoPro 鏡頭扭曲得很厲害,這條線實際上是彎的。不過基于這種方式的高效算法也僅只有幾年時間而已,如果想閱讀相關文獻,可以到這里(閱讀原文)買。
當有了 3D 模型后,你甚至能得到一定的四處看、頭部跟蹤的范圍。不過只有一小部分,而且你沒有任何的垂直視角差。圖像的點理論上都有正確的深度信息,但后面的背景信息你是沒有的,在你垂直移動時會出現(xiàn)問題。(通過差值來填補像素并非完全不可能,但復雜度也會大很多,而且目前來看也沒這個必要)
這么說起來,好像前景分外光明一片大好啊,但現(xiàn)在問題來了,計算機圖形并不是靈丹妙藥。當通過以上算法來計算差別時,我們默認相鄰兩幅圖是相似的,像素是能互相對應的。對于沒有鏡面反射的不光滑表面來說,OK沒有問題(技術用語是朗伯表面),但只要有發(fā)光閃爍就會出現(xiàn)問題。Google 視頻中的演示是靜態(tài)的,但對于自然界光線復雜時,對于算法的要求就高了,可能會弄出各種奇怪的或是撕裂或是扭曲變形的圖像狀況。
另外一種明顯的會搞暈你算法的狀況就是重復的圖形,因為算法可能會識別到錯誤的區(qū)域(磚墻啦鎖鏈欄桿啦都是這類技巧的災星,當然也有一些繞過去的技巧)。此外透明的玻璃啦、沒有紋理的白墻之類的東西啦也不好搞。還有無中生有的一些東西,比如電話線中間的空間:電話線繞了一圈,背景是白墻,那么對于算法來說咦這兩組像素好像啊,肯定是一個物體。但其實什么也沒有,只是電話線圈出來的虛空。壓縮也會帶來高頻錯誤:GoPro 是即時把數(shù)據(jù)壓成 H.264 的,而壓縮質量也參差不齊。什么樹葉、鏡頭反射之類的就更別說了。
當然,畢竟 Google 從街景時代就一直在做方面的研究,因此積累也很深了 - 而在演示中他們甚至放出了一些算法方面的解決途徑,Bavor 展示了算法追蹤場景得到的等高線輪廓圖:
Google 有可能是通過這種方式來解決上面提到的一些問題的:當兩個攝像頭拍攝到的圖片某部分不好吻合時,那么就從這部分周邊通過插值來得到深度數(shù)據(jù)。比如你得到一些完全錯誤的數(shù)據(jù),比如鏡頭的反射閃光或者假的匹配,就忽略掉并直接采用插值數(shù)據(jù)。當然這是一種柔化或者低通的處理方式,而且這幅曲線圖看起來也就是 Google 的算法直接生成的,因為如果你仔細看會發(fā)現(xiàn)其結果并不完全匹配真實世界:線條在邊緣處過于光滑(看柱子頂部),而且一直連續(xù),就好像一條被撐開的大橡皮筋套在整個場景里一樣(雖然聽起來離真實世界差距很大,但你要知道我們對于深度的感知并不僅僅靠的是深度本身的精確性,而避免立體錯誤比起讓深度完全正確要必要得多)。如果這的確是 Google 算法算出來的場景部分,其中一部分尤其彰顯了這個橡皮筋效果:
當然無論怎樣都是會有差錯的。而且其實這些場景中都有一些去看就能看到的問題。比如說你去看著右邊中間前景里的一疊木制柱子,當視角橫向來回移動時其反光和形狀都發(fā)生了重影、斷裂。
也許這個例子看起來還不是什么大問題,但目前這個系統(tǒng)我們還不知道那些往常的反射、睡眠、重復圖案、透明等問題如何解決。當然,視頻中的演示確實不錯,至少這個系統(tǒng)也會提高制作 VR 攝像裝備的門檻,大概淘汰掉現(xiàn)在業(yè)界八成左右的人吧(當然國內不一樣,反而會降低門檻,連個 Cardboard 都能拿去上市)。
但使用起來其實也不是那么輕松,畢竟這么大。GoPro 會在夏季發(fā)布官方產品,不過反正 Google 會放出圖紙,希望同時開啟16個攝像頭的方式并不復雜。Bavor 說曝光會搭配得很好,幀同步應該也不是問題。但在幀同步這一方面,我們不確定是意味著半幀時間內的同步,還是類似于專業(yè)3D攝像系統(tǒng)的毫秒乃至微秒級的同步。聽說 GoPro3 和 4 無法被硬同步到毫秒或者微秒級,也不知是真是假(GoPro 有這個 3D 系統(tǒng),但無法選擇 Hero 3 或者 Hero 4)。從內容制作者的角度來看,這可能是個問題;因為在半毫秒級別的誤差下,高速運動的物體或者攝像頭都會導致最終拼接畫面的錯誤,同時攝像頭的時鐘可能是石英晶振器容易有漂移現(xiàn)象(千分之一的漂移意味著60fps下每20秒會丟失一幀)。當然,對精確度的要求取決于你想要拍攝的場景和對象,但諷刺的是有可能 GoPro 將不再適合用來拍攝高速動作片段了。
而一脈相承的,GoPro 也有明顯的果凍效應(Rolling Shutter),GoPro Black 的 4k 影片拍攝幀率為30,那么你會看到30ms左右的果凍延遲。因為拍攝是逐行掃描的,掃描完一個畫面需要33ms的話在這個過程中物體或者攝像頭有移動,就會產生比較明顯的形變。這種形變會如何影響到 Google 的算法?目前不得而知,只有等具體的產品出來了。
當然,提高幀率是能降低一些問題,不過最終的可用性如何呢?粗略計算這個攝像機組每小時的視頻容量將達430GB:在GoPro Black 里,你可以以 60Mbit 錄制 H.264 壓縮的視頻流,也就是每秒每個攝像頭7.5mb。所有16個攝像頭1個小時就是432GB。看樣子你的硬盤、SD卡也得準備一大堆啊,當然有摩爾定律在幾年后可能我們也會跨入PB時代了吧。
Bavor 提到這些攝像頭拍攝出的源文件基本上和“5個4k電視”那么大。掐指一算,大概就是20k,或者20480 x 2160。當然這是源文件,至于處理后的文件呢?我們知道有大量數(shù)據(jù)是為了建模,實際上是不需要的 - 如果我們把這些 GoPro 排成一排拍攝不去管它們的重疊部分,總共達到 1510°(94.4° x 16),而顯然我們只需要其中的360°,大概是1/4的樣子,而剩下的3/4都是給算法用來消除誤差用的。
無論如何,對于 Jump,以及在大會上宣布的拍攝+Google 服務器云計算+Youtube 終端播放(目前已經支持4k,360°和60fps視頻,360°3D將會在今年夏天和 Jump 一起發(fā)布),彰顯了 Google 把自己定位成在 VR 內容領域的一個大玩家。對于普通人來說,VR 視頻是普及 VR 的最關鍵接口,Google 看樣子為自己找了個好位置。
雷峰網特約稿件,未經授權禁止轉載。詳情見轉載須知。