三维重建知识总结

一、立体几何知识
1.1 三维重建基础知识
1.1.1 小孔成像以及透镜聚光
小孔成像将空间中的三维点映射到平面上,且是一一对应的,而透镜的作用则是加强映射点的强度。有时会在相机内部引入畸变:径向畸变(2次项以及4次项来表示,可以在图像坐标系中的点乘上径向畸变的方程就是畸变后的图像)以及切向畸变 (多项式)

1.1.2 相机标定
相机标定指的是从空间中三维点到二维点转换的过程,包括三个主要的过程。通过相机标定找到摄像机内参数以及外参数,还可以通过非线性求解的方式进行畸变调整。
1.1.2.1 齐次坐标
将二维点以及三维点向量中加入不为0的数,就能得到齐次坐标。可以将非线性变换转换为线性变换,比如仿射变换就是由一个线性变换+平移。
1.1.2.2 坐标系的转换
世界->相机->像平面(归一化像平面)->图像坐标系其中归一化像平面是焦距为1 的像平面。
(1)相机坐标系转换到像平面坐标系的过程中可以使用相似三角形来求解,对三维点齐次化,再乘上3*4的归一化矩阵,再乘上比例矩阵(主对角线为 f f 1)
(2)像平面到图像主要是单位转换以及主点的偏移,可以使用3*3的矩阵来表示:其中包括1米包括多少 像素的转换以及x轴y轴的转换。若有夹角的话,还需要加上夹角畸变量。
(3)世界坐标系到相机经历了旋转矩阵与平移向量的过程。将世界坐标系中的点齐次化,再乘上4*4的矩阵(包括旋转平移 [R T;1 0])。
1.1.2.3 自由度以及求解
内参数5自由度,外参数6自由度。
(1)摄影标定法
需要精确的6个点对才能进行相机标定,将点对的关系首先变化为线性齐次方程组。Ap=0, 只使用6个点对进行求解能求出解析解。多于6个点对的话,方程处于超定状态。需要进行最小二乘法求解,对2n*12方程组进行SVD分解,得到对应最小奇异值对应的向量就是方程解。注意进行求解时,需要进行约束。得到投影矩阵需要对其进行分解得到内参数以及外参数。这里会用到旋转矩阵的正交矩阵性质。
使用摄影标定法的优缺点: 优点:方便求解 
                                            缺点:需要非常精确的三维点与二维点之间的对应关系。
                                                      不能对有畸变的投影过程进行非线性求解
                                                      使用的代数距离而不是几何距离 
(2)张正友标定法
   因为单应性矩阵的原因,将标定板放在深度值为0的地方,最少不同角度拍3张,并且使用特征点检测匹配算法进行匹配。
   使用多于4对匹配点来进行单应性矩阵的求解。还是转换为齐次线性方程组,然后SVD分解得到的是投影矩阵的初值。
   通过旋转矩阵的正交矩阵性质来进行内参数矩阵外参数矩阵分解。
   因为得到的内外参数矩阵可能不准确,使用重投影的方式(将一个视图中的点投影到另外视图中,来给出最优化函数(几何距离)),去优化内参数外参数矩阵
   如果有畸变参数的话,则需要将畸变参数也引入其中,使用非线性求解的方法(最速下降法、牛顿法、高斯牛顿法、L-M方法)
(3)自标定法

1.1.3 三角化过程
三角化的过程其实是通过空间中不同视角下的同名点通过内外参数进行反投影的过程。空间中的自由度为3,只需要两对点。但是因为噪声的干扰,需要多于两对点去进行三维点的恢复,或者得到精准的匹配点。
(1)可以使用多于两对点(加入其他视角下的同名点以及摄像机内外参数)去进行SVD分解。
(2)对匹配点进行相应的约束

1.1.4 极几何
光心、基线、极点、极线、极平面 的概念。
比较重要的两个概念:基础矩阵(图像坐标系中同名点的约束关系)以及本质矩阵(归一化像平面中点的约束)
(1)本质矩阵
由旋转矩阵与平移向量构成:可以将平移向量矩阵化乘上旋转矩阵的形式。那么就可以通过分解本质矩阵的方法来得到旋转矩阵以及平移向量。自由度为5,有一个尺度约束。
(2)基础矩阵
是在本质矩阵的基础上加上摄像机的内参数。有7个自由度。使用7点法或者8点法进行求解,并且是归一化8点法。  首先给出8对匹配点、进行归一化(均值为0,均方差为根号2),然后进行齐次线性化SVD分解求解出基础矩阵。因为此时的基础矩阵的秩不为2,所以需要进一步秩约束。最后再反规范化操作。通过基础矩阵就能够进行极线搜索,在另外视图上的极线寻找同名点。

