三維重建 3D Reconstruction

建設中,記錄日常學習到的碎片,最后整理

什么是三維重建?

這里指的三維重建是基于對環(huán)境或者物體的一系列不同角度的照片,通過一系列的處理,獲得環(huán)境或物體的三維模型。

三維模型的表示方式

點云(Point Clouds)、網(wǎng)格(Meshes)、體素(Voxels)、Patch Clouds、Layered Models、Depth maps等。

主要方法

比較常見的流程是:
提取圖像特征(如SIFT、SURF等)->利用特征將圖像計算圖像之間的特征匹配->基于匹配的特征進行稀疏重建,得到各個圖像的相機位姿和稀疏的特征點云(SfM)->基于相機位姿進行稠密重建,得到稠密點云(PMVS/CMVS)->基于點云重建網(wǎng)格、體素或者紋理

常用工具

image.png

VisualSFM是一個整合了特征提取、圖像匹配、稀疏點云重建、稠密重建(需要單獨下載CMVS/PMVS)的軟件,由?開發(fā),免費但不開源(不能用于商業(yè)用途)。基于一系列RGB圖像,我們可以得到一個稠密的點云。
PMVS/CMVS用SFM的輸出作為輸入,利用稀疏的特征點云、圖像和對應的相機位姿來重建稠密點云。這個算法由?開發(fā),如果你的OpenCV是build without non commercial module,采用permissive BSD license,可以用于商業(yè)目的。PMVS指的是將大的點云合理地分割、重建、拼接的過程。
MeshLab是常用的點云、網(wǎng)格顯示和處理軟件,內(nèi)置了很多3D重建算法,能夠進行基于點云的網(wǎng)格重建、簡化等。
COLMAP是一個開源的軟件,采用New BSD license,因而可以用于商業(yè)目的。類似于VisualSFM的前半部分,COLMAP能夠用于從圖像中得到稀疏特征點云和相機位姿。如果有CUDA的話,COLMAP也能用于稠密點云重建和表面重建。
https://colmap.github.io
Bundler是稀疏重建工具,然而效果可能不如VisualSFM。

SfM(Structure from Motion)

SfM指的是給出n個固定的三維空間點的m張圖像:
\mathbf{x}_{ij}=\mathbf{P}_i\mathbf{X}_j, \quad i=1,...,m, j=1,...,n
m\times n個對應關系\mathbf{x}_{ij}中估計出m個投影矩陣\mathbf{P}_in個三維空間中的點\mathbf{X}_j

SfM問題中的不確定性

如果我們對場景進行一個變換\mathbf{Q},同時對相機矩陣進行其逆變換\mathbf{Q^{-1}},則圖像會保持不變:
\mathbf{x}=\mathbf{PX}=(\mathbf{PQ}^{-1})(\mathbf{QX})
因而SfM問題中會存在不確定性,通過一些約束可以減小不確定性。
這些不確定性可以分為以下幾種
。。。

Workflow of SfM

相機的內(nèi)參矩陣和外參矩陣

我們記一個點在世界坐標系(WCS,World Coordinate System)中的坐標為\mathbf{X}_w=[x_w,y_w,z_w]^T,相機坐標系(CCS,Camera Coordinate System)的坐標為\mathbf{X}_c=[x_c,y_c,z_c]^T,其在相機圖像中的投影(ICS,Image Coordinate System)中的坐標為\mathbf{X}=[u,v]^T。則內(nèi)參矩陣\mathbf{K}表示\mathbf{X}_c\mathbf{X}之間的關系:
\left[ \begin{matrix} u\\ v\\ 1 \end{matrix}\right]=\frac{1}{z_c} \left[ \begin{matrix} f_x &0&c_x\\ 0&f_y&c_y \\0&0&1 \end{matrix}\right]\cdot \left[ \begin{matrix} x_c\\ y_c\\z_c \end{matrix}\right]
外參矩陣則指的是相機坐標系和世界坐標系之間的歐氏變換矩陣,包括平移矩陣\mathbf{t}和旋轉(zhuǎn)矩陣\mathbf{R}
\mathbf{X}_c=\mathbf{R}\mathbf{X}_w+\mathbf{t}
寫成增廣形式:
\left[ \begin{matrix} x_c\\ y_c\\ z_c\\1 \end{matrix}\right]= \left[ \begin{matrix}\mathbf{R} &\mathbf{t}\\ \mathbf{0}&1 \end{matrix}\right]\cdot \left[ \begin{matrix} x_w\\ y_w\\ z_w\\1\end{matrix}\right]
則外參矩陣\mathbf{A}可以表示為:
\mathbf{A}= \left[ \begin{matrix}\mathbf{R} &\mathbf{t}\\ \mathbf{0}&1 \end{matrix}\right]
于是從世界參考系到圖像坐標系的轉(zhuǎn)化可以用一個投影矩陣\mathbf{P}來表示:

相機的基礎矩陣(Fundamental Matrix)和本質(zhì)矩陣(Essential Matrix)

基礎矩陣\mathbf{F}
對于兩個固定的相機,那么存在一個3\times 3的矩陣\mathbf{F},對于任意一個三維空間點\mathbf{X}_w,若其在兩個相機圖像參考系中的坐標分別為\mathbf{X}_i=[u_i,v_i,1]^T\mathbf{X}_j=[u_j,v_j,1]^T,則有
\mathbf{X}_i^{-1}\mathbf{F}\mathbf{X}_j=0
基礎矩陣只由兩個相機的內(nèi)參(\mathbf{K},\mathbf{K'})和相互變換關系(\mathbf{R},\mathbf{t})決定,確定了兩個相機的對極幾何,可以將一個相機圖像上的一點轉(zhuǎn)化成另一個相機圖像上的一條極線。
八點法計算基礎矩陣
單憑\mathbf{X}_i^{-1}\mathbf{F}\mathbf{X}_j=0這個關系,我們是無法確定基礎矩陣的,因為乘上任何一個常數(shù)等式仍然成立,因而我們通常讓f_{33}=-1。這樣基礎矩陣還有八個自由度,只需要再有八個點對就可以確定基礎矩陣(線性無關的情況下)每個點對會得到一個如下的方程:uu'f_{11}+vu'f_{12}+u'f_{13}+uv'f_{21}+vv'f_{22}+v'f_{23}+uf_{31}+vf_{32}=1
實際上我們會希望用更多的信息來計算基礎矩陣,可以用更多的點,隨后對超定方程組計算最小二乘解,也或者用RANSAC算法用其他的點進行驗證,取最好的結(jié)果。
本質(zhì)矩陣\mathbf{E}
本質(zhì)矩陣被定義為\mathbf{E}=\mathbf{K'}^T\mathbf{F}\mathbf{K},只與兩個相機間的相互變換(\mathbf{R},\mathbf{t})有關。我們可以通過SVD分解等方法算出\mathbf{R},和\mathbf{t}的方向,這也被用于SfM的一種方法。
基礎矩陣、本質(zhì)矩陣與SfM
一方面,基礎矩陣可以用來驗證兩幅圖像間的特征匹配;另一方面,可以通過基礎矩陣推算出本質(zhì)矩陣,并以此使用序慣的方式將所有圖像對應的相機位姿結(jié)合到一起。

序慣方法

  • 極線約束:利用本質(zhì)矩陣可以算出一個相機位姿相對于另一個相機位姿的旋轉(zhuǎn)和平移方向,利用一個額外的確定的點,我們便可以確定平移的距離。這樣利用之前的相機的位姿能夠確定新的相機位姿。
  • Resection:利用已經(jīng)重建過的3D點來確定新的視野的位姿。
  • 融合局部重建碎片:每兩三個視野進行局部重建,然后融合在一起。

MVS(Multi-View Stereo)

廣義上的多視幾何指的是利用同一個物體或者場景的一系列照片計算出它的一個3D形狀的某種表示。

基于RGB-D相機的的三維重建

除了圖像,還能感知距離的相機被稱為RGB-D相機。RGB-D相機常見的技術包括ToF(Time of Flight,飛時原理)、Stereo(雙目)、結(jié)構光等。常見的結(jié)構光相機如Microsoft Kinect、Intel RealSense等。
RTAB Map
RTAB Map(Real-Time Appearance-Based Mapping)是一個基于圖的SLAM框架。我們也可以用RTAB Map來實現(xiàn)場景的稠密三維重建。RTAB Map在ROS環(huán)境下有比較好的集成,可以支持常見的RGB-D相機和IMU。

RTAB Map

未完待續(xù)

參考:
mardy.it的Youtube視頻:Overview of different photogrammetry programs
RTAB map主頁
基礎矩陣、本質(zhì)矩陣
Never-guess的CSDN博客:SfM的算法流程
http://mi.eng.cam.ac.uk/~cipolla/publications/contributionToEditedBook/2008-SFM-chapters.pdf

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容