基于RGB-D多相機的實時3D動態(tài)場景重建系統
本文為媒礦工廠發(fā)表的技術文章
原標題:Real-time 3D Reconstruction of Dynamic Scenes with Multiple Kinect v2 Sensors
作者:周凱, 宋利, 胡經川, 郭帥, 董瑜(上海交通大學圖像所), Yanying Sun, Yesheng Xu(Intel Corporation, China)
發(fā)表會議:IBC2021
原文鏈接:https://www.ibc.org/download?ac=18719(或點擊閱讀原文跳轉)
目錄
Introduction
主要工作
系統概述
硬件架構
軟件架構
主要算法
幀同步
外參標定
點云重疊區(qū)域去除
后處理
實驗結果
性能
質量
總結
參考文獻
Introduction
三維重建是捕捉真實物體的形狀和外觀,并還原三維立體結構的過程。實時三維重建已經成為多媒體和計算機圖形領域的活躍研究課題之一。它可以應用于許多新穎的場景,如自由視角視頻、3D游戲互動以及增強現實或虛擬現實。這些應用大多對實時性能有很高的要求。然而,盡管實時重建技術在靜態(tài)物體重建領域已經很成熟,但受限于龐大的數據量和算法的復雜性,動態(tài)場景的實時重建仍然是一個很大的挑戰(zhàn)。
由于用于深度估計的立體匹配算法的高復雜性和近年來低成本 RGB-D 相機的快速出現,使得 RGB-D 相機通常被用作實時系統的數據采集設備。微軟已經發(fā)布了三種深度傳感器:Kinect v1、Kinect v2 和 Azure Kinect。盡管 Azure Kinect 是前兩代相機的繼承者,但由于 Azure Kinect 在 2020 年 3 月才發(fā)布,Kinect v2 相機仍然是研究中使用最廣泛的傳感器。許多相關的實時重建系統都使用 Kinect v2 作為數據采集設備,因為它提供了可接受的分辨率和可承擔的成本。

現有的基于 Kinect v2 的三維重建系統有很多缺點。首先,現有系統通常采用客戶端-服務器結構,如圖1所示,每個客戶端驅動一臺相機,所有的客戶端連接到同一個服務器上,由于相機數量較多,通常需要多臺計算機才能完成系統搭建,結構顯得異常復雜。其次,在實時性能方面,現有系統采用順序執(zhí)行的算法設計,從相機采集一幀數據后,直到當前幀處理結束才會采集下一幀,因此,隨著場景大小和相機的數量的增加,現有系統的幀率會相應下降。
主要工作
本文中,我們提出了基于 Kinect v2 相機的實時三維重建系統。針對動態(tài)場景的三維重建場景,通過流水化設計,集成多線程和 CUDA 加速等優(yōu)化,實現了系統各組件復雜度和重建質量的平衡,使得重構運動物體變?yōu)楝F實。
本文的主要工作為:
一種簡易的中心式 3D 重建系統,僅需要一臺電腦和多個深度相機,可以實時重建動態(tài)場景。
集成多線程和 CUDA 加速等優(yōu)化方案,在性能方面達到了相機固有幀率 30 fps。
開放式解決方案,將會在 https://github.com/sjtu-medialab/Kinect3D 持續(xù)發(fā)布并更新。
系統概述
硬件架構
如圖 2 所示,系統主要由一臺相機和多個 Kinect v2 相機組成,各相機面朝中心呈圓形分布。每個 Kinect v2 相機包含一個彩色相機和一個深度相機,以 30 fps 的幀率同步采集 1920 x 1080 的彩色圖和 512 x 424 的深度圖。

在相機 SDK 方面,由于官方驅動不支持多個相機同時連接,因此采用了第三方的開源驅動 libfreenect2[1],支持單臺 PC 通過 USB 3.0 連接高達 5 臺相機。
軟件架構
圖 3 展示了系統的軟件流水線設計,它由多個模塊組成,包括多路 RGB-D 流采集,幀同步,點云融合,后處理和 OpenGL 交互式渲染等。各個模塊是并行的,彼此之間的數據通過隊列進行分離。

為了同時采集多路 RGB-D 數據流,我們?yōu)槊總€相機分配了一個單獨的線程,并通過時間戳對來自各線程的幀進行同步,然后送到 GPU 上進行計算并最終渲染,這種并行化的設計是實現實時性能的重要基礎。
主要算法
幀同步
盡管相機文檔給出的幀率是 30 fps,但是在實際工作中,每個相機的幀率略有抖動。因此系統分配了一個單獨的線程實現了基于時間戳的軟件同步,對于某一個相機采集的幀,將來自其他相機且時間戳間隔在16ms以內的視為一組同步幀,從而將所有相機的幀同步在 16 ms以內。
外參標定
相機外參標定是獲取相機在世界坐標系中姿態(tài)的過程,從而能夠將點云從各自的相機坐標系融合到世界坐標系中。每個相機的姿態(tài)由旋轉矩陣 和平移矩陣 組成。相機標定分為兩步:基于 2D marker的粗略標定和基于 3D 匹配點的精細標定。
粗標定
在粗標定環(huán)節(jié),我們使用了[2]中使用的 marker 進行標定。一個典型的 marker 如圖 4 所示,由一個5邊形和內部 3x3 的黑白方塊組成。