1.1.5 运动结构恢复
主要是增量式SFM的过程(openmvg以及colmap框架),包括特征点提取匹配->构建特征图(重叠区域匹配特征点大小,相似性,尺度,基线大小)->初始图像对的选择(匹配点、基线、不满足Homography)->三角化重建三维点(特征图中包含内外参数,可以通过基础矩阵分解)->tracks滤波(去除掉重复点以及投影过远点)->进行BA优化(通过将不同视角下的同名像素带点进行逆投影正投影的过程去构建极大似然估计问题,优化内参外参)->增加新的视角(匹配点足够多,tracks足够长。)->三角化操作(不能通过本质矩阵分解,会进行误差的累计,使用pnp的方法)
->tracks滤波(去除掉重复点以及投影过远点)->进行BA优化 ->每加入几张新的视图就需要进行BA优化操作
colmap,openmvg都是比较好的开源框架。colmap中在构建特征图中进行了比较多的约束,其中会在特征匹配的时候使用极几何进行约束。
(1)colmap开源框架
场景图构建:基础矩阵,满足几何条件。单应性矩阵与基础矩阵的比值,是平面场景(不需要)。经过校准过的图像,得出本质矩阵与基础矩阵的比值,是校准过的图像。将校准过的图像进行本质矩阵分解,再进行三角化操作。计算匹配点夹角的中位数,判断是全景还是一般场景。最后选择校准过的,非全景的视角作为初始图像对。
外点滤除的三角化:同名点与 三维点之间的基线不能太长。 投影的三维点需要在正前方。 投影到空间中的三维点的误差应该小于阈值。 同时使用RANSAC算法进行三角化操作,需要多个视角下的同名点。
RANSAC算法:首先选取最少内点数估计出模型。然后使用模型对其他内点进行投影。将小于阈值的内点加入内点群。依次进行迭代,直到满足设定的内点个数。然后使用这些内点重新估计出模型。
BA操作:在增量式SFM中,插入新的视角时需要进行局部BA操作以及全局BA操作。局部BA操作,能够调整视角的焦距以及相机畸变量,并且删除一些投影误差过大的投影点。而全局BA操作则是删除一些内参数错误的视角。在BA后,还需要进行再三角化操作,恢复一些投影误差没有那么大的投影三维点。因为有些时候,投影误差过大是因为相机畸变或者是内、外参没有优化到位。
在colmap中还有迭代精细的关键操作,就是先进行BA操作,tracks滤除以及再三角化的操作。一般经历两轮这样的过程,能够留下来的内点数就比较多。
“colmap作为其他框架的输入”
使用colmap开源框架,输入一组无序图像序列,能够得到图像相机信息,位姿关系以及对应的空间3D点的信息。
camera.txt:相机传感器信息,焦距信息以及主点位移信息。
images.txt:   图像的位姿信息(四元数表示以及位移向量)以及属于的相机ID,提取的图像中二维点坐标以及对应的三维点的ID,没有使用-1进行表示
points3d.txt: 对应的三维点坐标坐标,以及tracks的概念(在图像中的ID中第多少个点),即空间的一个3D点能够在多少视图中可见
(2)openmvg
除了增量式sfm的过程,还有全局式运动结构恢复的。在openmvg中集成。全局式的sfm的速度较快,但是精度比较差。是对所有视图进行BA优化。

