> 技术文档 > 多视图几何:本质矩阵与基础矩阵

多视图几何:本质矩阵与基础矩阵


文章目录

  • 1. 前置知识
    • 1.1. 向量叉乘
    • 1.2. 混合积
    • 1.3. 引理证明
  • 2. 本质矩阵
  • 3. 基础矩阵
  • 4. 应用例子

1. 前置知识

1.1. 向量叉乘

假设 a= ( a x a y a z ) \\mathbf{a} = \\begin{pmatrix} a_x \\\\ a_y \\\\ a_z \\end{pmatrix} a= axayaz 以及 b= ( b x b y b z ) \\mathbf{b} = \\begin{pmatrix} b_x \\\\ b_y \\\\ b_z \\end{pmatrix} b= bxbybz ,叉乘 a×b \\mathbf{a} \\times \\mathbf{b} a×b 的矩阵表示为:
a × b = ( 0 − a z a y a z 0 − a x − a y a x 0 ) ( b x b y b z ) = [ a ] × b (1) \\mathbf{a} \\times \\mathbf{b} = \\begin{pmatrix} 0 & -a_z & a_y \\\\ a_z & 0 & -a_x \\\\ -a_y & a_x & 0 \\end{pmatrix} \\begin{pmatrix} b_x \\\\ b_y \\\\ b_z \\end{pmatrix} = [\\mathbf{a}]_{\\times} \\mathbf{b} \\tag{1} a×b= 0azayaz0axayax0 bxbybz =[a]×b(1)其中, [a ] × = ( 0 − a z a y a z 0 − a x − a y a x 0 ) [\\mathbf{a}]_{\\times} = \\begin{pmatrix} 0 & -a_z & a_y \\\\ a_z & 0 & -a_x \\\\ -a_y & a_x & 0 \\end{pmatrix} [a]×= 0azayaz0axayax0 为反对称矩阵,且有 [a ] × T =−[a ] × [\\mathbf{a}]_{\\times}^T = -[\\mathbf{a}]_{\\times} [a]×T=[a]×

1.2. 混合积

a \\mathbf{a} a b \\mathbf{b} b c \\mathbf{c} c 是三个向量,则混合积的定义为: a⋅(b×c) \\mathbf{a} \\cdot (\\mathbf{b} \\times \\mathbf{c}) a(b×c)。更进一步地,设 a= a 1 i+ a 2 j+ a 3 k \\mathbf{a} = a_1 \\mathbf{i} + a_2 \\mathbf{j} + a_3 \\mathbf{k} a=a1i+a2j+a3k b= b 1 i+ b 2 j+ b 3 k \\mathbf{b} = b_1 \\mathbf{i} + b_2 \\mathbf{j} + b_3 \\mathbf{k} b=b1i+b2j+b3k c= c 1 i+ c 2 j+ c 3 k \\mathbf{c} = c_1 \\mathbf{i} + c_2 \\mathbf{j} + c_3 \\mathbf{k} c=c1i+c2j+c3k,则有:
a ⋅ ( b × c ) = ∣ a 1 a 2 a 3 b 1 b 2 b 3 c 1 c 2 c 3 ∣ (2) \\mathbf{a} \\cdot (\\mathbf{b} \\times \\mathbf{c}) = \\begin{vmatrix} a_{1} & a_{2} & a_{3} \\\\ b_{1} & b_{2} & b_{3} \\\\ c_{1} & c_{2} & c_{3} \\end{vmatrix} \\tag{2} a(b×c)= a1b1c1a2b2c2a3b3c3 (2)证明:
a ⋅ ( b × c ) = ( a 1 i + a 2 j + a 3 k ) ⋅ ∣ i j k b 1 b 2 b 3 c 1 c 2 c 3 ∣ = ( a 1 i + a 2 j + a 3 k ) ⋅ ( i ∣ b 2 b 3 c 2 c 3 ∣ − j ∣ b 1 b 3 c 1 c 3 ∣ + k ∣ b 1 b 2 c 1 c 2 ∣ ) = a 1 ∣ b 2 b 3 c 2 c 3 ∣ − a 2 ∣ b 1 b 3 c 1 c 3 ∣ + a 3 ∣ b 1 b 2 c 1 c 2 ∣ = ∣ a 1 a 2 a 3 b 1 b 2 b 3 c 1 c 2 c 3 ∣ \\begin{align*} \\mathbf{a}\\cdot(\\mathbf{b}\\times\\mathbf{c}) &= \\left(a_{1}\\mathbf{i}+a_{2}\\mathbf{j}+a_{3}\\mathbf{k}\\right)\\cdot \\begin{vmatrix} \\mathbf{i} & \\mathbf{j} & \\mathbf{k} \\\\ b_{1} & b_{2} & b_{3} \\\\ c_{1} & c_{2} & c_{3} \\end{vmatrix} \\\\ &= \\left(a_{1}\\mathbf{i}+a_{2}\\mathbf{j}+a_{3}\\mathbf{k}\\right)\\cdot \\left( \\mathbf{i} \\begin{vmatrix} b_{2} & b_{3} \\\\ c_{2} & c_{3} \\end{vmatrix} - \\mathbf{j} \\begin{vmatrix} b_{1} & b_{3} \\\\ c_{1} & c_{3} \\end{vmatrix} + \\mathbf{k} \\begin{vmatrix} b_{1} & b_{2} \\\\ c_{1} & c_{2} \\end{vmatrix} \\right) \\\\ &= a_{1}\\begin{vmatrix} b_{2} & b_{3} \\\\ c_{2} & c_{3} \\end{vmatrix} - a_{2}\\begin{vmatrix} b_{1} & b_{3} \\\\ c_{1} & c_{3} \\end{vmatrix} + a_{3}\\begin{vmatrix} b_{1} & b_{2} \\\\ c_{1} & c_{2} \\end{vmatrix} \\\\ &= \\begin{vmatrix} a_{1} & a_{2} & a_{3} \\\\ b_{1} & b_{2} & b_{3} \\\\ c_{1} & c_{2} & c_{3} \\end{vmatrix} \\end{align*} a(b×c)=(a1i+a2j+a3k) ib1c1jb2c2kb3c3 =(a1i+a2j+a3k)(i b2c2b3c3 j b1c1b3c3 +k b1c1b2c2 )=a1 b2c2b3c3 a2 b1c1b3c3 +a3 b1c1b2c2 = a1b1c1a2b2c2a3b3c3 证毕。