在標定過程中,世界坐標系原點建立在marker的中心,每個相機會檢測黑白交界處的角點,得到其在圖像中的像素坐標,進一步根據深度圖和相機內參得到角點在相機坐標系中的 3D 坐標,而角點在世界坐標系中的位置是已知的,從而能夠得到相機坐標系和世界坐標系的轉換關系,也即相機外參。
其中 是世界坐標系中的點, 是相機坐標系中的點。一個典型的標定過程如下圖所示:
精細標定
粗標定的缺點是標定精度會受到平面關鍵點檢測精度的影響。為了降低匹配誤差,我們使用了迭代最近點算法(ICP)對相機初始姿態(tài)進行迭代優(yōu)化,得到旋轉矩陣 和 平移矩陣 。最終標定得到的轉換關系為:
在精細標定步驟,由于ICP算法的高復雜度,系統部署了一個"離線"線程。每次按下 calibrate 按鍵,系統流水線會為 ICP 輸出一個同步幀。標定完成后,將丟棄當前幀并更新系統中的相機外參。這種離線模式確保了在精細標定過程中不影響系統的性能。
點云重疊區(qū)域去除
不同相機產生的點云不可避免地存在很大一部分重疊區(qū)域,尤其是相鄰兩個相機之間,重疊區(qū)域中存在大量冗余和不匹配的數據。在本系統中,在每兩個相鄰傳感器之間執(zhí)行重疊區(qū)域的去除。該系統中應用的方法類似于[3],通過外部參數矩陣將一個傳感器的點映射到另一個。在[3]中,由于其迭代策略,去除重疊區(qū)域是系統的性能瓶頸,通常需要數百毫秒,這迫使他們采用了粗到細的策略。在本系統中,我們考慮到每個像素的映射是獨立的,因此可以在 GPU 中實現,從而大大減少了執(zhí)行時間,只需幾毫秒。
設 A 和 B 為兩個相鄰的相機,本系統實現的算法如下圖所示,該算法可概括如下:

將相機 A 中的像素根據深度圖和相機外參映射到世界坐標系,得到相機 A 的點云; 將 根據相機 B 的外參,映射到 B 的相機坐標系,進一步根據 B 的內參,映射到 B 的像素坐標; 與相機 B 的深度圖進行比較,若深度值之間的差值小于給定的閾值,說明 A 和 B 在當前點是重疊的,從而去除 A 中的對應點。
后處理
后處理主要包括了點云的濾波,用于抑制點云的噪聲。由于 TOF 相機的限制,Kinect v2 深度圖中存在很多缺失和不穩(wěn)定的像素,因此重建的模型包含大量噪聲。考慮到點云過濾算法的高復雜度,這是實現實時幀率的主要困難之一。
受[4]中提出的重構算法“Step Discontinuity Constrained (SDC) triangulation”的啟發(fā),我們在系統中部署了步長不連續(xù)約束,并實現了一種名為“SDC filter”的算法。考慮到深度圖的像素和3D點是一一對應的,深度像素之間的鄰域關系代表了3D空間點的拓撲結構,因此對于深度像素中的每個點,在給定的鄰域內比較其與周圍像素的距離差異,只有滿足一定的距離約束,才會將其保留,否則將其作為噪點去除。后續(xù)的實驗部分證明了這種濾波算法的有效性。
實驗結果
本部分,我們給出了系統的實驗結果。整個系統由 C++ 和 CUDA C 編寫,運行在一臺 PC 上,系統配置為:i9-10900K, RTX2080Ti, 32GB RAM, Linux Manjaro 64bit。
性能
我們采集了連續(xù)的 1000 幀,并記錄了系統各模塊的延遲,如下圖所示:

下方的表格給出了更加詳細的數據:

從表格中可以看出,系統幀率平均約為 26 fps,略低于相機給定的 30 fps。經過分析,這主要是由于相機采集過程中產生了丟幀,圖7給出了丟幀的情況,在大多數情況下,采集一幀的時間為 33 ms,但在一些情況下由于未知的硬件原因,數據產生了丟失,從而導致系統最終的幀率略低于 30fps。
此外,我們的系統在相機數量增加時,系統性能表現差異不大,這主要得益于多線程并行的設計,確保了在動態(tài)場景中也能實現實時重建。
質量

上圖給出了三個角度的重建質量。從左到右質量逐漸提高,分別是:原始點云,經過重疊區(qū)域去除,經過 SDC 濾波和最終重建結果。
附上三個角度的動態(tài)重建結果:



總結
在本文中,我們實現了一個低成本的實時系統,支持連接到一臺計算機的多個 Kinect v2 傳感器。系統的優(yōu)點是高幀率和簡潔的架構。這主要由兩部分來保證。在實現層面,采用流水線設計模式,模塊采用FIFO并行分離,集成CPU多線程和GPU并行加速。在算法層面,采用了基于深度連續(xù)性的點云過濾等輕量級算法。最后,如結果所示,整個系統都可以達到相機的固有幀率。
未來,我們計劃集成更復雜的算法來提高點云的質量,并探索實時表面重建的可行性。
最后附上演講視頻:
參考文獻
[1] Libfreenect2: Release 0.2, April 2016.
[2] Marek Kowalski, Jacek Naruniec, and Michal Daniluk. Livescan3d: A fast and inexpensive 3d data acquisition system for multiple kinect v2 sensors. In 2015 international conference on 3D vision, pages 318–325.IEEE, 2015.
[3] Dimitrios S Alexiadis, Dimitrios Zarpalas, and Petros Daras. Real-time, full 3-d reconstruction of moving foreground objects from multiple consumer depth cameras. IEEE Transactions on Multimedia,15(2):339–358, 2012.
[4] Adrian Hilton, Andrew J Stoddart, John Illingworth, and Terry Windeatt. Reliable surface reconstruction from multiple range images. In European conference on computer vision, pages 117–126. Springer,1996.
