三角化
路标点三角化
这里原理部分主要是参考多视图几何低十一章,结构计算,代码部分主要参考ORBSLAM中的实现
问题阐述
在已知两视图之间的变换关系-基本矩阵F,求解三维点X
假设测量点是\(\mathrm{x}\)和\(\mathrm{x}^{\prime}\),\(\mathbf{x} \leftrightarrow \mathbf{x}^{\prime}\),如果没有误差,那么存在一个三维点\(\mathbf{X}\)满足\(\mathbf{x}=\mathrm{P} \mathbf{X}, \mathbf{x}^{\prime}=\mathrm{P}^{\prime} \mathbf{X}\).其中P表示摄像机矩阵
定义\(\tau\)是对应点\(\mathbf{x} \leftrightarrow \mathbf{x}^{\prime}\)以及一对相机矩阵\(\mathrm{P}\)和\(\mathrm{P}^{\prime}\)来计算空间点\(\mathbf{X}\)的一种三角形法,有 \[ \mathbf{X}=\tau\left(\mathbf{x}, \mathbf{x}^{\prime}, \mathbf{P}, \mathbf{P}^{\prime}\right) \] 该三角形称为在变换H下是不变的,如果 \[ \tau\left(\mathbf{x}, \mathbf{x}^{\prime}, \mathbf{P}, \mathbf{P}^{\prime}\right)=\mathbf{H}^{-1} \tau\left(\mathbf{x}, \mathbf{x}^{\prime}, \mathrm{PH}^{-1}, \mathrm{P}^{\prime} \mathrm{H}^{-1}\right) \] 这也就是说,用了变换之后的相机矩阵也可以得到相同的三维空间点,也就是使用这种方法是XX变换不变的.
### 为什么用二维误差而不是三维
对于射影重构而言,在三维射影空间\(\mathbb{P}^{3}\)对误差进行最小化是不合适的.因为像距离和垂直等概念在射影几何下无效.如果使用这种三维空间下的误差来计算的话,这种方法并不是射影不变的
真正的射影不变的方法需要在二维上进行,估计一个三维点\(\hat{\mathrm{X}}\),其满足摄像机几何,所以他的投影便是 \[ \hat{\mathbf{x}}=\mathrm{P} \hat{\mathbf{X}} \quad \hat{\mathbf{x}}^{\prime}=\mathrm{P}^{\prime} \hat{\mathbf{X}} \] 这么做的目的就是,使用测量的\(\mathrm{x}\)和\(\mathrm{x}^{\prime}\),来估计\(\hat{\mathrm{X}}\)
在噪声的影响下,最大似然估计由最小化重投影误差--\(\hat{\mathrm{X}}\)的投影到图像测量点的距离得到
线性三角形法
线性三角形法就是一种DLT的方式,在每一幅图上都有测量\(\mathbf{x}=\mathrm{P} \mathbf{X}, \mathbf{x}^{\prime}=\mathrm{P}^{\prime} \mathbf{X}\),且这些方程可以组合成\(\mathrm{AX}=0\)的方式,其是关于\(\mathrm{X}\)的线性方程.
因为有\(\mathbf{x}=\mathrm{P} \mathbf{X}\),所以可以得到叉乘的形式,也就是\(\mathbf{x} \times(\mathrm{P} \mathbf{X})=\mathbf{0}\),展开可以得到 \[ \begin{aligned} x\left(\mathbf{p}^{3 \top} \mathbf{X}\right)-\left(\mathbf{p}^{1 \top} \mathbf{X}\right) &=0 \\ y\left(\mathbf{p}^{3 \top} \mathbf{X}\right)-\left(\mathbf{p}^{2 \top} \mathbf{X}\right) &=0 \\ x\left(\mathbf{p}^{2 \top} \mathbf{X}\right)-y\left(\mathbf{p}^{1 \top} \mathbf{X}\right) &=0 \end{aligned} \] 其中\(\mathbf{p}^{i \top}\)是相机矩阵\(\mathrm{P}\)的行,所以\(\mathrm{AX}=0\)方程使用两个点可以获得以下的A矩阵 \[ A=\left[\begin{array}{c} x \mathbf{p}^{3 \top}-\mathbf{p}^{1 \top} \\ y \mathbf{p}^{3 \top}-\mathbf{p}^{2 \top} \\ x^{\prime} \mathbf{p}^{\prime 3 T}-\mathbf{p}^{\prime 1 \top} \\ y^{\prime} \mathbf{p}^{\prime 3 \top}-\mathbf{p}^{\prime 2 \top} \end{array}\right] \] 也就是说,每一组像点可以获得4个方程,这是一个冗余的方程组,因此可以使用齐次的方式(DLT)来进行求解
### 齐次方程组的最小二乘解
考虑到方程\(\mathrm{AX}=0\),同时该方程方程数目大于未知量个数,因此是一个超定方程组,如果x是方程组一个解,那么kx这些也是属于方程的解,也就是存在解空间.具体解法如下
目标
给定一个行数不少于列数的矩阵A,求最小化\(\|\mathrm{Ax}\|\)并满足\(\|\mathrm{x}\|=1\)的x
解法
\(\mathrm{x}\)是\(\mathrm{V}\)的最后一列,其中\(A=U D V^{\top}\)是\(A\)的SVD分解
ORBSLAM中的实现
ORBSLAM中关于三角化点的构造在Initializer中,
其实现和之前原理中的是一模一样的
1 | /** 给定投影矩阵P1,P2和图像上的匹配特征点点kp1,kp2,从而计算三维点坐标 |