行列式具有性质:互换行列式的两行或两列,行列式的值变号。因此有:
a ⋅ ( b × c ) = ∣ a 1 a 2 a 3 b 1 b 2 b 3 c 1 c 2 c 3 ∣ = ∣ b 1 b 2 b 3 c 1 c 2 c 3 a 1 a 2 a 3 ∣ = b ⋅ ( c × a ) = ∣ c 1 c 2 c 3 a 1 a 2 a 3 b 1 b 2 b 3 ∣ = c ⋅ ( a × b ) \\begin{align*} \\mathbf{a}\\cdot(\\mathbf{b}\\times\\mathbf{c}) &= \\begin{vmatrix} a_{1} & a_{2} & a_{3} \\\\ b_{1} & b_{2} & b_{3} \\\\ c_{1} & c_{2} & c_{3} \\end{vmatrix} \\\\ &= \\begin{vmatrix} b_{1} & b_{2} & b_{3} \\\\ c_{1} & c_{2} & c_{3} \\\\ a_{1} & a_{2} & a_{3} \\\\ \\end{vmatrix} = \\mathbf{b}\\cdot(\\mathbf{c}\\times\\mathbf{a}) \\\\ &= \\begin{vmatrix} c_{1} & c_{2} & c_{3} \\\\ a_{1} & a_{2} & a_{3} \\\\ b_{1} & b_{2} & b_{3} \\\\ \\end{vmatrix} = \\mathbf{c} \\cdot (\\mathbf{a} \\times \\mathbf{b}) \\end{align*} a(b×c)= a1b1c1a2b2c2a3b3c3 = b1c1a1b2c2a2b3c3a3 =b(c×a)= c1a1b1c2a2b2c3a3b3 =c(a×b)所以:
a ⋅ ( b × c ) = b ⋅ ( c × a ) = c ⋅ ( a × b ) (3) \\mathbf{a}\\cdot(\\mathbf{b}\\times\\mathbf{c}) = \\mathbf{b}\\cdot(\\mathbf{c}\\times\\mathbf{a}) = \\mathbf{c} \\cdot (\\mathbf{a} \\times \\mathbf{b}) \\tag{3} a(b×c)=b(c×a)=c(a×b)(3)此外,如果 a \\mathbf{a} a b \\mathbf{b} b c \\mathbf{c} c 中任意两个向量相等,则混合积等于零。不失一般性,假设 a=b \\mathbf{a} = \\mathbf{b} a=b,则有:
a ⋅ ( a × c ) = a ⋅ ( c × a ) = c ⋅ ( a × a ) = 0 \\mathbf{a}\\cdot(\\mathbf{a}\\times\\mathbf{c}) = \\mathbf{a}\\cdot(\\mathbf{c}\\times\\mathbf{a}) = \\mathbf{c} \\cdot (\\mathbf{a} \\times \\mathbf{a}) = 0 a(a×c)=a(c×a)=c(a×a)=0