1.1.6 mvs(多视角深度估计)
从运动结构恢复获得图像之间的位姿关系以及稀疏三维点云,接下来进行稠密点云的恢复。
主流的方式主要分为三种:基于体素、基于空间patch、基于深度图融合的三维重建
(1)基于体素的方法,将空间中分割为一个个的体素,然后利用光度一致性约束、几何约束可视性约束等条件,对体素进行标签划分。处于标签0和1之间的就是物体的
表面。基于体素的方法计算的精度需要设定分辨率的大小,可能实现的效果不太好。
(2)基于空间patch的方法:也是visualsfm中的pmvs采用的算法。大致的方法是使用一个小面片去扩充填满整个物体的表面。先对稀疏重建的三维点建立空间面片5*5的大小,给定初始深度以及法向量。然后将空间中三维点对应的图像二维点的坐标周围的点有没有对应的点,如果没有深度,将邻域像素点的深度值以及法向量进行复制。其中对三维点的深度值以及法向量进行优化的方法是非线性优化的方式,即将空间中的patch投影到相应的视图中,然后通过极几何的约束在另外的视图中进行光度一致性的约束,给出最优化函数。优化空间中三维点的法向量以及深度值。
(3)基于深度图融合方法
大致分为三个步骤:首先对参考图像进行邻域帧的选择。其次对参考图像进行深度值的恢复。 最后进行多视图的点云融合操作。比较有代表性的算法(深度值恢复):FW+TWA操作(局部,需要聚合)、全局(数据项+平滑项),SGM算法(半全局式优化方法,使用dp动态规划思想)PatchMatch Stereo算法(进行视图传播)
其中基于固定窗口的深度恢复是局部方法,首先进行基础矩阵的估计,使用极线约束进行立体匹配操作。找到不同视角下的同名像素点,使用光度一致性,或者SAD、SSD度量标准进行匹配。这里对每对匹配像素点构建代价体(给定视差范围,比如0~d)。构建出3d代价体后,会进行局部聚合操作,局部聚合操作是为了解决
视图中视差不一致问题,或者弱纹理问题。因为弱纹理反光等情况匹配效果不好。进行局部聚合后,会采用一种WTA操作,即赢者通吃的策略来找到每对匹配点对应的视差。再利用视差与深度之间的关系,就能获得匹配点对应空间三维点之间的深度值。
局部固定窗口立体匹配有一些问题:因为局部固定窗口假设窗口内的视差是一致的,那么当面对倾斜面、或者视差突变的情况以及重复问题的情况,匹配的情况就会失败。有两种解决方法:一个是局部聚合、一种是全局优化。全局的方法与局部不同的是,不会进行局部聚合操作,而是直接定义数据项与平滑项进行优化。
***********
光照不一致、反光、近距离拍摄时有遮挡(导致匹配失败)、弱纹理、重复表面
这些都是立体匹配的问题。
***********
局部聚合的过程:是将代价体中相同或者接近的视差进行聚合,通常的方法是调整窗口的位置以及形状、或者窗口内的像素点权重。局部聚合过后的代价体匹配错误会减少。
局部聚合可以参考的策略:空间距离(一般空间距离比较近的视差比较类似)、颜色距离(将图像进行预分割,得到每一块的视差是一致的)、空间距离以及颜色距离(距离近,颜色接近)[双边滤波思想,将窗口内不同距离颜色的像素点分配不同权重]
局部一致性LC,窗口内的某一点的视差值,其余像素点的视差值也是其潜在视差值,构建似然函数进行优化。
视差优化:全局的思想,优化每个像素的视差值,达到全局最优。有数据项以及平滑项。因为数据项中包含噪声等,直接进行优化的话会得到错误的视差值。使用到的方法:图割、置信度传播、合作优化以及半全局的优化方式,全局优化的方向处理速度很慢,大约1分钟。使用扫描线方向的进行dp动态规划只需要几秒。并且在边缘以及无纹理区域比较准确。
使用局部一致性作为视差后处理操作,能够提升全局视差优化的效果。
视差后处理:包括视差值的插值计算,因为视差值都是整数,需要进行插值来得到比较连续的浮点值。
视差滤波操作,也是对视差图进行滤波,可以使用中值滤波也可以使用双边滤波。
左右一致性检测,即LRC,将左右互相投影检查视差是否一致。
*************************************************************************************
深度图估计比较重要的两个方法:PatchMatch Stereo 算法以及加速的SGM算法。

这两种方法在openmvs中也有集成。前者最重要的是对视差的传播以及随机优化(源于LR局部一致性)。后者的速度是比较快的,属于半全局的方法,但是精度不高。
openmvs中集成了两种方法,都是在深度图估计中的立体匹配中使用到了两种算法。在openmvs中给出了scene类去接收colmap中的相机,图像,空间3d点信息。首先在函数中分为三大步骤:
首先,进行参考图像邻域帧选择。。。。。
在输入到openmvs之前,需要对图像进行预处理。因为是并行操作,所以需要创建相应的id号。然后对图像进行resize的操作。并且更新对应的内参数信息。然后进行参考图像邻域帧的选择,初始的邻域帧选择标准是根据tracks来的。tracks数量越多,那么就越有可能是邻域视角。再通过三角化角度,对应的尺度信息以及重叠区域大小选择出全局邻域帧。
全局邻域帧还要选择出局部邻域帧,是个马尔可夫场优化问题。根据参考图像与邻域帧的同名点之间的光度一致性以及可视性约束进行优化。
接着对参考图像进行初始深度的恢复,使用的方法是德劳内方法,将空间中的三维点映射回图像中形成面片。每个面片的深度是一样的。接着使用PatchMatch的方法进行视差图的计算。因为PM的方法能够模拟出更加精确的深度值(不同plane sweeping的方法,SGM使用的是平面扫描法),并且模拟出倾斜面的视差值。将视差与空间中的切平面的参数建立联系,因为切平面可能有无数个 ,所以构造约束函数进行约束。这个函数其实是最大似然估计问题,最小化某个量然后去优化其中的参数。建立的优化参数与图像邻域二维点及其周围点的距离颜色相关。那么就能够得到平面参数以及视差。

关键步骤:视差的传播,其实是局部一致性约束差不多,都是认为某点周围像素的视差可能是本像素点视差的潜在值。如果周围邻域像素的匹配代价小于当前点,则进行替换。
平面传播,以及后续的视角传播还有随机扰动。这个过程是从左上到右下,反过来。执行三次。
还要对深度图中的孤立像素点群进行删除(进行4邻域生长),以及孔洞的填补。
最后进行视差后处理:左右一致性检查,滤波
SGM的操作就不详细叙述。
因为有视差图就能进行三角化操作,恢复出空间中的3D点。之后就是点云融合操作。如果空间中的三维点有遮挡则进行删除。设置距离阈值,接近的三维点则进行平均处理。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值