微軟 HoloLens 技術解謎(上):如何還原三維場景

作者 | 發布日期 2015 年 01 月 31 日 12:00 | 分類 Microsoft , 穿戴式裝置
Microsoft HoloLens

HoloLens 是什麼?

HoloLens 是微軟發布的可穿戴式擴增實境計算設備,它擁有這麼幾個關鍵要素:



  • 它是擴增實境產品,即 Augmented Reality(AR),AR 技術將電腦生成的圖像與真實的世界相疊加。類似的產品有圖像投射到視網膜上的 Google Glass,以及疊加在手機相機鏡頭畫面上的手機 AR 應用。
  • 它擁有獨立的運算單元,自帶 CPU + GPU + HPU,不需要外接電腦。它的 CPU 和 GPU 基於英特爾的 14 奈米製程的 Cherry Trail 晶片,HPU 是微軟發明的縮寫,全稱是 Holographic Processing Unit,即全像處理單元。按照「知乎」論壇匿名用戶的回答,HPU 是一塊 ASIC(Application-specific integrated circuit),是微軟為 HoloLens 客製化的集成電路,對此,我只能說「有錢任性」。

 

HoloLens 不是什麼?

Microsoft HoloLens-1

 

看完微軟栩栩如生的宣傳影片後,如果你的反應是:

臥槽,Matrix 要來了。

那麼你要好好看這一段,因為 Matrix 是 Virtual Reality / VR / 虛擬實境,VR 的特點是讓參與者置身於電腦生成的 3D 圖像世界中,淡化真實的世界。VR 近期的代表產品是 Oculus Rift,戴上 Rift 後你是看不到真實世界的。在我看來 VR 最大的問題是:這個虛擬世界很真實很精彩,但是有什麼用呢?也就是說 VR 只能做到更逼真的 3D 世界,它無法幫助人們更好地理解真實的世界。

Microsoft HoloLens-2

HoloLens 也不是 Google Glass,它比 Google Glass 多了:

  • 3D 感知能力,可以對身邊的 3D 場景進行建模。而 Google Glass 只能看到 RGB 像素值。
  • 3D 渲染能力。
  • 人機交互能力,可以用手勢來進行控制。

HoloLens 也不是市場上常見的的 AR,常見的基於內置鏡頭的 AR 應用基於內置鏡頭有:
基於醜陋的黑白標記圖片的 AR

Microsoft HoloLens-3

以及基於任意圖片的 AR。

Microsoft HoloLens-4

很炫是嗎,但是它們只能檢測到圖片所在的那個平面。HoloLens 比它們都「牛」,它能檢測到各個角度的 3D 場景!

 

HoloLens 的 AR 是如何得到 3D 場景深度資訊的?

我們回到 AR 的定義,想要實現擴增實境,必須先理解實境,那麼對於 HoloLens 而言,實境是什麼呢?是傳感器的數據。

傳感器是啥?是攝影鏡頭。

同樣是攝影鏡頭,為什麼 HoloLens 就可以感知深度呢?微軟的 Kinect 在這方面很成功,那麼是不是 HoloLens 上放了一台嵌入式的 Kinect 呢?

答案在下面的原型圖片中:

Microsoft HoloLens-5

HoloLens 擁有四台攝影鏡頭,左右兩邊各兩台。通過對這四台攝影鏡頭的即時畫面進行分析,HoloLens 可覆蓋的水平視角和垂直視角都達到 120 度。

也就是說它採用的是立體視覺 / Stereo Vision 技術來獲取類似下圖的深度圖 (depth map)。

Microsoft HoloLens-6

 

立體視覺是電腦視覺學科的一個子學科,專注於從兩個攝影鏡頭的圖像數據中得到真實場景中的物體離攝影鏡頭的距離。示意圖如下:

Microsoft HoloLens-7