1.3. 引理证明

引理一 R(a×b)=(Ra)×(Rb) \\mathbf{R}(\\mathbf{a} \\times \\mathbf{b}) = (\\mathbf{R} \\mathbf{a}) \\times (\\mathbf{R} \\mathbf{b}) R(a×b)=(Ra)×(Rb)
证明:
对于任意向量 v \\mathbf{v} v

  • R ( a × b ) ⋅ v = [ R ( a × b ) ] T v = ( a × b ) TR T v = ( a × b ) ⋅ ( R T v ) \\mathbf{R}(\\mathbf{a} \\times \\mathbf{b}) \\cdot \\mathbf{v} = [\\mathbf{R}(\\mathbf{a} \\times \\mathbf{b})]^T \\mathbf{v} = (\\mathbf{a} \\times \\mathbf{b})^T \\mathbf{R}^T \\mathbf{v} = (\\mathbf{a} \\times \\mathbf{b}) \\cdot (\\mathbf{R}^T\\mathbf{v}) R(a×b)v=[R(a×b)]Tv=(a×b)TRTv=(a×b)(RTv)
  • 根据混合积、向量点积和旋转矩阵 ( R R T = I , det ⁡ ( R ) = 1 ) (\\mathbf{R} \\mathbf{R}^T = \\mathbf{I}, \\det(\\mathbf{R}) = 1) (RRT=I,det(R)=1) 的性质有:
    [ ( R a ) × ( R b ) ] ⋅ v = v ⋅ [ ( R a ) × ( R b ) ] = det ⁡ ( [ v R a R b ] ) = det ⁡ ( R [ R T v a b ] ) = det ⁡ ( R ) det ⁡ ( [ R T v a b ] ) = det ⁡ ( [ R T v a b ] ) = ( R T v ) ⋅ ( a × b ) = ( a × b ) ⋅ ( R T v ) \\begin{align*} [(\\mathbf{R} \\mathbf{a}) \\times (\\mathbf{R} \\mathbf{b})] \\cdot \\mathbf{v} &= \\mathbf{v} \\cdot [(\\mathbf{R} \\mathbf{a}) \\times (\\mathbf{R} \\mathbf{b})] = \\det([\\mathbf{v} \\quad \\mathbf{R} \\mathbf{a} \\quad \\mathbf{R} \\mathbf{b}]) = \\det(\\mathbf{R}[\\mathbf{R}^T\\mathbf{v} \\quad \\mathbf{a} \\quad \\mathbf{b}]) \\\\ &= \\det(\\mathbf{R}) \\det([\\mathbf{R}^T\\mathbf{v} \\quad \\mathbf{a} \\quad \\mathbf{b}]) = \\det([\\mathbf{R}^T\\mathbf{v} \\quad \\mathbf{a} \\quad \\mathbf{b}]) \\\\ &= (\\mathbf{R}^T\\mathbf{v}) \\cdot (\\mathbf{a} \\times \\mathbf{b}) = (\\mathbf{a} \\times \\mathbf{b}) \\cdot (\\mathbf{R}^T\\mathbf{v}) \\end{align*}[(Ra)×(Rb)]v=v[(Ra)×(Rb)]=det([vRaRb])=det(R[RTvab])=det(R)det([RTvab])=det([RTvab])=(RTv)(a×b)=(a×b)(RTv)

综上有,对于任意向量 v \\mathbf{v} v 有:
R ( a × b ) ⋅ v = ( R a × R b ) ⋅ v ⇒ R ( a × b ) = ( R a ) × ( R b ) \\mathbf{R}(\\mathbf{a} \\times \\mathbf{b}) \\cdot \\mathbf{v} = (\\mathbf{R} \\mathbf{a} \\times \\mathbf{R} \\mathbf{b}) \\cdot \\mathbf{v} \\Rightarrow \\mathbf{R}(\\mathbf{a} \\times \\mathbf{b}) = (\\mathbf{R} \\mathbf{a}) \\times (\\mathbf{R} \\mathbf{b}) R(a×b)v=(Ra×Rb)vR(a×b)=(Ra)×(Rb)证毕。

2. 本质矩阵

在这里插入图片描述
由上图可知,本质矩阵 E \\mathbf{E} E 在极线的计算中起着重要的作用。本质矩阵的计算方式如下: E = [ T ] × R = R [ R T T ] × (4) \\mathbf{E} = [\\mathbf{T}]_{\\times} \\mathbf{R} = \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} \\tag{4} E=[T]×R=R[RTT]×(4)其中, R \\mathbf{R} R T \\mathbf{T} T 表示从图像 I 1 I_1 I1 到图像 I 2 I_2 I2 的旋转矩阵和平移向量。

现在我们来证明 [T ] × R=R[ R T T ] × [\\mathbf{T}]_{\\times} \\mathbf{R} = \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} [T]×R=R[RTT]×。证明如下:
对于任意向量 v \\mathbf{v} v 有:

  • [ T ] × R v = T × ( R v ) [\\mathbf{T}]_{\\times} \\mathbf{R} \\mathbf{v} = \\mathbf{T} \\times (\\mathbf{R} \\mathbf{v}) [T]×Rv=T×(Rv)
  • R [ R T T ] × v = R ( R T T × v ) \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} \\mathbf{v} = \\mathbf{R} (\\mathbf{R}^T\\mathbf{T} \\times \\mathbf{v}) R[RTT]×v=R(RTT×v)

T ′ = R T T \\mathbf{T}^{\\prime} = \\mathbf{R}^T\\mathbf{T} T=RTT,则 T=R T ′ \\mathbf{T} = \\mathbf{R} \\mathbf{T}^{\\prime} T=RT,根据引理一有:
T × ( R v ) = ( R T ′ ) × ( R v ) = R ( T ′ × v ) = R ( R T T × v ) = R [ R T T ] × v \\mathbf{T} \\times (\\mathbf{R} \\mathbf{v}) = (\\mathbf{R} \\mathbf{T}^{\\prime}) \\times (\\mathbf{R} \\mathbf{v}) = \\mathbf{R}(\\mathbf{T}^{\\prime} \\times \\mathbf{v}) = \\mathbf{R}(\\mathbf{R}^T\\mathbf{T} \\times \\mathbf{v}) = \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} \\mathbf{v} T×(Rv)=(RT)×(Rv)=R(T×v)=R(RTT×v)=R[RTT]×v所以,对于任意向量 v \\mathbf{v} v 有:
[ T ] × R v = R [ R T T ] × v ⇒ [ T ] × R = R [ R T T ] × [\\mathbf{T}]_{\\times} \\mathbf{R} \\mathbf{v} = \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} \\mathbf{v} \\Rightarrow [\\mathbf{T}]_{\\times} \\mathbf{R} = \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} [T]×Rv=R[RTT]×v[T]×R=R[RTT]×证毕。

3. 基础矩阵

基础矩阵与本质矩阵的关系如下:
F = K ′ − T E K − 1 = K ′ − T [ T ] × R K − 1 (5) \\mathbf{F} = \\mathbf{K}^{\\prime-T} \\mathbf{E} \\mathbf{K}^{-1} = \\mathbf{K}^{\\prime-T} [\\mathbf{T}]_{\\times} \\mathbf{R} \\mathbf{K}^{-1} \\tag{5} F=KTEK1=KT[T]×RK1(5)其中, K \\mathbf{K} K K ′ \\mathbf{K}^{\\prime} K 分别为图像 I 1 I_1 I1 I 2 I_2 I2 对应的内参矩阵。

l 1 l_1 l1 l 2 l_2 l2 极线的方程为:
{ l 2= F x 1 l 1= F T x 2 (6) \\begin{cases} l_2 = \\mathbf{F} \\mathbf{x}_1 \\\\ l_1 = \\mathbf{F}^T \\mathbf{x}_2 \\end{cases} \\tag{6} {l2=Fx1l1=FTx2(6)

4. 应用例子

假设图像 I 1 I_1 I1 I 2 I_2 I2 到世界坐标系的变换分别为 R s \\mathbf{R}_s Rs T s \\mathbf{T}_s Ts R t \\mathbf{R}_t Rt T t \\mathbf{T}_t Tt。已知图像 I 1 I_1 I1 存在点 x \\mathbf{x} x,求对应的极线方程。

代码如下:

R = R_t @ R_s.inverse()T = R_s @ R_t.inverse() @ T_t - T_sT = T.squeeze()S = torch.zeros((3, 3))S[0, 1] = -T[2]S[1, 0] = T[2]S[0, 2] = T[1]S[2, 0] = -T[1]S[1, 2] = -T[0]S[2, 1] = T[0]E = R @ SF = K_t.inverse().transpose(0, 1) @ E @ K_s.inverse()epipolar_line = F @ xa = epipolar_line[0]b = epipolar_line[1]c = epipolar_line[2]

上述代码修改自:https://github.com/USMizuki/NexusGS/blob/main/utils/flow_utils.py。

设点 x \\mathbf{x} x 对应的空间点为 X \\mathbf{X} X,在图像 I 2 I_2 I2 的对应点为 x ′ x^{\\prime} x,现在我们来进行理论推导:
{ x = R s X + T s x ′ = R t X + T t \\begin{cases} \\mathbf{x} = \\mathbf{R}_s \\mathbf{X} + \\mathbf{T}_s \\\\ \\mathbf{x}^{\\prime} = \\mathbf{R}_t \\mathbf{X} + \\mathbf{T}_t \\end{cases} {x=RsX+Tsx=RtX+Tt X= R s − 1 (x− T s ) \\mathbf{X} = \\mathbf{R}_s^{-1} (\\mathbf{x} - \\mathbf{T}_s) X=Rs1(xTs) 带入 x ′ = R t X+ T t \\mathbf{x}^{\\prime} = \\mathbf{R}_t \\mathbf{X} + \\mathbf{T}_t x=RtX+Tt 有:
x ′ = R tR s − 1( x − T s ) + T t = R tR s − 1x − R tR s − 1 T s + T t \\mathbf{x}^{\\prime} = \\mathbf{R}_t \\mathbf{R}_s^{-1} (\\mathbf{x} - \\mathbf{T}_s) + \\mathbf{T}_t = \\mathbf{R}_t \\mathbf{R}_s^{-1} \\mathbf{x} - \\mathbf{R}_t \\mathbf{R}_s^{-1} \\mathbf{T}_s + \\mathbf{T}_t x=RtRs1(xTs)+Tt=RtRs1xRtRs1Ts+Tt所以,从图像 I 1 I_1 I1 I 2 I_2 I2 的旋转矩阵 R \\mathbf{R} R 和平移向量 T \\mathbf{T} T 的计算公式如下:
{ R = R t R s − 1 T = − R t R s − 1 T s+ T t (7) \\begin{cases} \\mathbf{R} = \\mathbf{R}_t \\mathbf{R}_s^{-1} \\\\ \\mathbf{T} = - \\mathbf{R}_t \\mathbf{R}_s^{-1} \\mathbf{T}_s + \\mathbf{T}_t \\end{cases} \\tag{7} {R=RtRs1T=RtRs1Ts+Tt(7) T \\mathbf{T} T 的计算公式与代码不符,不妨设代码中对应 T ′ \\mathbf{T}^{\\prime} T,则有:
T ′ = R sR t − 1 T t − T s \\mathbf{T}^{\\prime} = \\mathbf{R}_s \\mathbf{R}_t^{-1} \\mathbf{T}_t - \\mathbf{T}_s T=RsRt1TtTs不难发现 T \\mathbf{T} T T ′ \\mathbf{T}^{\\prime} T 存在如下关系:
R tR s − 1 T ′ = R tR s − 1( R sR t − 1 T t − T s ) = T t − R tR s − 1 T s = T \\mathbf{R}_t \\mathbf{R}_s^{-1} \\mathbf{T}^{\\prime} = \\mathbf{R}_t \\mathbf{R}_s^{-1} (\\mathbf{R}_s \\mathbf{R}_t^{-1} \\mathbf{T}_t - \\mathbf{T}_s) = \\mathbf{T}_t - \\mathbf{R}_t \\mathbf{R}_s^{-1} \\mathbf{T}_s = \\mathbf{T} RtRs1T=RtRs1(RsRt1TtTs)=TtRtRs1Ts=T即有: R T ′ =T⇒ T ′ = R − 1 T= R T T \\mathbf{R} \\mathbf{T}^{\\prime} = \\mathbf{T} \\Rightarrow \\mathbf{T}^{\\prime} = \\mathbf{R}^{-1} \\mathbf{T} = \\mathbf{R}^T \\mathbf{T} RT=TT=R1T=RTT
则本质矩阵的计算方式为:
E = [ T ] × R = R [ R T T ] × = R [ T ′] × \\mathbf{E} = [\\mathbf{T}]_{\\times} \\mathbf{R} = \\mathbf{R} [\\mathbf{R}^T \\mathbf{T}]_{\\times} = \\mathbf{R} [\\mathbf{T}^{\\prime}]_{\\times} E=[T]×R=R[RTT]×=R[T]×可以看出代码中的 E \\mathbf{E} E 采取的计算方式是 R[ T ′ ] × \\mathbf{R} [\\mathbf{T}^{\\prime}]_{\\times} R[T]×