目录
(1)从2D tracks做SFM(用刚体分解封闭形式解做粗解)
(2)使用BA对SFM进行Refine(用非线性优化方法做精细解)
九、Structure from Motion
1、三角测量与相机姿态
首先考虑这样一个问题:假定我们已知相机之间的姿态、图像中二维点坐标。那么我们怎样重建出三维点的位置呢?根据我们上一讲的知识已经知道,我们可以通过三角测量的原理:可以得到三维坐标的值。
而反过来,如果我们知道三维空间点的位置以及它们投影到图像平面点的位置,内参已知(在实际应用中通常已知)、那么怎样求出相机投影矩阵呢?
我们把方程列出来不就行了?
很显然一个点提供两个方程,而姿态矩阵中有12个未知参数,如果像第四讲那样用6个点解出来,那么实际上是有问题的。因为在第四讲中,相机内参是未知的,而这里通常是已经标定好的相机。所以在这里用6个点求出的解(这就是DLT算法:Direct Linear Transform),并不满足要求,因为在中,旋转矩阵只有三个未知数。所以经过6个点求出来的结果,对左边的3×3矩阵用QR分解,求出最接近的旋转矩阵。偏移向量就不用改变。
2、Structure from Motion
那么我们有没有一次性估计三维空间点和相机姿态的方法?
当然有,这就是Structure from Motion方法(在机器人领域通常叫做SLAM,它们其实是一回事)。而在只有二维对应点已知,相机姿态和三维空间点未知均未知的情况,对于上一小节的问题来说是一个鸡生蛋蛋生鸡的问题,但是很幸运,这个问题可解。
SFM的一个前提是三维形状是刚体的,刚体的意思是在每一张图像中,它的形状都不会改变
SFM已知条件:一个单目拍摄视频或者一系列图像
需要求:同时重建出三维形状和相机姿态
Structure From Motion 的管线
我们在本文中,主要对最后的两个阶段:粗解和精细解进行介绍
(1)从2D tracks做SFM(用刚体分解封闭形式解做粗解)
考虑一下,我们有个三维点,投影到张图像中。那么根据相机投影那一章的介绍,建立三维空间点和二维图像点之间的投影关系。而我们目前只介绍了不同相机的透视投影,并没有介绍正交投影,但是在这里我们也考虑正交投影的情况。
对于透视投影建立二维平面观测点和三维空间点以及相机矩阵的关系:
其中
表示第1张图像中的个二维观测点坐标,在这里用的是二维坐标的齐次表示。
对于正交投影:
对于正交投影,我们这里不使用齐次坐标的表示。
不管是正交投影还是透视投影,目标都是从一个单目视频中的2D点当中推测出运动因子(),还要推测出三维点坐标。
我们从正交投影进行分析:下面的分析和透视投影无关, 上面的矩阵式可以写成下面:
因为是一个2N×3的矩阵,是一个3×M的矩阵。因为 rank(AB)<= min(rank(A), rank(B)),且在这里矩阵的列均独立,所以矩阵的秩为3。但是观测矩阵经常含有噪声,因此它的秩很可能小于3,所以实际上要对它进行强制约束秩为3。对观测矩阵进行SVD分解:
我们令
就是我们要找的解,但是要注意,这里的的存在说明了歧义性的问题,而这个矩阵为单位矩阵时就是一种特殊情况。当然这里的必须要可逆。
上面的一小段分析都是针对正交投影的,如果是透视投影呢?
- 先假定一个正交相机,求得参数后,然后再迭代地进行逼近到透视投影下的解
- 同样的对观测矩阵进行SVD分解,并让它的秩强行约束到4就行了,方法和上面SVD分解一模一样。
Missing Tracks的问题:在很多时候,我们对三维空间中的M个点,不能呈现在所有N张图像中(因为相机姿态改变引起的遮挡等原因)。用一个形象的例子,比如下面的例子:
解决的方法:
- 使用矩阵填充(也叫矩阵恢复)算法对观测矩阵进行恢复,然后再使用上面的SVD分解方法进行求解
- 不对矩阵进行填充,使用非线性优化算法,进行迭代地预测相机、三维坐标、缺失观测点。
(2)使用BA对SFM进行Refine(用非线性优化方法做精细解)
因为观测矩阵中存在噪声,所以上述投影方程很难精确的满足。所以这里我们考虑取求以便让三维投影到图像平面的点和实际观测点尽可能接近。这就是BA(捆集调整法的来源)
而BA的数学思想是最小化如下的重投影误差:
其中是针对每一张图像进行估计,对每一个二维观测点估计它的三维位置。这个方法之所以叫捆集调整法Bundle Adjustment,因为它对相机之间的射线捆和三维点进行调整。它通常作为重建算法的最终步骤。
它的好处是:
- 可以处理Missing Tracks问题
- 对观测噪声鲁棒
- 其它先验约束可以很方便加进来
它的不足是:
- 它是一个非凸问题,需要一个很好的初始化解
- 很容易因为数据的增加,变成一个大规模的最小化问题
通常情况下,我们使用Levenberg-Marquardt方法用来最小化上述的最小化重投影误差问题。很显然需要计算损失函数相对于待求参数的微分,即雅可比矩阵Jacobian matrix。
减少计算复杂度的方法:
- 把所有数据分成小的集合,对每个小的集合分别进行BA,然后进行融合
- 对进行分步迭代计算
- 对雅可比矩阵的计算很复杂,可以使用一个二值化模式(Binary Pattern)进行逼近
先验知识引入:
对于一段视频使用SFM方法重建出刚体最直观的先验是temporal smoothness(时间平滑)。由于物体是刚体的,很显然只对于运动信息进行先验约束。当然对于搜集的图片肯定不能使用这种先验。下面第二项是新加入的先验项,它希望相邻两帧的运动信息不会有剧烈变化,这种约束是非常合理有用的。