当前位置: 首页 > news >正文

计算机视觉之三维重建(深入浅出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α0sinαcosα cosβ0sinβ010sinβ0cosβ cosγsinγ0sinγ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} xy1 = 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} xyz1 = 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 xy1 = 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} xy1 = 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 xl,即有 x ⋅ l = 0 x \cdot l = 0 xl=0,所以 x ∈ l x \in l xl。同理可得, x ∈ l ′ x \in l' xl。所以, 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= abc a b = a ′ b ′ \dfrac{a}{b} = \dfrac{a'}{b'} ba=ba,现在我们来证明 l l l l ′ l' l 相交于无穷远点 x ∞ = ( b − a 0 ) x_{\infty} = \begin{pmatrix} b \\ -a \\ 0 \end{pmatrix} x= ba0
证:
因为 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) ba0 = 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 =0a(xx0)+b(yy0)+c(zz0)=0ax+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=(H1)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} (x2x1)=H(x2x1)l=Hll=HTl
证毕。
下图中位于中间的直线是影消线​​,它由三维空间中铁轨所在平面的无穷远线经透视投影得到。在三维空间中,平行铁轨延伸相交于无穷远点,这些点构成该平面的无穷远线,该线投影至图像平面即形成影消线。
在这里插入图片描述
图像中两条直线的交点如果在影消线上,则这两条线是 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=K1vK1v
在这里插入图片描述
ω \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+cx2cxcysin2θαβcosθcxcxcysin2θαβ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。随后,还需结合​​几何约束优化​​、​​深度信息推断​​及​​隐式表面重建算法​​恢复场景的三维结构,如下图所示:
在这里插入图片描述
单视图三维重建无法完全恢复真实场景的​​绝对尺度与细节​​,如下图所示:
在这里插入图片描述
单视图重构的缺点如下:
在这里插入图片描述

3. 总结

在这里插入图片描述

相关文章:

  • 突破AI瓶颈:基于实时感知的智能选路实现智算负载均衡优化
  • Java流处理中的常见错误与最佳实践
  • QEMU学习之路(9)— 在RISCV64 virt中添加DMA设备
  • LeetCode - 387. 字符串中的第一个唯一字符
  • 商城系统微服务化改造:三大难点与实战解决方案
  • 【工具教程】批量PDF识别提取区域的内容重命名,将PDF指定区域位置的内容提取出来改名的注意事项
  • 动态规划: 背包DP大合集
  • 算法第15天:继续二叉树|前序递归+回溯与前序递归的场景总结、最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树
  • 【Linux网络编程】基于udp套接字实现的网络通信
  • WebView工作原理全解析:如何实现混合开发的无缝衔接
  • 69、JS中如何调用上位机接口
  • 深入讲解一下 Nomic AI 的 GPT4All 这个项目
  • 局域网内电脑与安卓设备低延迟同屏技术【100ms - 200ms】
  • 开疆智能ModbusTCP转Devicenet网关连接三菱PLC与ABB机器人配置案例
  • 解决U盘安装Win11无法命令行跳过联网激活的问题
  • Python内存互斥与共享深度探索:从GIL到分布式内存的实战之旅
  • java发送excel附件的邮件
  • 低成本同屏方案:电脑 + 路由器实现 50 台安卓平板实时同屏
  • 电脑在使用过程中频繁死机怎么办
  • 组合模式深度解析:Java设计模式实战指南与树形结构处理架构设计
  • 临淄区住房和城乡建设局网站/友链交易交易平台
  • 做直播网站需要那些技术/品牌策略
  • 高端网站建设 骆诗/中国十大网络销售公司
  • wordpress搭建网站有什么好外/云优化seo软件
  • 西宁网站建设加q479185700/谷歌海外推广怎么做
  • 网站建设html5源码/抖音seo优化系统招商