3D視覺CV界的終極體現(xiàn)形式,計算機(jī)如何「看」這個三維世界
打開手機(jī)進(jìn)行人臉解鎖;VR、AR 技術(shù)帶來如此虛擬卻真實的場景……3D 視覺幾乎無所不能,在智能家居、智能安防、汽車電子、工業(yè)測量、新零售、智能物流等領(lǐng)域發(fā)揮重要作用,堪稱賦能產(chǎn)業(yè)創(chuàng)新的最大推力。這些技術(shù)的背后涉及了 3D 視覺相關(guān)內(nèi)容,那么計算機(jī)是如何「看」這個三維世界的?
隨著信息技術(shù)的快速發(fā)展,計算機(jī)視覺 3D 技術(shù)已經(jīng)應(yīng)用到了諸多領(lǐng)域,推動了虛擬現(xiàn)實(VR)、增強(qiáng)現(xiàn)實(AR)等技術(shù)的不斷進(jìn)步。3D 視覺問題變得越來越重要,它提供了比 2D 更加豐富的圖像信息。
現(xiàn)如今,隨處可見 3D 視覺技術(shù)帶來的便利,工業(yè)機(jī)器人、工件識別與定位、3D 成像技術(shù)、產(chǎn)品虛擬設(shè)計、智能制造、自動駕駛、SLAM、無人機(jī)、3D 重建、人臉識別等等,都涉及到 3D 視覺相關(guān)內(nèi)容。

3D 視覺應(yīng)用舉例,圖源:https://zhuanlan.zhihu.com/p/52049458
總結(jié)來說,3D 視覺是計算機(jī)視覺與計算機(jī)圖形學(xué)高度交叉的一個重要研究方向。由于三維傳感技術(shù)的飛速發(fā)展和三維幾何數(shù)據(jù)的爆炸式增長,3D 視覺研究突破傳統(tǒng)的二維圖像空間,實現(xiàn)三維空間的分析、理解和交互。
我們生活在三維空間中,如何智能地感知和探索外部環(huán)境一直是個熱點課題。2D 視覺技術(shù)借助強(qiáng)大的計算機(jī)視覺和深度學(xué)習(xí)算法取得了超越人類認(rèn)知的成就,而 3D 視覺則因為算法建模和環(huán)境依賴等問題,一直處于正在研究的前沿,而三維信息才真正能夠反映物體和環(huán)境的狀態(tài),也更接近人類的感知模式。
隨著技術(shù)的不斷進(jìn)步,三維視覺領(lǐng)域也取得了快速進(jìn)步,例如 3D+AI 識別功能,掃描人臉三維結(jié)構(gòu)完成手機(jī)解鎖;自動駕駛領(lǐng)域通過分析 3D 人臉信息,判斷司機(jī)駕駛時的情緒狀態(tài);SLAM 通過重建周邊環(huán)境,完成建圖與感知;AR 領(lǐng)域通過三維重建技術(shù)完成目標(biāo)的重現(xiàn)等。那么如此實用的技術(shù),是怎樣實現(xiàn)的呢?
在深入了解之前,讓我們先來了解一下 3D 視覺技術(shù)的一些基礎(chǔ)知識。
3D 圖像介紹
在進(jìn)行 3D 圖像介紹之前,首先簡單回顧一下 2D 圖像。我們?nèi)粘I钪兴姷膱D像可以稱為物理圖像,這種圖像不能直接被計算機(jī)識別,需要轉(zhuǎn)換成數(shù)字格式,即數(shù)字圖像。數(shù)字圖像是二維圖像有限數(shù)字?jǐn)?shù)值像素的表示。由數(shù)組或矩陣表示,其光照位置和強(qiáng)度都是離散的。其有兩種存儲方式:位圖存儲和矢量存儲,常見的存儲格式包括 PNG、GIF、JPEG、BMP 等。

2D 圖像可分為二值圖像、彩色圖像等。其中二值圖像中每個像素可以由 0(黑) 到 255(白) 的亮度值表示。0-255 之間表示不同的灰度級。而彩色圖像是由三種不同顏色的灰度圖像組合而成,一個為紅色分量(R),一個為綠色分量(G),一個為藍(lán)色分量(B)。