下面是基本的步驟,查閱 OpenCV 文檔可以瞭解具體到函數用法

  • 攝影鏡頭校正,undistortion。由於攝影鏡頭的鏡片出廠時都存在扭曲,為了得到精確的數據需要在使用前進行校正。常用的方法是基於棋盤的各個姿態拍幾次,然後計算相機的矩陣參賽。下圖便是常見的標定界面。
Microsoft HoloLens-8
  • 圖像對齊,rectification。因為兩個攝影鏡頭的位置不同,因此它們各自看到的場景是有偏差的,左邊的攝影鏡頭能看到最左的場景,右邊的看到最右的場景。圖像對齊的目的是得到相同的場景部分。
  • 左右圖像匹配,correspondence。可以使用 OpenCV ,得到 disparity map。
  • 通過重映射函數,比如 OpenCV 中的 cv::reprojectImageTo3D,得到一張深度圖。

只有一張深度圖是不夠的,它只是某一時刻真實的場景在攝影鏡頭中的映射。要想得到完整的 3D 場景,我們需要分析一系列的深度圖。

 

HoloLens 如何從多張深度圖重建 3D 場景?

答案是 SLAM(Simultaneous Localization And Mapping),即同步定位與建圖系統。這個技術被用於機器人、無人汽車、無人飛行器的定位與尋路系統。解決的是非常哲學的問題:

  • 我現在在哪裡?
  • 我可以去哪裡?

SLAM 有很多實現的方式,有一個開源的方式,實現了很多深度圖的處理和匹配算法,可以認為是 3D 版本的 OpenCV。

而微軟圍繞著 Kinect 的深度圖數據發明了 Kinect Fushion 算法,並發表了兩篇論文:

  • KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera;
  • KinectFusion: Real-Time Dense Surface Mapping and Tracking。

為什麼我認為 HoloLens 與 Kinect Fushion 有關?答案在這個頁面中

Shahram Izadi 是微軟劍橋研究院的 principal researcher 及 research manager。他所領導的互動 3D 技術組(interactive 3D technologies)為微軟的多項產品提供了研究力量,包括 Kinect for Windows, Kinect Fusion 以及 HoloLens。順便說一句,他們組在招人。

Kinect Fushion,透過在室內移動 Kinect 設備,獲取不同角度的深度圖,即時更新,對不同對深度圖進行累積,計算出精確的房間以及房間內物體的 3D 模型。

Microsoft HoloLens-9

它分四個階段:

  • 深度圖格式轉換,轉化後的深度的單位是米,用浮點數保存。並計算頂點座標和表面的法向量。
  • 計算世界座標系下的相機姿態(包含位置和朝向),通過重複的對齊算法跟蹤這兩個值,這樣系統總是知道當前的相機與最初的姿態相比變了多少。
  • 第三階段將姿態已知情況下的深度數據融合到單個 3D 樂高空間裡,你也可以叫它為 MineCraft 空間,因為這個空間的基本元素不是三角形,而是方格子。演示影片中頻頻出現 MineCraft 場景估計也和這個階段有關。
  • 基於 Raycasting 的 3D 渲染,Raycasting 需要從當前的相機位置發出射線,與 3D 空間求交集。樂高空間特別適合Raycasting,可以用八叉樹(octree)來加速射線的求交運算。Raycasting、 Raytracing 以及 Rasterization 是三種常見的渲染方式,這裡就不展開了。

在 HoloLens 的應用中我們運行到第三步,即獲取 3D 樂高模型就可以了,第四步並不是必須的。因為 HoloLens 的螢幕是透明的,不需要再把房屋的模型渲染一遍,我們自帶的眼睛已經渲染了一遍了:)

 

HoloLens 炫酷的 demo 都是怎麼製作的?

還剩下三個難點,留待後續文章敘說:

  • 手勢識別怎麼做的?
  • 眼球跟蹤怎麼做的?
  • 非常貼合的 3D 渲染是怎麼做的?

(本文由 36Kr 授權轉載) 

發表迴響