相机位姿估计是指给定若干图像,估计其中相机运动的问题。求解方法通常分特征点法和直接法两种。下面主要介绍特征点法。
特征点法的思路是先从图像当中提取许多特征,然后在图像间进行特征匹配,这样就得到许多匹配好的点,再根据这些点进行相机位姿的求解。根据传感器形式的不同,可以分成三种情况:
- 2D-2D,单目相机获取的影像,只能获得像素坐标
- 3D-3D配对点,RGBD或双目相机,可以获取深度信息
- 3D-2D,已知一张图中的3D信息,另一张图只有2D信息
问题分析
在两帧各自的相机坐标系中,设P点的相机坐标系的坐标分别为P1、P2,如图1所示。
其中:
P1=(X1 Y1 Z1),P2=(X2 Y2 Z2)
相机从第一帧移动到第二帧,其旋转矩阵设为R,平移向量设为t。这里的R表示的旋转是相对于第一帧的姿态改变量。那么有:
P2=RP1+t
相机位姿估计的最终目的就是要根据这个运动方程,求解出相机的运动,也就是R、t。注意这里的R、t并不是相机外参!
由于P1、P2的坐标未知,但其在像素坐标系的坐标p1、p2已知,因此,根据小孔成像模型寻找p1、p2和P1、P2之间的关系。
小孔成像模型
小孔成像模型的示意图如图2所示。设P点在世界坐标系下坐标为Pw在相机坐标系下坐标为Pc,物理成像平面对应坐标为 P′, 像素平面对应坐标为p, 有:
p=(u v),P‘=(X‘ Y‘ Z‘),Pc=(Xc Yc Zc),Pw=(Xw Yw Zw)
根据小孔成像模型,有如下公式:
(u v 1)=1Zc(fx0cx 0fycy 001)(Xc Yc Zc)
该公式给出了点P相机坐标系下坐标与像素平面坐标之间的关系。
2D-2D估计
设相机内参矩阵为K,即
K=(fx0cx 0fycy 001)
将公式(2)代入公式(1),则
K−1Z2p2=RK−1Z1p1+t
内参矩阵K短期内不变,但Z1很明显一般情况下不等于Z2,除非是相机绕着P点为圆心旋转。现在已知的是K、p1、p2,待求R,t。 然而这里还有Z1、Z2是未知的,因此必须想办法将Z消去。
将相机坐标系下坐标Pc归一化,即
P‘c=(Xc/Zc Yc/Zc 1)
由公式(2)可得:
(u v 1)=(fx0cx 0fycy 001)(Xc/Zc Yc/Zc 1)=K(Xc/Zc Yc/Zc 1)
将公式(4)代入公式(1),则有:
K−1p2=RK−1p1+t
这样便能求解了。但是也导致了一个问题,因为不同帧对应的相机坐标系中P的Z值并不相等。在实际操作中分别除以其本身从而将Z分量归一化为1,这其实就丢失了真实的位置信息,不同帧的缩放是不等的!从而导致2D-2D估计两两帧之间,每次估计的尺度都是不同的。这也就是单目SLAM的尺度不确定性。
通过2D-2D,最终可获得P点像素坐标 p 对应相机坐标系下归一化坐标P‘c。
三角测量
三角测量在三角学与几何学上是一借由测量目标点与固定基准线的已知端点的角度,测量目标距离的方法。而不是直接测量特定位置的距离(三边量测法)。当已知一个边长及两个观测角度时,观测目标点可以被标定为一个三角形的第三个点。
基于两固定角度之距离量测
假设一量测目标点及两个已知座标的参考点可形成一个三角形,则借由计算三角形其中参考边的长度,量测两参考点与目标点形成的角度,即可找出目标点的距离及座标。
三角测量可用来计算岸边与船只之间的距离及座标。A顶点的观察者测量岸边与船只之间的角度α,B点的观察者则依同理测量出角度β,由长度l或已知的A及B点座标,则可由正弦定理取得在C点船只的座标及距离d。
计算过程如下:
ℓ=dtanα+dtanβ
根据三角恒等式tanα=sinαcosα和sin(α+β)=sinαcosβ+cosαsinβ,此式可等于:
ℓ=d(cosαsinα+cosβsinβ)
ℓ=d sin(α+β)sinαsinβ
因此,
d=ℓ sinαsinβsin(α+β)
由此便可简单定义出一未知点与观察点间的距离,以及与观察点往东西、南北向相差的位移量,终得完整座标。
2D-2D估计获得特征点在相机坐标系下的归一化3D坐标,结合三角测量,可获得特征点在相机坐标系下的深度,两者结合即获得特征点在相机坐标系下的3D坐标。
3D-2D估计
3D-2D估计本质是PnP一个问题,即给定世界坐标系中n个3D点及其在图像中的相应2D投影的情况下,估计校准相机的姿势的问题。相机姿势由6个自由度(DOF)组成,其由旋转(滚动,俯仰和偏航)以及相机相对于世界的3D平移构成。该问题源于相机校准,并且在计算机视觉和其他领域中具有许多应用,包括3D姿态估计、机器人和增强现实。 对于n = 3,存在一个常用的问题解决方案,称为P3P,并且许多解决方案适用于n≥3的一般情况。
P3P
P3P仅需要使用三对匹配点,就可以完成相机的位姿估计。
假设空间中有A,B,C三点,投影到成像平面中有a,b,c三点,在PnP问题中,A,B,C在世界坐标系下的坐标是已知的,但是在相机坐标系下的坐标是未知的。a,b,c的坐标是已知的。PnP的目的就是要求解A,B,C在相机坐标系下的坐标值。如下图所示。需要注意的是三角形abc和三角形ABC不一定是平行的。
根据余弦定理有:
OA2+OB2−2OA⋅OB⋅cos(a,b)=AB2 OB2+OC2−2OB⋅OC⋅cos(b,c)=BC2 OA2+OC2−2OA⋅OC⋅cos(a,c)=AC2
记x=OAOC,y=OBOC,因为A,B,C在相机坐标系中的坐标未知,因此x,y是未知的。
另记u=BC2AB2,w=ACAB, 根据A,B,C的世界坐标,u,w是可以求出的。
通过一系列的转化可以得到两个等式:
(1−u)y2−ux2−cos(b,c)y+2uxycos(a,b)+1=0 (1−w)x2−wy2−cos(a,c)x+2wxycos(a,b)+1=0
该方程组是关于x,y的一个二元二次方程,可以通过吴消元法求解。最多可能得到四个解,因此在三个点之外还需要一组匹配点进行验证。
至此,通过x和y就可以求得A,B,C在相机坐标下的坐标值。因此3D-2D问题转变成了3D-3D的位姿估计问题。而带有匹配信息的3D-3D位姿求解非常容易。
Bundle Adjustment
假设某空间点坐标为Pi=[Xi,Yi,Zi], 其投影的像素坐标为pi=[ui,vi]。这些在PnP问题里都是已知的。在相机坐标系下有c=[xi,yi,zi],这个坐标通过P3P或者其他解法有了粗略的估计。根据针孔相机模型可得:
zipi=KTPi=Kexp([ξ]×)Pi
根据这个等式可以构造出一个最小二乘问题:
$$\xi^* = \arg \min \limits {\xi} \dfrac{1}{2} \sum\limits _{i=1} ^n \begin{Vmatrix} p_i - \dfrac{1}{z_i} K \exp([\xi]{\times})P_i \end{Vmatrix} _2 ^2$$
该问题的误差项,是将像素坐标与3D点按照当前估计的位姿进行投影得到的位置相比较得到的误差,所以称之为重投影误差。如图5所示。
这个最小二乘问题主要优化两个变量,第一是对相机位姿的优化,也就是对李代数的优化,第二是对空间点P的优化,也就是P点的优化。
3D-3D估计
3D-3D的位姿估计问题是指,对于空间中的某一点,我们知道这个点在两个相机坐标系中的三维坐标,如何利用这两个三维坐标来求解这两个相机坐标系的运动就是3D-3D的位姿评估问题。这个问题通常用迭代最近点(Iterative Closest Point,ICP)求解。
假设空间中的一系列点在第一个相机坐标系下的三维坐标为C=c1,…,cn,在第二个相机坐标系下匹配的三维坐标为C′=c′1,…,c′n。则有:
∀i, ci=Rc′i+t
对于ICP的求解主要分为两种方式:利用线性代数的求解和利用非线性优化方式求解。
线性代数求解
构造误差项:
ei=ci−(Rc′i+t)
将这个误差项构造成一个最小二乘问题:
minR,tJ=12n∑i=1‖ci−(Rc′i+t)‖22
通过求解这个最小二乘问题,我们可以得到R和t。
总结
相机位姿估计最终目标是获得表征相机运动的旋转矩阵R和平移向量t,可分成两种方法:一种是2D-2D估计加三角测量,另一种是3D-2D估计加3D-3D估计。
参考链接
- SLAM相机位姿估计(1),by zhaoxuhui.
- 2D-2D相机位姿估计,by 金戈大王.
- 单目相机中的对极几何,by 一索哥传奇.
- 三角测量,by 金戈大王.
- 三角测量,by wikipedia.
- 单目相机中的三角化测量,by 一索哥传奇.
- 3D-2D相机位姿估计,by 金戈大王.
- 3D-3D相机位姿估计,by 金戈大王.
- 相机位姿求解问题?, by zhihu.
- 3D-2D的运动估计,by 一索哥传奇.
- 3D-3D的运动估计,by 一索哥传奇.
- 相机位姿求解——P3P问题,by 达达MFZ.
- 图像二维坐标转世界三维坐标,by 橙子.