欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

三维重建

最编程 2024-06-24 08:43:21
...

建设中,记录日常学习到的碎片,最后整理

什么是三维重建?

这里指的三维重建是基于对环境或者物体的一系列不同角度的照片,通过一系列的处理,获得环境或物体的三维模型。

三维模型的表示方式

点云(Point Clouds)、网格(Meshes)、体素(Voxels)、Patch Clouds、Layered Models、Depth maps等。

主要方法

比较常见的流程是:
提取图像特征(如SIFT、SURF等)->利用特征将图像计算图像之间的特征匹配->基于匹配的特征进行稀疏重建,得到各个图像的相机位姿和稀疏的特征点云(SfM)->基于相机位姿进行稠密重建,得到稠密点云(PMVS/CMVS)->基于点云重建网格、体素或者纹理

常用工具

image.png

VisualSFM是一个整合了特征提取、图像匹配、稀疏点云重建、稠密重建(需要单独下载CMVS/PMVS)的软件,由?开发,免费但不开源(不能用于商业用途)。基于一系列RGB图像,我们可以得到一个稠密的点云。
PMVS/CMVS用SFM的输出作为输入,利用稀疏的特征点云、图像和对应的相机位姿来重建稠密点云。这个算法由?开发,如果你的OpenCV是build without non commercial module,采用permissive BSD license,可以用于商业目的。PMVS指的是将大的点云合理地分割、重建、拼接的过程。
MeshLab是常用的点云、网格显示和处理软件,内置了很多3D重建算法,能够进行基于点云的网格重建、简化等。
COLMAP是一个开源的软件,采用New BSD license,因而可以用于商业目的。类似于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

相机的内参矩阵和外参矩阵

我们记一个点在世界坐标系(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。则内参矩阵\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}和旋转矩阵\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]
于是从世界参考系到图像坐标系的转化可以用一个投影矩阵\mathbf{P}来表示:

相机的基础矩阵(Fundamental Matrix)和本质矩阵(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
基础矩阵只由两个相机的内参(\mathbf{K},\mathbf{K'})和相互变换关系(\mathbf{R},\mathbf{t})决定,确定了两个相机的对极几何,可以将一个相机图像上的一点转化成另一个相机图像上的一条极线。
八点法计算基础矩阵
单凭\mathbf{X}_i^{-1}\mathbf{F}\mathbf{X}_j=0这个关系,我们是无法确定基础矩阵的,因为乘上任何一个常数等式仍然成立,因而我们通常让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算法用其他的点进行验证,取最好的结果。
本质矩阵\mathbf{E}
本质矩阵被定义为\mathbf{E}=\mathbf{K'}^T\mathbf{F}\mathbf{K},只与两个相机间的相互变换(\mathbf{R},\mathbf{t})有关。我们可以通过SVD分解等方法算出\mathbf{R},和\mathbf{t}的方向,这也被用于SfM的一种方法。
基础矩阵、本质矩阵与SfM
一方面,基础矩阵可以用来验证两幅图像间的特征匹配;另一方面,可以通过基础矩阵推算出本质矩阵,并以此使用序惯的方式将所有图像对应的相机位姿结合到一起。

序惯方法

  • 极线约束:利用本质矩阵可以算出一个相机位姿相对于另一个相机位姿的旋转和平移方向,利用一个额外的确定的点,我们便可以确定平移的距离。这样利用之前的相机的位姿能够确定新的相机位姿。
  • Resection:利用已经重建过的3D点来确定新的视野的位姿。
  • 融合局部重建碎片:每两三个视野进行局部重建,然后融合在一起。

MVS(Multi-View Stereo)

广义上的多视几何指的是利用同一个物体或者场景的一系列照片计算出它的一个3D形状的某种表示。

基于RGB-D相机的的三维重建

除了图像,还能感知距离的相机被称为RGB-D相机。RGB-D相机常见的技术包括ToF(Time of Flight,飞时原理)、Stereo(双目)、结构光等。常见的结构光相机如Microsoft Kinect、Intel RealSense等。
RTAB Map
RTAB Map(Real-Time Appearance-Based Mapping)是一个基于图的SLAM框架。我们也可以用RTAB Map来实现场景的稠密三维重建。RTAB Map在ROS环境下有比较好的集成,可以支持常见的RGB-D相机和IMU。

RTAB Map

未完待续

参考:
mardy.it的Youtube视频:Overview of different photogrammetry programs
RTAB map主页
基础矩阵、本质矩阵
Never-guess的****博客:SfM的算法流程
http://mi.eng.cam.ac.uk/~cipolla/publications/contributionToEditedBook/2008-SFM-chapters.pdf