北邮鲁鹏老师的课程《计算机视觉之三维重建(深入浅出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可恢复该平面的三维信息。
单视重构需要知道一些先验信息,如平行线、垂直线,且这些都需要人工去图像上做标记,适用于有大量平行线的场景中。