三角化
当估计出相机运动之后, 需要利用相机运动估计出特征点的空间位置,三角测量(三角化)就是用来解决这个问题的。三角化主要是单目mono使用
问题描述:
现在假设有两帧图像,其中两帧图像(Frame1,Frame2)的特征点匹配已有,相机的相对运动T_{21}(从第一帧到第二帧的变换)也已经获得,如何求解出某个特征点的空间坐标(以第一帧的相机坐标系为参考)?
假设:
- 在第一帧坐标系下的某个路标点\(P\in R^4\),(下式右侧)
- 已知相机的位姿\(T_k=[R_k,t_k]\),也就是第一帧坐标系转换到第二帧坐标系的变换矩阵\(T_{21}\)或者说是\(T_{CW}\)(如果第一帧是初始化帧的话)。
- 利用相机的相对运动\(T_{21}\)(从第一帧到第二帧的变换)将路标点\(P\)投影到第二帧相机坐标系下,得到预测点的归一化平面坐标为\(p_2=x_k=[u_k,v_k,1]^T\)(下式左侧)
即: \[ \frac{1}{\lambda_k}x_k= \frac{1}{\lambda_k} \begin{bmatrix} u_k \\ v_k \\ 1 \end{bmatrix}_{1:3} =\bigg\{ T_k \begin{bmatrix} p_x \\ p_y \\ p_z \\ 1 \end{bmatrix}\bigg\}_{1:3} = \bigg\{ \begin{bmatrix} R_{k,3\times 3} & t_k \\ 0 & I \end{bmatrix} \begin{bmatrix} p_x \\ p_y \\ p_z \\ 1 \end{bmatrix} \bigg\}_{1:3} \] 其中,\(\lambda_k\)是逆深度,也就是\(\frac{1}{z_k}\)
问题是:如何求解上式右侧的第一帧坐标系下的某个路标点\(P\) ?
根据上式子的第三行,可以得到 \[ \frac{1}{\lambda_k}=T_{k,3}^T P= \begin{bmatrix} R_{k,3} & t_{k,3} \end{bmatrix}_{1\times4} \begin{bmatrix} p_x \\ p_y \\ p_z \\ 1 \end{bmatrix} \] 将(1)的前两行中的逆深度\(\frac{1}{\lambda_k}\)用上式等号右侧替换,得到 \[ T_{k,3}^T P u_k = T_{k,1}^T P \\ T_{k,3}^T P v_k = T_{k,2}^T P \] 于是,一帧就可以得到两个这样的方程,当有两帧或以上时,则:
\[ \begin{bmatrix} T_{1,3}^T u_1 - T_{1,1} \\ T_{1,3}^T v_1 - T_{1,2} \\ \vdots \\ T_{n,3}^T u_1 - T_{n,1} \\ T_{n,3}^T v_1 - T_{n,2} \\ \end{bmatrix} y = 0 \Longrightarrow Dy=0 \]
于是,把问题转化为求线性方程组的问题。
当观测次数>=2时,即有多帧观测到同一个路标点\(P\),且这些帧对应的相机位姿已经知道的时候,由于各种测量噪声的影响,(投影回去的点并不是同一点),方程组的系数矩阵D很有可能满秩,(齐次线性方程组有唯一解),那么这个方程组就只有零解
于是,通常使用SVD分解来求这个方程组的最小二乘解 \[ \min_y || Dy ||_2^2 \] 其中, \[ ||y||=1 \] 求解方法:对\(D^TD\)进行SVD分解,得到 \[ \begin{aligned} D^TD &=U \Sigma V^T = \sum_{i=1}^{4} \sigma_{i}^2 u_i u_j^T \notag \\ &= \begin{bmatrix} u_{1,4 \times 1} & u_{2} & u_{3} & u_{4} \end{bmatrix}_{4 \times 4} \begin{bmatrix} \sigma_1^2 & 0 & 0 &0 \\ 0 & \sigma_2^2 & 0 & 0 \\ 0 & 0 & \sigma_3^2 & 0 \\ 0 & 0 & 0 & \sigma_4^2 \end{bmatrix} \begin{bmatrix} u_{1,4 \times 1}^T \\ u_{2}^T \\ u_{3}^T \\ u_{4}^T \end{bmatrix}_{4 \times 4} \end{aligned} \] 其中,\(u_1,u_2,u_3,u_4\)都是SVD分解产生的相互正交的单位向量,\(y\)也是单位向量
现在,回到要求解的问题上,即最小化目标函数: \[ \min_y ||Dy||_2^2=(Dy)^T(Dy)=y^TD^TDy \] \(y\)可以有\(D^TD\)分解之后的空间向量\(u_i\)经过线性组合得到,即 \[ y=\sum_{i}^4 k_i u_i= u_m+v \] 其中,\(u_m\)为任意的\(D^TD\)分解之后的空间向量\(u_i\),另外\(v\)与\(u_m\)相互正交,即有: \[ v=\sum_{j,j\neq u}^4 k_j u_j \] 假设\(u_m=u_4\),将\(y\)代入目标函数,得到 \[ \begin{aligned} \min_y ||Dy||_2^2 &=y^TD^TDy=(u_m+v)^T D^TD(u_m+v) \notag \\ &= [u_m+v]^T_{1 \times 4} ~ \begin{bmatrix} u_{1} & u_{2} & u_{3} & u_{4} \end{bmatrix}_{4 \times 4} \begin{bmatrix} \sigma_1^2 & 0 & 0 &0 \\ 0 & \sigma_2^2 & 0 & 0 \\ 0 & 0 & \sigma_3^2 & 0 \\ 0 & 0 & 0 & \sigma_4^2 \end{bmatrix} \begin{bmatrix} u_{1}^T \\ u_{2}^T \\ u_{3}^T \\ u_{4}^T \end{bmatrix}_{4 \times 4} [u_m+v]_{4 \times 1} \notag \\ &= \begin{bmatrix} v^Tu_1 & v^Tu_2 & v^Tu_3 & u_4^T u_4 \end{bmatrix} \begin{bmatrix} \sigma_1^2 & 0 & 0 &0 \\ 0 & \sigma_2^2 & 0 & 0 \\ 0 & 0 & \sigma_3^2 & 0 \\ 0 & 0 & 0 & \sigma_4^2 \end{bmatrix} \begin{bmatrix} u_1^Tv \\ u_2^Tv \\ u_3^Tv \\ u_4^Tu_4 \end{bmatrix} \notag \\ &= \sigma_1^2v^Tu_1u_1^Tv+ \sigma_2^2v^Tu_2u_2^Tv+ \sigma_3^2v^Tu_3u_3^Tv+ \sigma_4^2u_4^Tu_4u_4^Tu_4 \notag \\ &= (\sigma_1^2+\sigma_2^2+\sigma_3^2)v^Tv+\sigma_4^2 \end{aligned} \] 同理,当\(u_m=u_1\)时 \[ y^TD^TDy=(\sigma_4^2+\sigma_2^2+\sigma_3^2)v^Tv+\sigma_1^2 \] 当\(u_m=u_2\)时 \[ y^TD^TDy=(\sigma_1^2+\sigma_4^2+\sigma_3^2)v^Tv+\sigma_2^2 \] 当\(u_m=u_3\)时 \[ y^TD^TDy=(\sigma_1^2+\sigma_2^2+\sigma_4^2)v^Tv+\sigma_3^2 \]
当且仅当\(u_m=u_4\)且\(v=0\)时,目标函数\(y^TD^TDy\)取最小值\(\sigma_4^2\)
综上,当\(y\)等于奇异值向量\(u_4\)时,为最小二乘解。
- 另外,\(y\)是单位向量,需要进行scale把z值恢复到相机坐标系z=1的归一化平面,此时即可得到对应的坐标P
- 或者, 如果需要恢复完整的点P而不是归一化到z=1平面上的点, 那么可以进行scale, 对\(y\)向量的齐次化维, 即第4维进行归一化, 即可得到真正的点P
\[ P= \frac{y_{1:4}}{y[4]} = \begin{bmatrix} y_1/y_4 \\ y_2/y_4 \\ y_3/y_4 \\ y_4/y_4 \end{bmatrix} = \begin{bmatrix} P_x \\ P_y \\ P_z \\ 1 \end{bmatrix} \]
相关代码
代码之前, 有一些细节需要注意:
- 结论: \(\color{red}{t_{cw} \neq -t_{wc}}\) , 之间还差了一个旋转变换
- 若已知从相机坐标系到世界坐标系的变换\(T_{wc}=[R_{wc},t_{wc}]\) 则有相机坐标系的点转换到世界坐标系的转换\(P_{w}=R_{wc}P_c + t_{wc}\)
- 那么从世界坐标系到相机坐标系的变换\(T_{cw}=[R_{cw} , t_{cw}]=[R_{wc}^T,-R_{wc}^T t_{wc}]\) , 原因是, 根据上面"相机坐标系到世界坐标系的转换 ", 反推出世界坐标系到相机坐标系的转换 \(P_{c}=R_{wc}^{-1}( P_w - t_{wc})=R_{cw}( P_w - t_{wc})\)
1 | // |