圖像彩色顯示法,RGB 圖像三個分量,圖源:https://blog.csdn.net/Hello_Chan/article/details/89094790
與二維圖像類似,三維圖像是在二維彩色圖像的基礎(chǔ)上又多了一個維度,即深度(Depth,D),可用一個很直觀的公式表示為:三維圖像 = 普通的 RGB 三通道彩色圖像 + Depth Map。
RGB-D
RGB-D 是廣泛使用的 3D 格式,其圖像每個像素都有四個屬性:即紅(R)、綠(G)、藍(lán)(B)和深度(D)。
深度圖是三維圖像特有的,是指存儲每個像素所用的位數(shù),也用于度量圖像的色彩分辨率。確定彩色圖像每個像素可能有的顏色數(shù),或者確定灰度圖像每個像素可能有的灰度級數(shù)。它決定了彩色圖像中可出現(xiàn)的最多顏色數(shù),或灰度圖像中的最大灰度等級。其數(shù)值是規(guī)整的,適合直接用于現(xiàn)存的圖像處理框架。
關(guān)于深度圖的解釋,例如,一幅彩色圖像的每個像素用 R、G、B 三個分量表示,若每個分量用 8 位,那么一個像素共用 24 位表示,那么像素的深度為 24,則每個像素可以是 16777216(224) 種顏色中的一種。因此,可以把像素深度理解成是深度圖像距離值。表示一個像素的位數(shù)越多,它能表達(dá)的顏色數(shù)目就越多,而它的深度就越深。

RGB-D 圖像格式,圖源:https://www.sohu.com/a/249567571_114877
在一般的基于像素的圖像中,我們可以通過(x,y)坐標(biāo)定位任何像素,分別獲得三種顏色屬性(R,G,B)。而在 RGB-D 圖像中,每個(x,y)坐標(biāo)將對應(yīng)于四個屬性(深度 D,R,G,B)。
點云
我們在做 3D 視覺的時候,處理的主要是點云,點云就是一些點的集合。相對于圖像,點云有其不可替代的優(yōu)勢——深度,也就是說三維點云直接提供了三維空間的數(shù)據(jù),而圖像則需要通過透視幾何來反推三維數(shù)據(jù)。
何為點云?其實點云是某個坐標(biāo)系下的點的數(shù)據(jù)集。點包含了豐富的信息,包括三維坐標(biāo) X,Y,Z、顏色、分類值、強(qiáng)度值、時間等等。點云在組成特點上分為兩種,一種是有序點云,一種是無序點云。

點云示例,圖源:https://www.jianshu.com/p/ffedad5e8e30
點云的獲取:點云不是通過普通的相機(jī)拍攝得到的,一般是通過三維成像傳感器獲得,比如雙目相機(jī)、三維掃描儀、RGB-D 相機(jī)等。目前主流的 RGB-D 相機(jī)有微軟的 Kinect 系列、Intel 的 realsense 系列、structure sensor(需結(jié)合 iPad 使用)等。點云可通過掃描的 RGB-D 圖像,以及掃描相機(jī)的內(nèi)在參數(shù)創(chuàng)建點云,方法是通過相機(jī)校準(zhǔn),使用相機(jī)內(nèi)在參數(shù)計算真實世界的點(x,y)。因此,RGB-D 圖像是網(wǎng)格對齊的圖像,而點云則是更稀疏的結(jié)構(gòu)。此外,獲得點云的較好方法還包括 LiDAR 激光探測與測量,主要通過星載、機(jī)載和地面三種方式獲取。
點云的內(nèi)容:根據(jù)激光測量原理得到的點云,包括三維坐標(biāo)(XYZ)和激光反射強(qiáng)度(Intensity),強(qiáng)度信息與目標(biāo)的表面材質(zhì)、粗糙度、入射角方向以及儀器的發(fā)射能量、激光波長有關(guān)。根據(jù)攝影測量原理得到的點云,包括三維坐標(biāo)(XYZ)和顏色信息(RGB)。結(jié)合激光測量和攝影測量原理得到點云,包括三維坐標(biāo)(XYZ)、激光反射強(qiáng)度(Intensity)和顏色信息(RGB)。
點云的屬性:空間分辨率、點位精度、表面法向量等。
雖然 RGB-D 相機(jī)應(yīng)用廣泛,但會受到很多硬件的限制,目前深度相機(jī)輸出的深度圖存在很多問題,比如對于光滑物體表面反射、透明物體、半透明物體、深色物體等都會造成深度圖缺失。而且很多深度相機(jī)是大片的深度值缺失,后續(xù)還需要進(jìn)一步的深度圖補(bǔ)全操作。
圖源:https://www.cnblogs.com/CV-life/p/10105480.html
上圖為拍攝的室外一個街道的點云圖,如果仔細(xì)觀察,能看清建筑物、樹木的輪廓等。就上圖而言,點云的優(yōu)點可以歸為以下幾點:首先,點云可以表達(dá)物體的空間輪廓和具體位置,我們能看到街道、房屋的形狀,物體距離攝像機(jī)的距離也是可知的;其次,點云本身和視角無關(guān),可以任意旋轉(zhuǎn),從不同角度和方向觀察一個點云,而且不同的點云只要在同一個坐標(biāo)系下就可以直接融合。
接下來,放大點云,如下圖所示,如果將點云放大,最后看到的就是一個個離散的點。也就是空間中成千上萬的點組成了一個點的集合,這個點集合構(gòu)成了上面的街道房屋等。
點云放大圖,圖源:https://www.cnblogs.com/CV-life/p/10105480.html
從放大的點云圖側(cè)面反映了點云的缺點,可歸結(jié)為以下幾點:三維點云比圖像多了一個維度,即深度;點云是不規(guī)則分布的,相比于圖像式的規(guī)整網(wǎng)格更難處理;點云缺少了圖像中的紋理,而是一個個孤立的點,會丟失很多信息。除此以外,點云是分布在空間中(XYZ 點)非結(jié)構(gòu)化數(shù)據(jù)(無網(wǎng)格);在圖像中,像素的數(shù)量是一個給定的常數(shù),取決于相機(jī)。然而,點云的數(shù)量可能會有很大的變化,取決于各種傳感器;點云的分辨率和離相機(jī)的距離有關(guān)。不能近距離的觀察,只能在一個很遠(yuǎn)的視角才能觀察整體。
下面來看一下點云結(jié)果對比,原始的 RGB-D 生成的點云結(jié)果如下:

