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

文章目录

  • [1. 前置知识](#1. 前置知识)
    • [1.1. 向量叉乘](#1.1. 向量叉乘)
    • [1.2. 混合积](#1.2. 混合积)
    • [1.3. 引理证明](#1.3. 引理证明)
  • [2. 本质矩阵](#2. 本质矩阵)
  • [3. 基础矩阵](#3. 基础矩阵)
  • [4. 应用例子](#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= 0az−ay−az0axay−ax0 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×= 0az−ay−az0axay−ax0 为反对称矩阵,且有 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 ) = ( R a ) × ( R b ) \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 ) T R 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(RRTvab)=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)⋅v⇒R(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=RRTT×(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=RRTT×。证明如下:

对于任意向量 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}) RRTT×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)=RRTT×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=RRTT×v⇒T×R=RRTT×证毕。

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=K′−TEK−1=K′−TT×RK−1(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,求对应的极线方程。

代码如下:

python 复制代码
R = R_t @ R_s.inverse()
T = R_s @ R_t.inverse() @ T_t - T_s
T = 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 @ S
F = K_t.inverse().transpose(0, 1) @ E @ K_s.inverse()

epipolar_line = F @ x
a = 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=Rs−1(x−Ts) 带入 x ′ = R t X + T t \mathbf{x}^{\prime} = \mathbf{R}_t \mathbf{X} + \mathbf{T}_t x′=RtX+Tt 有:
x ′ = R t R s − 1 ( x − T s ) + T t = R t R s − 1 x − R t R 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′=RtRs−1(x−Ts)+Tt=RtRs−1x−RtRs−1Ts+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=RtRs−1T=−RtRs−1Ts+Tt(7) T \mathbf{T} T 的计算公式与代码不符,不妨设代码中对应 T ′ \mathbf{T}^{\prime} T′,则有:
T ′ = R s R t − 1 T t − T s \mathbf{T}^{\prime} = \mathbf{R}_s \mathbf{R}_t^{-1} \mathbf{T}_t - \mathbf{T}_s T′=RsRt−1Tt−Ts不难发现 T \mathbf{T} T 和 T ′ \mathbf{T}^{\prime} T′ 存在如下关系:
R t R s − 1 T ′ = R t R s − 1 ( R s R t − 1 T t − T s ) = T t − R t R 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} RtRs−1T′=RtRs−1(RsRt−1Tt−Ts)=Tt−RtRs−1Ts=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′=T⇒T′=R−1T=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=RRTT×=RT′×可以看出代码中的 E \mathbf{E} E 采取的计算方式是 R T ′ × \mathbf{R} \\mathbf{T}\^{\\prime}{\times} RT′×。