本文旨在明晰本质矩阵与基本矩阵的概念,以及具体的计算方法。
预备知识:
- 对极几何,可以参考
多视图几何
相关书籍。 - 平面表示方式: 给定平面过一点
a
a
a以及平面上的任一点
x
x
x,以及其法向量
n
n
n,平面可以写成
( x − a ) n = 0 (x-a){n}=0 (x−a)n=0 - 叉乘与反对称矩阵的关系,下式中,
A
A
A代表向量
a
a
a对应的反对称矩阵:
a × b = A b a \times b = Ab a×b=Ab
一. 本质矩阵
Essential Matrix
-
几何解释:多视图系统中,用于描述不同相机之间位姿关系 (外参) 的矩阵. 当图像投影到归一化平面之后,用E矩阵表达对极约束。
-
定义:
现以左相机坐标系为参考坐标,其中有一点 P l P_l Pl,右相机相对于左相机的位姿关系为 [ R , T ] [R, T] [R,T],并且 P l P_l Pl点在右相机坐标系中的表示为 P r P_r Pr(从世界坐标系来看,表示的同一点).根据坐标系的变换关系,可以找到右相机坐标系中的点
P r = R ( P l − T ) P_r=R(P_l-T) Pr=R(Pl−T)
此时,考虑到对极平面过 P l P_l Pl与右相机中心 T T T, 有这两个向量(点用向量表示出来),求出平面的法向量
n = P l × T n=P_l\times T n=Pl×T
将 P l P_l Pl与 T T T带入平面方程,由此可以构建平面:
( P l − T ) T ( T × P l ) = 0 (P_l-T)^{T}(T \times P_l)=0 (Pl−T)T(T×Pl)=0
从上面的式子,看到了 ( P l − T ) (P_l - T) (Pl−T)的结构,为了关联 P l P_l Pl与 P r P_r Pr,我们用 P l P_l Pl表示出 P r P_r Pr, 将叉乘表示为反对称矩阵S,并代入上式:
( R − 1 P r ) T S P l = 0 (R^{-1}P_r)^{T} SP_l = 0 (R−1Pr)TSPl=0
注意旋转矩阵R的转置与逆相等,稍加整理:
P r T R S P l = 0 P_r^{T} RS P_l = 0 PrTRSPl=0
此时,我们用令矩阵 E = R S E = RS E=RS,也就得到了
P r T E P l = 0 P_r^{T} E P_l=0 PrTEPl=0
当然了,如果我们想对应到图像平面(归一化平面),只需要找到图像平面上的坐标与世界坐标的关系 p l = P l f l / Z l p_l={P_l f_l /Z_l} pl=Plfl/Zl, p r = P r f r / Z r p_r=P_r f_r / Z_r pr=Prfr/Zr ,带入上式,即可得
p r T E p l = 0 p_r^{T} E p_l=0 prTEpl=0
到此,我们就很清楚基本矩阵的来源了。 -
本质矩阵的性质
有5个参数,3个决定旋转,2个决定平移(无法确定尺度)
秩为2,行列式为0
两个非零奇异值是相等的,因为其中的反对称矩阵与旋转矩阵 -
具体计算
根据上面的理论知识,我们知道基本矩阵描述的是两个相机坐标系下点的几何约束关系. 分别可以用3D坐标系下的 P i P_i Pi和归一化平面上的点 p i p_i pi表示.
实际求解时,我们会根据相机内参以及匹配好的特征点找到归一化平面上的对应点 p p p, 并由多对匹配点构造线性方程组进行求解. (参考SLAM14讲)
opencv API:cvFindEssentialMat
二. 基础矩阵
Fundamental Matrix
-
用途
描述多相机拍摄到的图像像素之间的变换关系,相比于本质矩阵 E E E,包含相机内参. 能够将一个像素点映射为另一个图像上的的一条线,也就是所谓对极线
-
定义
如果已经理解本质矩阵 E E E的定义,我们很容易通过加入相机内参得到基础矩阵 F F F. 设 M M M为相机内参, q q q为像素点,则有 q = M p q=M p q=Mp, 也就是 p = M − 1 q p = M^{-1} q p=M−1q,带入基本矩阵中,可得
q r T ( M r − 1 ) T E M l − 1 q l = 0 q_r^{T} (M_r^{-1})^{T} E M_l^{-1} q_l=0 qrT(Mr−1)TEMl−1ql=0简洁起见,令 F = ( M r − 1 ) T E M l − 1 F = (M_r^{-1}) ^ {T} EM_l^{-1} F=(Mr−1)TEMl−1
也即
q r T F q l = 0 q_r^{T} F q_l = 0 qrTFql=0以上,明确了基础矩阵 F F F.
-
基础矩阵的性质
-
具体计算
opencv API:cvFindFundamentalMat
参考&致谢:
learning opencv