圖源:https://zhuanlan.zhihu.com/p/42084058
下面動圖顯示了經(jīng)過深度圖補(bǔ)全后生成的點云結(jié)果如下:

圖源:https://zhuanlan.zhihu.com/p/42084058
點云的數(shù)據(jù)存儲格式
點云存儲文件格式有很多。一些文件格式致力于標(biāo)準(zhǔn)化與通用性,而今被多個相關(guān)軟件或軟件庫所支持,也被大多數(shù)業(yè)內(nèi)人士所認(rèn)同和使用。點云目前的主要存儲格式包括:pts、LAS、PCD、.xyz 和. pcap 等。選擇合適的通用格式可以更好地與其它工具乃至其它組織對接,進(jìn)而提高工作效率。下面簡單列舉一下點云的數(shù)據(jù)存儲格式。
pts 點云文件格式是最簡便的點云格式,直接按 XYZ 順序存儲點云數(shù)據(jù), 可以是整型或者浮點型。如下圖是截取的塑像點云的一部分。示例如下:

LAS 是激光雷達(dá)數(shù)據(jù)(LiDAR),存儲格式比 pts 復(fù)雜,旨在提供一種開放的格式標(biāo)準(zhǔn),允許不同的硬件和軟件提供商輸出可互操作的統(tǒng)一格式。現(xiàn)在 LAS 格式文件已成為 LiDAR 數(shù)據(jù)的工業(yè)標(biāo)準(zhǔn)格式。示例如下:

LAS 格式點云截圖,其中 C:class(所屬類),F(xiàn):flight(航線號),T:time(GPS 時間),I:intensity(回波強(qiáng)度),R:return(第幾次回波),N:number of return(回波次數(shù)),A:scan angle(掃描角),RGB:red green blue(RGB 顏色值)。圖源:https://www.cnblogs.com/chenbokai/p/6010143.html
PCD 存儲格式,現(xiàn)有的文件結(jié)構(gòu)因本身組成的原因不支持由 PCL 庫(后文會進(jìn)行介紹)引進(jìn) n 維點類型機(jī)制處理過程中的某些擴(kuò)展,而 PCD 文件格式能夠很好地補(bǔ)足這一點。PCD 格式具有文件頭,用于描繪點云的整體信息:定義數(shù)字的可讀頭、尺寸、點云的維數(shù)和數(shù)據(jù)類型;一種數(shù)據(jù)段,可以是 ASCII 碼或二進(jìn)制碼。數(shù)據(jù)本體部分由點的笛卡爾坐標(biāo)構(gòu)成,文本模式下以空格做分隔符。
PCD 存儲格式是 PCL 庫官方指定格式,典型的為點云量身定制的格式。優(yōu)點是支持 n 維點類型擴(kuò)展機(jī)制,能夠更好地發(fā)揮 PCL 庫的點云處理性能。文件格式有文本和二進(jìn)制兩種格式。示例如下:

圖源:https://cloud.tencent.com/developer/article/1475778
.xyz 一種文本格式,前面 3 個數(shù)字表示點坐標(biāo),后面 3 個數(shù)字是點的法向量,數(shù)字間以空格分隔。示例如下:

.pcap 是一種通用的數(shù)據(jù)流格式,現(xiàn)在流行的 Velodyne 公司出品的激光雷達(dá)默認(rèn)采集數(shù)據(jù)文件格式。它是一種二進(jìn)制文件。
數(shù)據(jù)構(gòu)成結(jié)構(gòu)如下:
整體一個全局頭部 (GlobalHeader),然后分成若干個包(Packet),每個包又包含頭部(Header)和數(shù)據(jù)(Data)部分。
相應(yīng)基礎(chǔ)算法庫對不同格式的支持
點云的數(shù)據(jù)量龐大,需要專門的數(shù)據(jù)存儲庫進(jìn)行顯示和保存。例如,一張 640 x 480 尺寸的深度圖就可以轉(zhuǎn)換為大約三十萬個空間點的點云,大的點云可達(dá)百萬甚至千萬以上,這時專門用來進(jìn)行點云的讀寫、處理等各種操作數(shù)據(jù)存儲庫就顯得非常重要。
PCL(Point Cloud Library)庫支持跨平臺存儲,可以在 Windows、Linux、macOS、iOS、Android 上部署。可應(yīng)用于計算資源有限或者內(nèi)存有限的應(yīng)用場景,是一個大型跨平臺開源 C++ 編程庫,它實現(xiàn)了大量點云相關(guān)的通用算法和高效數(shù)據(jù)結(jié)構(gòu),其基于以下第三方庫:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,實現(xiàn)點云相關(guān)的獲取、濾波、分割、配準(zhǔn)、檢索、特征提取、識別、追蹤、曲面重建、可視化等操作,非常方便移動端開發(fā)。

此處的 common 指的是點云數(shù)據(jù)的類型,包括 XYZ、XYZC、XYZN、XYZG 等很多類型點云。可以看出,低層次的點云處理主要包括濾波(filters)、關(guān)鍵點(keypoints)、邊緣檢測。點云的中層次處理則是特征描述(feature)、分割(segmention)與分類。高層次處理包括配準(zhǔn)(registration)、識別(recognition)。
除了 PCL 庫以外,VCG 庫(Visulization and Computer Graphics Libary)是專門為處理三角網(wǎng)格而設(shè)計的,該庫很大,且提供了許多先進(jìn)的處理網(wǎng)格的功能,以及比較少的點云處理功能。
CGAL(Computational Geometry Algorithms Library)計算幾何算法庫,設(shè)計目標(biāo)是以 C++ 庫的形式,提供方便、高效、可靠的幾何算法,其實現(xiàn)了很多處理點云以及處理網(wǎng)格的算法。
Open3D 是一個可以支持 3D 數(shù)據(jù)處理軟件快速開發(fā)的開源庫。支持快速開發(fā)處理 3D 數(shù)據(jù)的軟件。Open3D 前端在 C++ 和 Python 中公開了一組精心選擇的數(shù)據(jù)結(jié)構(gòu)和算法。后端經(jīng)過高度優(yōu)化,并設(shè)置為并行化。Open3D 是從一開始就開發(fā)出來的,帶有很少的、經(jīng)過仔細(xì)考慮的依賴項。它可以在不同的平臺上設(shè)置,并且可以從源代碼進(jìn)行最小的編譯。代碼干凈,樣式一致,并通過清晰的代碼審查機(jī)制進(jìn)行維護(hù)。在點云、網(wǎng)格、rgbd 數(shù)據(jù)上都有支持。
本文是針對 3D 視覺的總結(jié)性文章,介紹了幾個比較重要的知識點,希望可以在一定程度上幫助大家更深刻地理解 3D 視覺。在接下來的文章中,我們將繼續(xù)介紹 3D 視覺領(lǐng)域算法的實現(xiàn)。