slam 系列—三维重建和极几何

527 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

对极几何和三维重建基础

在没有一些先验知识前提下,很难用一张图像来恢复 3 维世界的整个结构,这是由于在从 3维到 2维投影过程中丢失了一些信息。

三角化

triangulation.png

P=xl×xrP = x_l \times x_r

两条直线叉乘得到点就是两条射线的交点,如何理解这件事呢? 我们知道两个向量叉乘得到一个向量是垂直于 xlx_lxrx_r 所在平面的,所以 xlTP=0x_l^TP = 0 而且 xrTP=0x_r^TP = 0 也就是 P 点即在 xrx_r 这条直线上,又在 xlx_l 这条直线上。所以 PP 是两条射线的角点。

需要在同一个坐标系下,两条直线叉乘才有意义。这个过程叫做三角化。

在实际情况由于噪声存在,两条直线很难相交。

  • 线性解法
  • 非线性解法

线性解法

{pl=MlP=Kl[I0]Ppr=MrP=Kr[RT]P\begin{cases} p_l =M_lP = K_l\begin{bmatrix} I & 0 \end{bmatrix} P\\ p_r = M_rP = K_r \begin{bmatrix} R & T \end{bmatrix}P \end{cases}
ul=ml,1Pml,3Pvl=ml,2Pml,3Pur=mr,1Pmr,3Pvr=mr,2Pmr,3Pu_l = \frac{m_{l,1}P}{m_{l,3}P}\\ v_l = \frac{m_{l,2}P}{m_{l,3}P}\\ u_r = \frac{m_{r,1}P}{m_{r,3}P}\\ v_r = \frac{m_{r,2}P}{m_{r,3}P}
AP=0AP = 0
ml,1Pul(ml,3P)=0ml,2Pvl(ml,3P)=0mr,1Pur(mr,3P)=0mr,2Pvr(mr,3P)=0m_{l,1}P - u_l (m_{l,3}P) = 0\\ m_{l,2}P - v_l (m_{l,3}P) = 0\\ m_{r,1}P - u_r (m_{r,3}P) = 0\\ m_{r,2}P - v_r (m_{r,3}P) = 0\\
最小二乘解

对于 A 矩阵进行奇异值分解,A=UDVTA = UDV^T拿到 V 矩阵的最后一列作为 P

非线性解

定义一个能量函数 d(pl,MlP)+d(pr,MrP)d(p_l,M_lP) + d(p_r,M_rP)

不过以上都是理想情况,通常许多参数我们是不知道的

  • 例如我们知道 plp_lprp_r 在像平面的坐标,并且已知摄像机的内参 KlK_lKrK_r 去求解摄像机间的变换矩阵 R,TR,T 以及三维点 P 的坐标
  • 或者只知道prp_rplp_l 在像平面的坐标

多视图几何

  • 估计摄像机的内、外参数,也就是摄像机标定
  • 研究同一场景下 P 点在一个图像中点 plp_l 与另个一图像中 prp_r对应关系

对极几何

  • 对极几何
  • 本质矩阵
  • 基础矩阵

对极几何

描述在两个视点像平面中对应点 plp_lprp_r 之间的关系,两个视点图像间的几何关系。

triangulation.png

接下来介绍几个概念

  • 极平面
  • 基线
  • 极线
  • 极点

一些性质

  • 极平面相交于基线
  • 因为极平面在右侧平面上投影为极线 er,ure_r,u_r 的连线,所以 ulu_l 在极平面上,所以一定落在 uru_rere_r 这条极线上,这是对于成像点的一个约束,全图搜索问题在极线上进行搜索

平行视图

epipolar_geometry_epipolar_plane.png

  • 两个图像平面平行
  • 基线平行于图像平面,极点 ele_l ere_r 位于无穷远处
  • 极线平行于图像坐标系的 uu

解决问题一般思路

epipolar_geometry_epipoles.png

  • P 为场景中一个 3 维点
  • OlO_lOrO_r 为两个观测场景的视点(摄像机位置)
  • u^l\hat{u}_lv^l\hat{v}_lu^r\hat{u}_rv^r\hat{v}_r 构成两个视平面
  • ulu_luru_rPP 在两个不同视点的像平面上位置
  • t,Rt,R 为两个摄像机中心相对位置的变换矩阵

极点

epipolar_geometry_epipoles_002.png 这里 ele_lere_r 分别为 OlO_lOrO_r 在右侧像平面和左侧像平面上的点。

极平面

也就是右两个摄像机中心点 OlO_lOrO_r和场景点 PP 围成的平面为极平面

本质矩阵

本质矩阵对规范化规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述。

K=[100010001]K = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}
p=[xyz]=[100001000010][xyz1]p^{\prime} = \begin{bmatrix} x\\ y \\ z \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0\\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}

规范化摄像机好处就是在像素平面内的 pp^{\prime} 的齐次坐标就可以看做 p 点在 3维坐标系下坐标,也就是 (u,v,1)(u,v,1)

那么 prp_rOrO_r 坐标系下,也就是 (ur,vr,l)(u_r,v_r,l)

pr=Rpr+Tpr=RT(prT)p_r = Rp_r^{\prime} + T\\ p_r^{\prime} = R^T(p_r - T)

那么从而了解到 prp_rOlO_l 下坐标为 RTprRTTR^Tp_r - R^TT

  • prp_rOlO_l 坐标系为 RTprRTTR^Tp_r - R^TT
  • OrO_rOlO_l 坐标系坐标 RTT-R^TT

OrOlO_rO_lprO1p_rO_1 这两个向量叉乘得到一个垂直于极平面的向量

RTT×(RTprRTT)RTT×RTprRTT×RTT-R^TT \times (R^Tp_r - R^TT)\\ R^TT \times R^Tp_r - R^TT \times R^TT\\
RT[T×]RTprR^T[T \times]R^Tp_r

首先我们来这个负号为什么没有了? 这是因为如果 OrOlO_rO_lOlOrO_lO_r 效果一样,这里负号只代表方向,而且向量和自己进行叉乘得到向量是一个 0 向量

[0azayaz0axayax0]\begin{bmatrix} 0 & -a_z & a_y\\ a_z & 0 & -a_x\\ -a_y & a_x & 0\\ \end{bmatrix}
from numpy.linalg import matrix_rank
import numpy as np
ax = 1
ay = 3
az = 2

a = np.array([
    [0,-az,ay],
    [az,0,-ax],
    [-ay,ax,0]
])

print(matrix_rank(a))

将向量 TT 经过一个旋转 RTR^T 然后再去和一个向量 prp_r 经过一个旋转变换 RTR^T

[RT(T×pr)]Tp(T×pr)TRpprT[T×]TRp\left[R^T(T \times p_r)\right]^Tp\\ (T \times p_r)^TRp\\ p_r^T[T_{\times}]^TRp\\
prT[T×]Rp=0prT[T×]Rp=0-p_r^T[T_{\times}]Rp = 0\\ p_r^T[T_{\times}]Rp = 0\\
E=[T×]R=T×RE = [T_{\times}]R = T \times R
  • plp_l 对应的极线是 xr(xr=Epl)x_r(x_r = Ep_l) 这是因为 prTEpl=0p_r^T E p_l = 0 那么也就是 prTxr=0p_r^T x_r = 0 所以 xr=Eplx_r = Ep_l
  • prp_r 对应的极线 xl=ETprx_l = E^Tp_r
  • Eel=0Ee_l = 0erTE=0e_r^T E = 0
xrTpr=0(Epl)Tpr=0(Epl)Ter=0plTETer=0x_r^Tp_r = 0\\ (Ep_l)^Tp_r = 0\\ (Ep_l)^Te_r = 0\\ p_l^TE^Te_r = 0

E 是奇异的(秩为 2 ) 5 个自由度(3旋转,3平移 - 1 一个自由度)

基础矩阵

8 点法(8-point algorithm)

已知条件是给定一个匹配点 {xi,xi}\{x_i,x_i^{\prime}\} 问题是要估计基础矩阵(Fundamental Matrix) F\bold{F}

假设这里有 M 对个点,两两匹配

{xm,xm}  m{1,,M}\{ x_m,x_m^{\prime} \} \; m \in \{1,\dots,M\}
xmTFxm=0{x_m^{\prime}}^T\bold{F}x_m=0
pr=R(plT)p_r = R(p_l - T)

我们来假设将世界坐标系设置在第 1 个摄像机的坐标系上,那么对于第二个摄像机坐标系原点 OrO_r 就是先经过一个旋转 R 然后再经过一个平移来到

S=[]S = \begin{bmatrix} \end{bmatrix}

数据归一化

将选取点进行归一化处理,也就是将这些点平移到远点,然后在进行一定缩放来保证这些点在一定范围内

  • 这些点的中心位于原点
  • 各个点到原点的均方根距离等于 2\sqrt{2}