您的位置:首页 > 科技 > IT业 > 武汉中企动力_网络规划设计师资料_seo优化网站教程百度_百度优化排名

武汉中企动力_网络规划设计师资料_seo优化网站教程百度_百度优化排名

2025/3/24 15:36:19 来源:https://blog.csdn.net/wjpwjpwjp0831/article/details/146336523  浏览:    关键词:武汉中企动力_网络规划设计师资料_seo优化网站教程百度_百度优化排名
武汉中企动力_网络规划设计师资料_seo优化网站教程百度_百度优化排名

本节讲如何从单一视角恢复出3D的场景信息,以及能够恢复3D信息需要哪些条件。


1. 基础知识

1.1 仿射变换与透视变换

2D平面中的仿射变换如下:
[ x ′ y ′ 1 ] = [ A 2 × 2 t 2 × 1 0 1 ] [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} A_{2\times 2} & t_{2\times 1} \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} xy1 =[A2×20t2×11] xy1
类似地,在3D空间中,定义仿射变换
[ x ′ y ′ z ′ 1 ] = [ A 3 × 3 t 3 × 1 0 1 ] [ x y z 1 ] \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} A_{3\times 3} & t_{3\times 1} \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} xyz1 =[A3×30t3×11] xyz1
如果左下角不再是0,而是一个向量 v v v,则称为透视变换
[ x ′ y ′ z ′ 1 ] = [ A 3 × 3 t 3 × 1 v 3 × 1 T b ] [ x y z 1 ] \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} A_{3\times 3} & t_{3\times 1} \\ v_{3\times1}^T & b \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} xyz1 =[A3×3v3×1Tt3×1b] xyz1

1.2 2D与3D平面点、线、面的表示

在2D平面中,一个直线可以表示为 a x 1 + b x 2 + c = 0 ax_1 + bx_2 + c = 0 ax1+bx2+c=0, 如果令
l = [ a b c ] , x = [ x 1 x 2 1 ] l = \begin{bmatrix} a \\ b \\ c \end{bmatrix} , x = \begin{bmatrix} x_1 \\ x_2 \\ 1 \end{bmatrix} l= abc ,x= x1x21
则直线上的点可以表示成 l T x = 0 l^Tx = 0 lTx=0. 注意这里 x x x是齐次坐标表示。

那么对于直线 l l l l ′ l' l,两条直线的交点怎么表示?实际上就是二者的叉乘,即 x = l × l ′ x = l \times l' x=l×l.

证明:

x x x l l l上—— l T x = l T ( l × l ′ ) l^Tx = l^T (l \times l') lTx=lT(l×l), 向量的叉乘垂直于任一向量,因此 l T ( l × l ′ ) = 0 l^T (l \times l')=0 lT(l×l)=0得证。

x x x l ′ l' l上同理。

在3D平面中,一般用直线的方向 d = [ a , b , c ] T d = [a, b, c]^T d=[a,b,c]T代表直线。一个直线由一个已知点 p 0 p_0 p0和方向向量决定,可以写成参数方程形式:
P ( t ) = p 0 + t d = [ x 0 + t a , y 0 + t b , z 0 + t c ] T P(t) = p_0 + td = [x_0 + ta, y_0 + tb, z_0 + tc]^T P(t)=p0+td=[x0+ta,y0+tb,z0+tc]T
判定一个点 p = [ x , y , z , 1 ] p = [x, y, z, 1] p=[x,y,z,1]在平面上,假设平面的法向量为 n = [ a , b , c ] n = [a, b, c] n=[a,b,c], 记 Π = [ a , b , c , d ] \Pi = [a, b, c, d] Π=[a,b,c,d], 有 Π ⋅ p = 0 \Pi\cdot p = 0 Πp=0.

判定一个线 l l l在平面上,有 l ⋅ [ a , b , c ] = 0 l \cdot [a, b, c] = 0 l[a,b,c]=0, 且直线上至少一个点在平面上.

2. 无穷远点,线,面

2.1 2D平面的无穷远点与直线

我们定义两个平行线的交点为无穷远点。在形式上,无穷远点的齐次坐标肯定是满足如下形式
x = [ x 1 x 2 0 ] x = \begin{bmatrix} x_1 \\ x_2 \\ 0 \end{bmatrix} x= x1x20
因为除以最后一个坐标0后,表示该点在无穷远处。

假设两个直线 l = [ a , b , c ] T , l ′ = [ a ′ , b ′ , c ′ ] T l = [a, b, c]^T, l' = [a', b', c']^T l=[a,b,c]T,l=[a,b,c]T平行,说明 a b = a ′ b ′ \frac{a}{b} = \frac{a'}{b'} ba=ba. 这两个直线的交点为
l × l ′ = det ⁡ ( [ i j k a b c a ′ b ′ c ′ ] ) = [ b c ′ − c b ′ − ( a c ′ − a ′ c ) a b ′ − a ′ b ] = [ b c ′ − c b ′ a ′ c − a c ′ 0 ] l \times l' = \det (\begin{bmatrix} i && j && k \\ a && b && c \\ a' && b' && c' \end{bmatrix}) = \begin{bmatrix} bc' - cb' \\ -(ac' - a'c) \\ ab' - a'b \end{bmatrix} = \begin{bmatrix} bc' - cb' \\ a'c - ac' \\ 0 \end{bmatrix} l×l=det( iaajbbkcc )= bccb(acac)abab = bccbacac0
所以也符合无穷远点的形式。

我们可以继续化简:
[ b c ′ − c b ′ a ′ c − a c ′ 0 ] = c ′ [ b − a 0 ] − c [ b ′ − a ′ 0 ] \begin{bmatrix} bc' - cb' \\ a'c - ac' \\ 0 \end{bmatrix} = c'\begin{bmatrix} b \\ -a \\ 0 \end{bmatrix} - c \begin{bmatrix} b' \\ -a' \\ 0 \end{bmatrix} bccbacac0 =c ba0 c ba0
我们又知道 a b = a ′ b ′ \frac{a}{b} = \frac{a'}{b'} ba=ba, 所以等号右边的两个向量其实是平行的,因此
[ b c ′ − c b ′ a ′ c − a c ′ 0 ] ∝ [ b − a 0 ] \begin{bmatrix} bc' - cb' \\ a'c - ac' \\ 0 \end{bmatrix} \propto \begin{bmatrix} b \\ -a \\ 0 \end{bmatrix} bccbacac0 ba0
定理:所有无穷远点都汇集在一条线上,称为无穷远直线,这条直线为 l = [ 0 , 0 , 1 ] T l = [0, 0, 1]^T l=[0,0,1]T

证明:

x = [ b , − a , 0 ] T x = [b, -a, 0]^T x=[b,a,0]T代入 l T x l^Tx lTx立即得到 l T x = 0 l^Tx = 0 lTx=0.

2.2 3D空间中的无穷远点、直线与平面

在3D空间中,类比2D空间可以得到,无穷远点应该具有以下形式:
x = [ x 1 x 2 x 3 0 ] x = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ 0 \end{bmatrix} x= x1x2x30
如果一个直线的方向向量为 d = [ a , b , c ] T d = [a, b, c]^T d=[a,b,c]T, 那么该直线的无穷远点坐标为 x = [ a , b , c , 0 ] T x = [a, b, c, 0]^T x=[a,b,c,0]T. 与这个直线平行的其他直线,交点也是同一个无穷远点。

说明:

直线上的点满足直线的参数方程: P ( t ) = p 0 + t d = [ x 0 + t a , y 0 + t b , z 0 + t c ] T P(t) = p_0 + td = [x_0 + ta, y_0 + tb, z_0 + tc]^T P(t)=p0+td=[x0+ta,y0+tb,z0+tc]T, 写成齐次坐标形式就是 [ x 0 + t a , y 0 + t b , z 0 + t c , 1 ] T [x_0 + ta, y_0 + tb, z_0 + tc, 1]^T [x0+ta,y0+tb,z0+tc,1]T.

我们把每个坐标都除以 t t t,这并不改变点的实际坐标,得到 [ ( x 0 + t a ) / t , ( y 0 + t b ) / t , ( z 0 + t c ) / t , 1 / t ] T [(x_0 + ta) / t, (y_0 + tb) / t, (z_0 + tc) / t, 1 / t]^T [(x0+ta)/t,(y0+tb)/t,(z0+tc)/t,1/t]T.

我们靠近无穷远点的形式,即令 t → ∞ t \to \infty t, 得到 [ a , b , c , 0 ] T [a, b, c, 0]^T [a,b,c,0]T. 所以,无穷远点坐标与 p 0 p_0 p0是无关了的,只与方向有关。

类似地,可以证明所有无穷远点都汇集在一个无穷远平面上,这个平面的法向量为 n ∞ = [ 0 , 0 , 0 , 1 ] T n_\infty = [0, 0, 0, 1]^T n=[0,0,0,1]T.

证明:

x = [ x 1 , x 2 , x 3 , 0 ] T x = [x_1, x_2, x_3, 0]^T x=[x1,x2,x3,0]T代入 n T x n^Tx nTx立即得到 n T x = 0 n^Tx = 0 nTx=0.

同样类比,两个平行平面,它们在无穷远处相交于一个公共线,叫做无穷远线。

可以这样理解:两个平面平行说明法向量 n 1 = α n 2 n_1 = \alpha n_2 n1=αn2, a l p h a alpha alpha为一常数。这可以解出法向量坐标之间的约束关系。按照类似2D平面的推导过程,一定存在一个(唯一)的直线 l l l满足 l l l既在 n 1 n_1 n1也在 n 2 n_2 n2.

3. 影消点和影消线

3.1 2D平面上无穷远点、线的变换

考虑透视变换 H = [ A 2 × 2 t 2 × 1 v 2 × 1 T b ] H = \begin{bmatrix} A_{2\times 2} & t_{2\times 1} \\ v_{2\times1}^T & b \end{bmatrix} H=[A2×2v2×1Tt2×1b], 我们看看无穷远点经过透视变换会映射成什么:
[ A t v b ] [ a b 0 ] = [ x y z ] \begin{bmatrix} A & t \\ v & b \end{bmatrix}\begin{bmatrix} a \\ b \\ 0 \end{bmatrix} = \begin{bmatrix} x \\ y \\ z \end{bmatrix} [Avtb] ab0 = xyz
足以见得 z = a v 1 + b v 2 z = av_1 + bv_2 z=av1+bv2不一定等于0. 所以,无穷远点经过透视变换不一定是无穷远点了。

相反,考虑仿射变换 H = [ A 2 × 2 t 2 × 1 0 1 ] H = \begin{bmatrix} A_{2\times 2} & t_{2\times 1} \\ 0 & 1 \end{bmatrix} H=[A2×20t2×11]
[ A t 0 1 ] [ a b 0 ] = [ x y z ] \begin{bmatrix} A & t \\ 0 & 1 \end{bmatrix}\begin{bmatrix} a \\ b \\ 0 \end{bmatrix} = \begin{bmatrix} x \\ y \\ z \end{bmatrix} [A0t1] ab0 = xyz
足以见得 z = 0 z =0 z=0. 所以,无穷远点经过仿射变换一定是无穷远点。

对于直线 l l l,假设变换后直线为 l ′ l' l, 对于 l l l上的点 x x x, 有 l T x = 0 l^Tx = 0 lTx=0, x x x变换后为 x ′ = H x x' = Hx x=Hx, 变换后的 x ′ x' x肯定在 l ′ l' l上:
l ′ T x ′ = 0 → l ′ T ( H x ) = 0 l'^Tx' = 0 \\ \to l'^T(Hx) = 0 lTx=0lT(Hx)=0
对比得 l T = ( l ′ T H ) → H T l ′ = l → l ′ = ( H T ) − 1 l l^T = (l'^T H) \to H^Tl' = l \to l' = (H^T)^{-1}l lT=(lTH)HTl=ll=(HT)1l.

有了变换公式后,如果是透视变换:
( [ A t v b ] T ) − 1 [ 0 0 1 ] = [ x y z ] (\begin{bmatrix} A & t \\ v & b \end{bmatrix} ^T)^{-1}\begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} x \\ y \\ z \end{bmatrix} ([Avtb]T)1 001 = xyz
显然 x , y x, y x,y不一定为0. 所以无穷远线在透视变换下不一定能够保持。

如果是仿射变换:
( [ A t 0 1 ] T ) − 1 [ 0 0 1 ] = [ A T 0 − t T A T 1 ] [ 0 0 1 ] = [ 0 0 1 ] (\begin{bmatrix} A & t \\ 0 & 1 \end{bmatrix} ^T)^{-1}\begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} =\begin{bmatrix} A^T & 0 \\ -t^TA^T & 1 \end{bmatrix} \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} ([A0t1]T)1 001 =[ATtTAT01] 001 = 001
所以无穷远线在仿射变换下一定能够保持。

3.2 影消点

**定义:**3D空间中的无穷远点,经过变换 M = K [ R , T ] ∈ R 3 × 4 M = K[R, T] \in \mathbb{R}^{3 \times 4} M=K[R,T]R3×4的变换后,映射到像素平面上的点 p = [ p 1 , p 2 , p 3 ] T p = [p_1, p_2, p_3]^T p=[p1,p2,p3]T. 经过上面的推导,对于一般的变换,无穷远点经过变换后往往不会再保持。所以,这个点 p p p就被称为影消点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们从影消点还能得到什么信息?

影消点与直线方向:直线方向 d = [ a , b , c ] T d = [a, b, c]^T d=[a,b,c]T(相机坐标系下)和影消点 v v v的关系是 v = K d v = Kd v=Kd.

在这里插入图片描述

证明:

前面说明了这两个平行直线上无穷远点的齐次坐标是 [ a , b , c , 0 ] T [a, b, c, 0]^T [a,b,c,0]T. 从相机坐标系到像素平面的映射为 M = K [ I , 0 ] = [ K , 0 ] M = K[I, 0] = [K, 0] M=K[I,0]=[K,0], 所以有

v = M p ∞ = K [ a , b , c ] T v =Mp_\infty = K[a, b, c]^T v=Mp=K[a,b,c]T.

v = K d v = Kd v=Kd立即得到( d d d是一个方向向量,模为1)
d = K − 1 v ∣ ∣ K − 1 v ∣ ∣ d = \frac{K^{-1}v}{||K^{-1}v||} d=∣∣K1v∣∣K1v

3.3 影消线

3D空间中,一个平面上的平行线交汇的无穷远点连起来在一条线上,即无穷远线。

根据前面的结论,无穷远线 l ∞ l_\infty l经过透视变换后,可以变换到像素平面上的直线 l h = ( H T ) − 1 l ∞ l_h = (H^T)^{-1}l_\infty lh=(HT)1l, 这个线称为影消线

在这里插入图片描述

为什么同一个平面的所有无穷远点共线?

设平行线方向向量为 [ a , b , c ] [a, b, c] [a,b,c], 则无穷远点齐次坐标 [ a , b , c , 0 ] [a, b, c, 0] [a,b,c,0]. 平面参数为 [ A , B , C , D ] [A, B, C, D] [A,B,C,D](即平面方程为 A x + B y + C z + D = 0 Ax +By + Cz +D = 0 Ax+By+Cz+D=0).

