计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 3. 单视几何
文章目录
- 1. 前置知识
- 1.1. 旋转变换与缩放变换
- 1.2. 相似变换
- 1.3. 仿射变换
- 1.4. 透视变换
- 2. 单视测量
- 2.1. 无穷远点、无穷远线与无穷远平面
- 2.1.1. 2D 平面
- 2.1.2. 3D 空间
- 2.2. 影消点和影消线
- 2.2.1. 2D 平面
- 2.3. 单视重构
- 3. 总结
课程视频链接: 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)——3.单视几何。
1. 前置知识
1.1. 旋转变换与缩放变换
我们不加证明地给出 2D 和 3D 空间的旋转变换矩阵,其中 2D 空间的旋转矩阵如下图所示:
而 3D 空间的旋转矩阵为:
R = ( 1 0 0 0 cos α − sin α 0 sin α cos α ) ( cos β 0 sin β 0 1 0 − sin β 0 cos β ) ( cos γ − sin γ 0 sin γ cos γ 0 0 0 1 ) \mathbf{R} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha \\ 0 & \sin \alpha & \cos \alpha \end{pmatrix} \begin{pmatrix} \cos \beta & 0 & \sin \beta \\ 0 & 1 & 0 \\ -\sin \beta & 0 & \cos \beta \end{pmatrix} \begin{pmatrix} \cos \gamma & -\sin \gamma & 0 \\ \sin \gamma & \cos \gamma & 0 \\ 0 & 0 & 1 \end{pmatrix} R= 1000cosαsinα0−sinαcosα cosβ0−sinβ010sinβ0cosβ cosγsinγ0−sinγcosγ0001 其中, α , β , γ \alpha, \beta, \gamma α,β,γ 分别为绕 X , Y , Z X, Y, Z X,Y,Z 轴逆时针旋转的角度。
2D 和 3D 空间下的缩放变换如下:
( x ′ y ′ 1 ) = ( s 0 0 0 s 0 0 0 1 ) ( x y 1 ) \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} s & 0 & 0 \\ 0 & s & 0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} x′y′1 = s000s0001 xy1 ( x ′ y ′ z ′ 1 ) = ( s 0 0 0 0 s 0 0 0 0 s 0 0 0 0 1 ) ( x y z 1 ) \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} = \begin{pmatrix} s & 0 & 0 & 0 \\ 0 & s & 0 & 0 \\ 0 & 0 & s & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} x′y′z′1 = s0000s0000s00001 xyz1
1.2. 相似变换
相似变换是指保持图形相似的变换,可由缩放变换与欧式变换合成。相似变换矩阵如下所示:
x ′ = ( s R t 0 1 ) x = H s x x' = \begin{pmatrix} s \mathbf{R} & t \\ 0 & 1 \end{pmatrix} x = \mathbf{H_s} x x′=(sR0t1)x=Hsx其中, t t t 为平移向量, s s s 为缩放因子, R 为旋转矩阵 \mathbf{R} 为旋转矩阵 R为旋转矩阵。
相似变换的特点有:
- 点变换到点,线变换到线
- 保持点的共线(面)性、线的共面性
- 保持直线与直线、直线与平面、平面与平面的平行性不变
- 保持角度不变
相似变换矩阵在 2D 空间和 3D 空间分别有 1 个自由度和 4 个自由度。相似变换示例如下所示:
1.3. 仿射变换
以 2D 空间为例,我们将相似变换矩阵 H s \mathbf{H_s} Hs 中的 s R s \mathbf{R} sR 一般化为 ( a b c d ) \begin{pmatrix} a & b \\ c & d \end{pmatrix} (acbd),则可得仿射变换:
( x ′ y ′ 1 ) = ( a b x 0 c d y 0 0 0 1 ) ( x y 1 ) ⇒ x ′ = ( A t 0 1 ) x = H α x \begin{pmatrix} x' \\ y' \\ 1\end{pmatrix} = \begin{pmatrix} a & b & x_0 \\ c & d & y_0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} \Rightarrow x' = \begin{pmatrix} A & t \\ 0 & 1 \end{pmatrix} x = H_\alpha x x′y′1 = ac0bd0x0y01 xy1 ⇒x′=(A0t1)x=Hαx3D 空间的仿射变换矩阵如下所示:
仿射变换的特点有:
- 保持无穷远平面不变(无穷远点变换到无穷远点)
- 保持直线与直线、直线与平面、平面与平面的平行性不变
仿射变换示例如下:
1.4. 透视变换
将仿射变换矩阵底部为 0 的那一行一般化为任意数,即可得透视变换。2D 空间的透视变换如下:
( x ′ y ′ 1 ) = ( a b x 0 c d y 0 v 1 v 2 1 ) ( x y 1 ) ⇒ x ′ = ( A t v T 1 ) x = H x \begin{equation} \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} a & b & x_0 \\ c & d & y_0 \\ v_1 & v_2 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} \Rightarrow x' = \begin{pmatrix} \mathbf{A} & t \\ v^T & 1 \end{pmatrix} \mathbf{x} = \mathbf{H} x \end{equation} x′y′1 = acv1bdv2x0y01 xy1 ⇒x′=(AvTt1)x=Hx3D 空间的透视变换矩阵如下图所示:
透视变换的特点有:点变换到点,线变换到线,保持点的共线(面)性、线的共面性。
透视变换示例如下:
2. 单视测量
完成相机标定后,给定一个像素坐标,我们并不能唯一确定其所对应的空间点位置。因为沿相机光心与该像素点形成的反向投影射线上的所有点都可能投影到该像素上,如下图所示:
单图像三维重建是非常困难的,但通过引入场景先验约束,仍可恢复部分甚至完整的场景结构。下面我们来了解其实现原理与方法。
2.1. 无穷远点、无穷远线与无穷远平面
2.1.1. 2D 平面
在 2D 平面上,直线的方程为 a x 1 + b x 2 + c = 0 ax_1 + bx_2 + c = 0 ax1+bx2+c=0。不妨令 l = ( a b c ) l = \begin{pmatrix} a \\ b \\ c \end{pmatrix} l= abc , x = ( x 1 x 2 1 ) x = \begin{pmatrix} x_1 \\ x_2 \\ 1 \end{pmatrix} x= x1x21 ,则直线方程可以表述为 l T x = 0 l^Tx = 0 lTx=0 或者 x T l = 0 x^Tl = 0 xTl=0。
现在我们来证明:假设有两条直线 l l l 和 l ′ l' l′,则两条直线交点为 x = l × l ′ x = l \times l' x=l×l′。
证:
令 x = l × l ′ x = l \times l' x=l×l′,则 x ⊥ l x \perp l x⊥l,即有 x ⋅ l = 0 x \cdot l = 0 x⋅l=0,所以 x ∈ l x \in l x∈l。同理可得, x ∈ l ′ x \in l' x∈l′。所以, x x x 为直线 l l l 和 l ′ l' l′ 的交点。
证毕。
通过引入齐次坐标后,我们可以很容易地表示无穷远点,即 x ∞ = ( x y 0 ) x_{\infty} = \begin{pmatrix} x \\ y \\ 0 \end{pmatrix} x∞= xy0 。
假设存在两条平行线 l = ( a b c ) l = \begin{pmatrix} a \\ b \\ c \end{pmatrix} l= abc 和 l ′ = ( a ′ b ′ c ′ ) l' = \begin{pmatrix} a' \\ b' \\ c' \end{pmatrix} l′= a′b′c′ 且 a b = a ′ b ′ \dfrac{a}{b} = \dfrac{a'}{b'} ba=b′a′,现在我们来证明 l l l 和 l ′ l' l′ 相交于无穷远点 x ∞ = ( b − a 0 ) x_{\infty} = \begin{pmatrix} b \\ -a \\ 0 \end{pmatrix} x∞= b−a0 。
证:
因为 l T x ∞ = ( a b c ) ( b − a 0 ) l^T x_{\infty} = (a \quad b \quad c) \begin{pmatrix} b \\ -a \\ 0 \end{pmatrix} lTx∞=(abc) b−a0 = 0,所以直线 l l l 穿过无穷远点 x ∞ x_{\infty} x∞。同理可得, l ′ l' l′ 也穿过无穷远点 x ∞ x_{\infty} x∞。所以,两条直线 l l l 和 l ′ l' l′ 相交于无穷远点 x ∞ x_{\infty} x∞。
证毕。
此外,我们还可以证明无穷远点集位于称为无穷远线的一条线上,如下图所示:
2.1.2. 3D 空间
在 3D 空间中,已知平面的法向量 n ⃗ = ( a b c ) \vec{n} = \begin{pmatrix} a \\ b \\ c \end{pmatrix} n= abc 和平面上的一点 P 0 = ( x 0 y 0 z 0 ) P_0 = \begin{pmatrix} x_0 \\ y_0 \\ z_0 \end{pmatrix} P0= x0y0z0 ,即可确定平面的方程: n ⃗ ⋅ P 0 P → = 0 ⇒ a ( x − x 0 ) + b ( y − y 0 ) + c ( z − z 0 ) = 0 ⇒ a x + b y + c z − ( a x 0 + b y 0 + c z 0 ) = 0 \vec{n} \cdot \overrightarrow{P_0 P} = 0 \Rightarrow a(x - x_0) + b(y - y_0) + c(z - z_0) = 0 \Rightarrow ax + by + cz - (ax_0 + by_0 + cz_0) = 0 n⋅P0P=0⇒a(x−x0)+b(y−y0)+c(z−z0)=0⇒ax+by+cz−(ax0+by0+cz0)=0,令 d = − ( a x 0 + b y 0 + c z 0 ) d = -(ax_0 + by_0 + cz_0) d=−(ax0+by0+cz0) 即有平面方程为: a x + b y + c z + d = 0 ax + by + cz + d = 0 ax+by+cz+d=0。
取 Π = ( a b c d ) \Pi = \begin{pmatrix} a \\ b \\ c \\ d \end{pmatrix} Π= abcd , x = ( x y z 1 ) x = \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} x= xyz1 ,则平面方程为 Π T x = 0 \Pi^Tx=0 ΠTx=0 或者 x T Π = 0 x^T\Pi = 0 xTΠ=0。
类似于 2D 空间的无穷远点,在 3D 空间中两条平行线相交于无穷远点 x ∞ = ( a b c 0 ) x_{\infty} = \begin{pmatrix} a \\ b \\ c \\ 0 \end{pmatrix} x∞= abc0 。
2.2. 影消点和影消线
2.2.1. 2D 平面
2D 平面上无穷远点的变换如下图所示:
2D 平面上直线的变换如下图所示:
值得注意的是,2D 平面上的无穷远线经过透视变换后不再是无穷远线,如下图所示:
影消点是指三维空间中的无穷远点在图像平面上的投影点,如下图所示:
影消点的计算方法如下:
无穷远直线:同一平面内所有平行线的无穷远点构成一条直线。
无穷远平面:多个平行平面对应的无穷远线集合构成无穷远平面。
影消线又称消失线或视平线,是指三维空间中无穷远平面(或特定平面上的无穷远直线)在二维图像平面上的投影线,如下图所示:
假设 3D 空间存在无穷远线 l ∞ l_{\infty} l∞,且透视矩阵为 H \mathbf{H} H,则 l ∞ l_{\infty} l∞ 投影到图像上为影消线 l ′ l' l′ 且 l ′ = ( H − 1 ) T l l' = (\mathbf{H}^{-1})^{T}l l′=(H−1)Tl。证明如下:
设 x 1 x_1 x1 和 x 2 x_2 x2 为 l ∞ l_{\infty} l∞ 上的两点,且这两点分别对应于图像中的 x 1 ′ x_1' x1′ 和 x 2 ′ x_2' x2′,且有
{ x 1 ′ = H x 1 x 2 ′ = H x 2 \begin{cases} x_1' = Hx_1 \\ x_2' = Hx_2 \end{cases} {x1′=Hx1x2′=Hx2则有: ( x 2 ′ − x 1 ′ ) = H ( x 2 − x 1 ) ⇒ l ∞ ′ = H l ∞ ⇒ l ′ = H − T l ∞ (x_2' - x_1') = H(x_2 - x_1) \Rightarrow l'_{\infty} = \mathbf{H} l_{\infty} \Rightarrow l' = \mathbf{H}^{-T} l_{\infty} (x2′−x1′)=H(x2−x1)⇒l∞′=Hl∞⇒l′=H−Tl∞。
证毕。
下图中位于中间的直线是影消线,它由三维空间中铁轨所在平面的无穷远线经透视投影得到。在三维空间中,平行铁轨延伸相交于无穷远点,这些点构成该平面的无穷远线,该线投影至图像平面即形成影消线。
图像中两条直线的交点如果在影消线上,则这两条线是 3D 空间中的平行线。研究已证实识别影消线有助于三维场景的重构。
影消线与平面法向量的关系如下:
将前面推导出的数学公式总结如下:
2.3. 单视重构
假设空间中存在两组平行线,这两组平行线的方向向量为 d 1 → \overrightarrow{d_1} d1 和 d 2 → \overrightarrow{d_2} d2,而 x 2 ∞ x_{2\infty} x2∞ 和 x 1 ∞ x_{1\infty} x1∞ 分为这两组平行线上的无穷远点, x 2 ∞ x_{2\infty} x2∞ 和 x 1 ∞ x_{1\infty} x1∞ 经过透视变换投影到图像平面上的 v 2 v_2 v2 和 v 1 v_1 v1,根据影消点可以推出两组平行线的方向向量,公式如下:
d = K − 1 v ∥ K − 1 v ∥ d = \dfrac{K^{-1}v}{\|K^{-1}v\|} d=∥K−1v∥K−1v
ω \omega ω 的性质如图所示:
K K T \mathbf{K} \mathbf{K^T} KKT 的展开式如下: K K T = ( α − α cot θ c x 0 β sin θ c y 0 0 1 ) ( α 0 0 − α cot θ β sin θ 0 c x c y 1 ) = ( α 2 + α 2 cot 2 θ + c x 2 − α cot θ β sin θ + c x c y c x − α cot θ β sin θ + c x c y β 2 sin 2 θ + c y 2 c y c x c y 1 ) = ( α 2 sin 2 θ + c x 2 c x c y − α β cos θ sin 2 θ c x c x c y − α β cos θ sin 2 θ c y 2 + β 2 sin 2 θ c y c x c y 1 ) \begin{align*} \mathbf{K} \mathbf{K^T} &= \begin{pmatrix} \alpha & -\alpha \cot \theta & c_x \\ 0 & \dfrac{\beta}{\sin \theta} & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} \alpha & 0 & 0 \\ -\alpha \cot \theta & \dfrac{\beta}{\sin \theta} & 0 \\ c_x & c_y & 1 \end{pmatrix} \\ &= \begin{pmatrix} \alpha^2 + \alpha^2 \cot^2 \theta + c_x^2 & -\alpha \cot \theta \dfrac{\beta}{\sin \theta} + c_x c_y & c_x \\ \\ -\alpha \cot \theta \dfrac{\beta}{\sin \theta} + c_x c_y & \dfrac{\beta^2}{\sin^2 \theta} + c_y^2 & c_y \\ \\ c_x & c_y & 1 \end{pmatrix} \\ &=\begin{pmatrix} \dfrac{\alpha^2}{\sin^2 \theta} + c_x^2 & c_x c_y - \dfrac{\alpha \beta \cos \theta}{\sin^2 \theta} & c_x \\ \\ c_x c_y - \dfrac{\alpha \beta \cos \theta}{\sin^2 \theta} & c_y^2 + \dfrac{\beta^2}{\sin^2 \theta} & c_y \\ \\ c_x & c_y & 1 \end{pmatrix} \end{align*} KKT= α00−αcotθsinθβ0cxcy1 α−αcotθcx0sinθβcy001 = α2+α2cot2θ+cx2−αcotθsinθβ+cxcycx−αcotθsinθβ+cxcysin2θβ2+cy2cycxcy1 = sin2θα2+cx2cxcy−sin2θαβcosθcxcxcy−sin2θαβcosθcy2+sin2θβ2cycxcy1 则有:
ω = ( K K T ) − 1 = ( 1 α 2 cos θ α β − c y cos θ α β − c x α 2 cos θ α β 1 β 2 − c y β 2 − c x cos θ α β − c y cos θ α β − c x α 2 − c y β 2 − c x cos θ α β 1 + c y 2 β 2 + 2 c x c y cos θ α β + c x 2 α 2 ) \omega = (\mathbf{K} \mathbf{K^T})^{-1} = \left( \begin{matrix} \dfrac{1}{\alpha^{2}} & \dfrac{\cos{\theta}}{\alpha \beta} & - \dfrac{c_{y} \cos{\theta}}{\alpha \beta} - \dfrac{c_{x}}{\alpha^{2}} \\ \\ \dfrac{\cos{\theta}}{\alpha \beta} & \dfrac{1}{\beta^{2}} & - \dfrac{c_{y}}{\beta^{2}} - \dfrac{c_{x} \cos{\theta}}{\alpha \beta}\\\\ - \dfrac{c_{y} \cos{\theta}}{\alpha \beta} - \dfrac{c_{x}}{\alpha^{2}} & - \dfrac{c_{y}}{\beta^{2}} - \dfrac{c_{x} \cos{\theta}}{\alpha \beta} & 1 + \dfrac{c_{y}^{2}}{\beta^{2}} + \dfrac{2 c_{x} c_{y} \cos{\theta}}{\alpha \beta} + \dfrac{c_{x}^{2}}{\alpha^{2}}\end{matrix}\right) ω=(KKT)−1= α21αβcosθ−αβcycosθ−α2cxαβcosθβ21−β2cy−αβcxcosθ−αβcycosθ−α2cx−β2cy−αβcxcosθ1+β2cy2+αβ2cxcycosθ+α2cx2 上述 ( K K T ) − 1 {(\mathbf{K}\mathbf{K^T})}^{-1} (KKT)−1 是使用下面代码计算得到的:
from sympy import symbols, sin, cos, Matrix, simplify
from sympy.printing.latex import print_latexalpha, beta, theta, c_x, c_y = symbols('alpha beta theta c_x c_y')
A = Matrix([[alpha**2/sin(theta)**2 + c_x**2, c_x*c_y - alpha*beta*cos(theta)/sin(theta)**2, c_x],[c_x*c_y - alpha*beta*cos(theta)/sin(theta)**2, c_y**2 + beta**2/sin(theta)**2, c_y],[c_x, c_y, 1]
])
A_inv = A.inv()simplified_A_inv = simplify(A_inv)
print_latex(simplified_A_inv)
显然, ω \omega ω 为对称阵。
当 ω 2 = 0 \omega_2 = 0 ω2=0 时,有 cos θ α β = 0 \dfrac{\cos\theta}{\alpha\beta} = 0 αβcosθ=0,所以 θ = π 2 \theta = \dfrac{\pi}{2} θ=2π,所以为零倾斜。
当 ω 1 = ω 3 \omega_1 = \omega_3 ω1=ω3 时,有 1 α 2 = 1 β 2 ⇒ α = β \dfrac{1}{\alpha^2} = \dfrac{1}{\beta^2} \Rightarrow \alpha = \beta α21=β21⇒α=β,所以 ω 2 = 0 \omega_2 = 0 ω2=0 且 ω 1 = ω 3 \omega_1 = \omega_3 ω1=ω3 可以推出方形像素。
单视图标定的方法如下图所示:
求解相机内参矩阵 K \mathbf{K} K 后,通过场景平面在图像中的影消线 l h l_h lh 计算其法向量: n = K l h n = \mathbf{K} l_h n=Klh。随后,还需结合几何约束优化、深度信息推断及隐式表面重建算法恢复场景的三维结构,如下图所示:
单视图三维重建无法完全恢复真实场景的绝对尺度与细节,如下图所示:
单视图重构的缺点如下: