北邮鲁鹏老师的课程《计算机视觉之三维重建(深入浅出sfm和SLAM核心算法)》 笔记
3,单视几何
3.1 2D
直线
平面上直线用
l
=
(
a
,
b
,
c
)
T
l=(a,b,c)^T
l=(a,b,c)T来表示,点
x
=
(
x
,
y
,
1
)
T
x=(x,y,1)^T
x=(x,y,1)T,直线上的点:
l
T
x
=
0
l^Tx=0
lTx=0 直线的法向量:
n
⃗
=
(
b
,
−
a
)
\vec n=(b,-a)
n=(b,−a) 直线的方向向量:
d
⃗
=
(
a
,
b
)
\vec d=(a,b)
d=(a,b) 两直线
l
,
l
′
l,l'
l,l′的交点:
x
=
l
×
l
′
x=l\times l'
x=l×l′
无穷远点线
两条平行线相交于无穷远点,可得直线
l
l
l的无穷远点:
x
∞
=
(
b
,
−
a
,
0
)
T
x_\infty=(b,-a,0)^T
x∞=(b,−a,0)T
x ∞ = l × l ′ = ( a , b , c 1 ) × ( a , b , c 2 ) = ( b c 2 − b c 1 , − ( a c 2 − a c 1 ) , a b − a b ) = ( b , − a , 0 ) x_\infty=l\times l'=(a,b,c_1)\times(a,b,c_2)=(bc_2-bc_1,-(ac_2-ac_1),ab-ab)=(b,-a,0) x∞=l×l′=(a,b,c1)×(a,b,c2)=(bc2−bc1,−(ac2−ac1),ab−ab)=(b,−a,0)
所有的无穷远点形如
(
x
,
y
,
0
)
T
(x,y,0)^T
(x,y,0)T,形成的无穷远线为:
l
∞
=
(
0
,
0
,
1
)
T
l_\infty=(0,0,1)^T
l∞=(0,0,1)T
3.2 3D
平面
3维空间中平面
Π
=
(
a
,
b
,
c
,
d
)
T
\Pi=(a,b,c,d)^T
Π=(a,b,c,d)T,点
x
=
(
x
,
y
,
z
,
1
)
T
x=(x,y,z,1)^T
x=(x,y,z,1)T,平面上的点:
Π
T
x
=
0
\Pi^Tx=0
ΠTx=0 平面的法向量:
n
=
(
a
,
b
,
c
)
T
n=(a,b,c)^T
n=(a,b,c)T
直线
三维空间中直线可用两个平面相交得到,这种表示略繁琐,这边只关心直线的方向,用直线的方向
d
d
d来表示直线
l
l
l:
d
=
(
a
,
b
,
c
)
T
d=(a,b,c)^T
d=(a,b,c)T
无穷远
直线
l
l
l的无穷远点为:
l
∞
=
(
a
,
b
,
c
,
0
)
T
l_\infty=(a,b,c,0)^T
l∞=(a,b,c,0)T
l l l上的点可表示成 x = ( a λ , b λ , c λ , 1 ) T x=(a\lambda,b\lambda,c\lambda,1)^T x=(aλ,bλ,cλ,1)T,即 x = ( a , b , c , 1 λ ) T x=(a,b,c,\frac{1}{\lambda})^T x=(a,b,c,λ1)T
x ∞ = lim λ → ∞ ( a , b , c , 1 λ ) T = ( a , b , c , 0 ) T x_\infty=\lim_{\lambda\rightarrow\infty}(a,b,c,\frac{1}{\lambda})^T=(a,b,c,0)^T x∞=limλ→∞(a,b,c,λ1)T=(a,b,c,0)T
所有的无穷远点形成的无穷远面:
Π
∞
=
(
0
,
0
,
0
,
1
)
T
\Pi_\infty=(0,0,0,1)^T
Π∞=(0,0,0,1)T
3.3 影消点影消线
在相机坐标系下,直线
l
l
l的方向
d
=
(
a
,
b
,
c
)
T
d=(a,b,c)^T
d=(a,b,c)T,其无穷远点为
x
∞
=
(
a
,
b
,
c
,
0
)
T
x_\infty=(a,b,c,0)^T
x∞=(a,b,c,0)T,在投影在图像上的点成为影消点为
v
v
v:
v
=
K
d
v=Kd
v=Kd
d
=
K
−
1
v
∥
K
−
1
v
∥
d=\frac{K^{-1}v}{\|K^{-1}v\|}
d=∥K−1v∥K−1v
v = M x ∞ = K [ I , 0 ] [ a b c 0 ] = K [ a b c ] = K d v=Mx_\infty=K[I,0]\left[\begin{array}{c}a\\b\\c\\0\end{array}\right]=K\left[\begin{array}{c}a\\b\\c\end{array}\right]=Kd v=Mx∞=K[I,0]⎣⎢⎢⎡abc0⎦⎥⎥⎤=K⎣⎡abc⎦⎤=Kd
平面
Π
\Pi
Π的法向量为
n
n
n,其无穷远线
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 = ( a , b , c , 0 ) T P=(a,b,c,0)^T P=(a,b,c,0)T在图像上的影消点 v v v, l h T v = 0 l_h^Tv=0 lhTv=0
所以 l h T K d = 0 l_h^TKd=0 lhTKd=0
平面 Π \Pi Π上的直线方向 d d d都垂直与 n n n,有 n T d = 0 n^Td=0 nTd=0
⇒ n = K T l h □ \Rightarrow n=K^Tl_h\square ⇒n=KTlh□
3.4 单视重构
两条直线
d
1
,
d
2
d_1,d_2
d1,d2的夹角为
θ
\theta
θ,影消点
v
1
,
v
2
v_1,v_2
v1,v2,令
ω
=
(
K
K
T
)
−
1
\omega=(KK^T)^{-1}
ω=(KKT)−1:
cos
θ
=
v
1
T
ω
v
2
v
1
T
ω
v
1
v
2
T
ω
v
2
\cos\theta=\frac{v_1^T\omega v_2}{\sqrt{v_1^T\omega v_1}\sqrt{v_2^T\omega v_2}}
cosθ=v1Tωv1v2Tωv2v1Tωv2
cos θ = d 1 T d 2 ∥ d 1 T d 2 ∥ = ( K − 1 v 1 ) T ∥ K − 1 v 1 ∥ K − 1 v 2 ∥ K − 1 v 2 ∥ = v 1 K − T K − 1 v 2 v 1 K − T K − 1 v 1 v 2 K − T K − 1 v 2 = v 1 T ω v 2 v 1 T ω v 1 v 2 T ω v 2 \cos\theta=\frac{d_1^Td_2}{\|d_1^Td_2\|}=\frac{(K^{-1}v_1)^T}{\|K^{-1}v_1\|}\frac{K^{-1}v_2}{\|K^{-1}v_2\|}=\frac{v_1K^{-T}K^{-1}v_2}{\sqrt{v_1K^{-T}K^{-1}v_1}\sqrt{v_2K^{-T}K^{-1}v_2}}=\frac{v_1^T\omega v_2}{\sqrt{v_1^T\omega v_1}\sqrt{v_2^T\omega v_2}} cosθ=∥d1Td2∥d1Td2=∥K−1v1∥(K−1v1)T∥K−1v2∥K−1v2=v1K−TK−1v1v2K−TK−1v2v1K−TK−1v2=v1Tωv1v2Tωv2v1Tωv2
直线垂直时,
cos
θ
=
0
⇒
\cos\theta=0\Rightarrow
cosθ=0⇒
v
1
T
ω
v
2
=
0
v_1^T\omega v_2=0
v1Tωv2=0
单视标定
找到空间中相互垂直的三个平面的图像(一般房屋都具有此性质),并在图像上找出三条互相垂直线的影消点
v
1
,
v
2
,
v
3
v_1,v_2,v_3
v1,v2,v3,则得到方程:
{
v
1
T
ω
v
2
=
0
v
2
T
ω
v
3
=
0
v
3
T
ω
v
1
=
0
\left\{\begin{array}{l}v_1^T\omega v_2=0\\ v_2^T\omega v_3=0\\ v_3^T\omega v_1=0 \end{array}\right.
⎩⎨⎧v1Tωv2=0v2Tωv3=0v3Tωv1=0 如果相机是零倾斜,且方像素,则
K
K
K有三个自由度,所以
ω
\omega
ω有三个自由度,则可以求解方程组得到相机的内参数。
单视重构
求得
K
K
K后,可以在图像上找出一个平面的影消线
l
h
l_h
lh,通过
n
=
K
T
l
h
n=K^Tl_h
n=KTlh可恢复该平面的三维信息。
单视重构需要知道一些先验信息,如平行线、垂直线,且这些都需要人工去图像上做标记,适用于有大量平行线的场景中。