代入得 A a + B b + C c = 0 Aa + Bb +Cc = 0 Aa+Bb+Cc=0. 这实际上是2D平面上直线的方程(相当于2D平面齐次坐标为 [ a , b , c ] [a, b, c] [a,b,c], 直线参数为 A , B , C A, B, C A,B,C. 所以实际上,(齐次坐标的最后一个值为0使得这个方程)退化成了一条2D平面上的直线。这个线就是无穷远线。

影消线与平面法向量

3D空间中一个平面 π \pi π,其对应的无穷远线为 l ∞ l_\infty l, 映射到像素平面的影消线为 l h l_h lh, 那么该平面的法向量为:
n = K T l h n = K^Tl_h n=KTlh

证明:

对于 l ∞ l_\infty l上的一个点 P P P( P P P也在平面上),其投影到像素平面的坐标为 p = K [ I , 0 ] P p = K[I, 0]P p=K[I,0]P, p p p l h l_h lh上,所以

l h T ( K [ I , 0 ] P ) = 0 l_h^T(K[I, 0]P) = 0 lhT(K[I,0]P)=0

同时, P P P在平面上,

Π T P = 0 \Pi^TP = 0 ΠTP=0, 其中 Π = [ A , B , C , D ] T \Pi = [A, B, C, D]^T Π=[A,B,C,D]T表示平面方程的系数,法向量 n = [ A , B , C ] T n = [A, B, C]^T n=[A,B,C]T.

所以 Π T = l h T [ K , 0 ] \Pi^T = l_h^T[K, 0] ΠT=lhT[K,0], 对应地, n T = l T K n^T = l^T K nT=lTK. 也即 n = K T l h n = K^Tl_h n=KTlh.

截止目前,我们得到了如下核心结论:

  1. 影消点、直线方向和内参的关系:

    v = K d v = Kd v=Kd 或者 d = K − 1 v ∣ ∣ K − 1 v ∣ ∣ d = \frac{K^{-1}v}{||K^{-1}v||} d=∣∣K1v∣∣K1v

  2. 影消线,平面法向量和内参的关系:

    n = K T l h n = K^Tl_h n=KTlh

3.4 3D重构

知道了前面的铺垫,我们现在开始重建3D场景。

为了估计相机的内参,我们还需要借助一个信息,即一个平面内两组平行线的夹角与影消点

有两组平行线,方向向量分别为 d 1 , d 2 d_1, d_2 d1,d2. 在像素平面上的影消点为 v 1 , v 2 v_1, v_2 v1,v2:

在这里插入图片描述

在3D空间中,两组平行线的夹角为 θ \theta θ, 其也是方向向量的夹角。所以:
cos ⁡ θ = d 1 ⋅ d 2 ∣ d 1 ∣ ∣ d 2 ∣ = ( ∣ d ∣ = 1 ) d 1 ⋅ d 2 \cos \theta = \frac{d_1 \cdot d_2}{|d_1||d_2|} = (|d| = 1) d_1 \cdot d_2 cosθ=d1∣∣d2d1d2=(d=1)d1d2
借助我们前面知道的第一条信息,得到
cos ⁡ θ = ( K − 1 v 1 ) T ( K − 1 v 1 ) T K − 1 v 1 K − 1 v 2 ( K − 1 v 2 ) T K − 1 v 2 = v 1 ω v 2 v 1 T ω v 1 v 2 T ω v 2 \cos \theta = \frac{(K^{-1}v_1)^T}{\sqrt{(K^{-1}v_1)^TK^{-1}v_1}} \frac{K^{-1}v_2}{\sqrt{(K^{-1}v_2)^TK^{-1}v_2}} = \frac{v_1 \omega v_2}{\sqrt{v_1^T \omega v_1}\sqrt{v_2^T \omega v_2}} cosθ=(K1v1)TK1v1 (K1v1)T(K1v2)TK1v2 K1v2=v1Tωv1 v2Tωv2 v1ωv2
其中 ω = ( K − 1 ) T K − 1 \omega = (K^{-1})^T K^{-1} ω=(K1)TK1.

如果我们找在3D世界中 垂直的一组平行线(这里的一组指的是一对平行线 d 1 d_1 d1和一对平行线 d 2 d_2 d2),则cos为0,得到方程 v 1 ω v 2 = 0 v_1 \omega v_2 = 0 v1ωv2=0. 内参矩阵有5个自由度,所以需要5组方程(5组平行线)来解。

我们可以把 K K K的表达式代入 ω \omega ω, 可以发现 ω \omega ω是一个对称矩阵,且有以下结论:

  1. ω 12 = 0 \omega_{12} = 0 ω12=0, 说明像素零倾斜(即内参矩阵中的 θ \theta θ为90)。
  2. 如果 ω 11 = ω 22 \omega_{11} = \omega_{22} ω11=ω22, 说明像素点的宽高比为1(方形像素, α = β \alpha = \beta α=β)。

不妨做这两个假设(像素零倾斜,且方形像素),这样 ω \omega ω的自由度减少为3. 这样我们找三组平行线即可。

解出 ω \omega ω后,就可以得到内参矩阵 K K K.

得到 K K K之后,根据像素平面的影消线,就可以得出对应平面的法向量 n = K T l h n = K^Tl_h n=KTlh.

例子:

在这里插入图片描述

  1. 找三个平面,可以取绿色、红色和地面,在这三个平面中各找一组平行线(要垂直!满足 cos ⁡ θ = 0 \cos \theta = 0 cosθ=0),并计算出像素平面的影消点。由此估计出内参矩阵 K K K.
  2. 对于每个平面,找一组平行线画出影消线(像素平面),根据 n = K T l h n = K^Tl_h n=KTlh重构出平面的法向量。但是不是所有的平面都能重建,比如这个人。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com