计算相机运动

对极几何——单目相机

假设,能在相片1、相片2中,都找到同名点P1、P2、...Pn

 

说明:

1. 相机中心为O1,O2

2. 相机从I1到I2之间,有旋转R,位移t

3. P点在照片I1,I2的上的点,为p1,p2,并且有很多这样的P点。(p1对应p2 通过图像算法的特征匹配来获得一个匹配索引,I1的[n,m]对应I2的[i, j ])

4. O1、O2、P形成的面,叫【极平面】

5. O1、O2 与相片平面的交点e1,e2,叫【极点】

6. O1、O2 的连线,叫【基线】

7. O1O2P面,与I1,I2面的交线,叫【极线】

根据 : 相机模型 - 耀礼士多德 - 博客园 (cnblogs.com)

 

说明:

1. P在 I坐标系下坐标为[X,Y,Z]T,有: Zp1 = KP , 此处 p1 = [u1,v1,1]。

 

 

2. P在I2坐标系下的坐标为 RP + t (相机旋转了R,位移了t),有: Z2p2 = K(RP + t ) , 此处 p2 = [u2,v2,1]

(注意,这只是一个模型,已有XYZ都是无法得知的,因为距离Z得不到)

 

可以令:

1.  p1 = Z1 [u1, v1, 1 ], p2 =Z2 [u2  , v2  , 1  ], 先令:p1 = KP,p2 = K(RP + t ) 

2.  x1 = K-1p( x1 实际上不就是P ?) ,x2 = K-1p2, 那么有:x2 = Rx1 + t, x2是P在I2坐标系下的坐标,因为p2 = Kx2

3. x1、x2、与向量t做叉积,  相当于  t^x=  t^Rx+ 0

4.  上面式子,左右两边乘以 x2T ,    x2Tt^x=  x2Tt^Rx1

5. t^x2就是一个向量,垂直于t 与 x2形成的面,那么 x2Tt^x2 = 0

7. x2Tt^Rx1 = 0

8. 代入p, p2得到     (K-1p2)Tt^R K-1p1  = 0 , 即:p2T (K-1)Tt^R K-1p1  = 0, (K-1)T写成  K-T ,那么:p2K-Tt^R K-1p1  = 0

 注意:这里p1 = Z1 [u1, v1, 1 ], p2 =Z2 [u2  , v2  , 1  ],可以将Z1 ,Z2 消去,得到下面式子,而下面式子 p1 =   [u1, v1, 1 ], p2 =   [u2, v2, 1 ]

对极约束——p2K-Tt^R K-1p1  = 0 

令:

1. 【本质矩阵】 E = t^R 

2. 【基础矩阵】F = K-TE K-1

那么,有:

1. x1 = K-1p1

2. x2 = K-1p2

3. x2TEx1 = 0

 


 

假设  A是本质矩阵,A = t^R = TR(t是相机位移,R是相机旋转)

A = U3*3 3*3 V3*3T.........(1)

由奇异值分解的性质,有:

UUT= I, VVT = I

AAT = TR(TR)T = TRRTTT = TTT .......(2), 因为 RRT = I

 AAT = (U∑VT)(U∑VT)T = U∑VTV∑UT = U∑²UT......(3) 因为 VVT = I

U是AAT 的特征向量,∑²是AAT的特性值。意思是,得到∑²就能得到A的特征值

 由(2)得:

 

 解: | λE - TTT |  = λ( k - λ)² = 0 , k = t1² +  t2² +  t3² = k

 那么∑²对角为 λ1 = 0, λ2 = k,λ3 = k

 那么 【本质矩阵A】的特征值为0,√k , √k (两个相等,一个为0)


 

矩阵知识补充:

1. P是正交矩阵,那么 PPT= PP-1=  I,从而PT = P-1

2.  已知A是对称矩阵,那么一定有 A = Q∑QT SVD分解 - 耀礼士多德 - 博客园 (cnblogs.com)

那么,如果有正交矩阵P,PTAP  = D,D是A的特征值对角矩阵。 证明:

PTAP  = D 等价于 P-1AP = D, 因为P= P-1

 P-1AP = D 等价于 A = PDP-1

A = PDP-1等价于A = PDPT, 形式和A = Q∑QT 一致,那么D = ∑


 

观测     x2TEx1 = 0 ,E乘以任意常数,等式依然成立,那么:

1. x1 = K-1p1 = Z1K-1[u1,v1,1]T   

2. x2 = K-1p2 = Z2K-1 [u2,v2,1] T 

先抛开   Z1, Z2,或者令Z1,Z2融入到E中,那么:

1. E ' =  Z1 Z2 E ,x1 =K-1[u1,v1,1]T  , x2 =K-1[u2,v2,1]T   (E本身各个元素都未知的)

2 . 对于 x1 ,它可以变为Z归一化的坐标令  x1  =  k1x1 , x1 = [u1,v1,1 ] ,注意:这个u1,v1 和  p1 = [u1,v1,1]的含义不同,他是归一化算出来的,p1直接是照片中的位置

3 . 对于 x,它可以变为Z归一化的坐标令  x2  =  k2x2 x2 = [u2,v2,1 ] 

4. 那么 E '' =k1 kZ1 Z2 E  , E相当于乘以一个常数而已,k1 kZ1 Z2 相当于一个尺度常数。 

 那么,有x2TE''x1 = 0,左右两边乘以 1 / k1 kZ1 Z2,可以得到:

 

解出E‘’,就能解出E

变换一下:

 

 

 *因为方程是   Ax = 0的形式,所以不能用最小二乘法了,因为ATAx = AT0 无什么意义,只能用8个点解8个未知数

A8*9E9*1 = 0

如果A的各个行线性无关,那么e = 0 , 或e是一条直线,垂直于行空间。

那么e = ce1 , e1为其中一个特解,可以让其为单位向量

 一般来说,特征点大于8个,可以使用最小二乘解:

 

 解 : ATAE = 0


 

已知A的奇异值为σ,σ,0

那么:ATA =    V∑UTU∑VT = V∑²VT

 ∑² =  diag(σ,σ,0)

那么,有:

PTATA P = PTV∑²VTP , 若 P = V,那么:PTATA P =∑² = Λ 

令:

B = PTAP  , 将B = (b1,b2,b3) , b1,b2,b3 都是 3 *1 的

BTB = (PTAP)T(PTAP) = PTATPPTAP = PTATAP = Λ = diag(σ,σ, 0)

展开:

 

 b1Tb1 = b2Tb2 = σ

 b1Tb2 = b1Tb3 = b2Tb3 = 0

取正交矩阵 Q1 = (c1,c2,c3) , 令:

c1 = b1 / √σ

c2 = b2 / √σ

c3Tc3 = 1

c3Tb1 = 0

c3Tb2 = 0

(那 c3 = c1 x c2 ,并单位化)

Q2

 那么,Q1TPTAPQ2 = Q1TBQ2 ,定义为D

 

Q1TPTAPQ2 = D

A =  (Q1TPT)TD(PQ2)T = PQ1DQ2TPT 

P与Q1为正交矩阵,那么Q1P正交矩阵,(PQ1)T PQ1= I。( Q1P(Q1P)T = I)

A =   PQ1D I Q2TPT  = PQ1D  (PQ1)T PQ1 Q2TPT

令:

T = PQ1D   (PQ1)T

R = PQQ2TPT,R为正交矩阵。(正交矩阵乘以正交矩阵,结果为正交矩阵)

A = TR

又 DT = -D , TT = [  PQ1D   (PQ1)T ] T =  PQ1DT(PQ1)T   =  - PQ1D(PQ1)T = -T,T为反对称矩阵

 


 

求出E后,对E进行SVD分解

E = U∑VT

主要是为了得到 U和V,而∑可以是:

diag(σ12 / 2,σ+ σ2 / 2,0),或直接(1,1,0)

根据上面,有

本质矩阵A =   PQ1I Q2TPT = TR = t^R

其中:

T = PQ1D   (PQ1)T

R = PQQ2TPT

由有罗德里格斯公式:R = cosθ·I + ( 1 - cosθ)nnT + sinθ·n^

 令:

θ  = Π / 2

n =  [0,0,1]

那么Rz(Π / 2),表示绕Z轴旋转Π / 2 ,为:

 

 

RzT(Π / 2)  = Q2............................(1)

Rz( - Π / 2) =  Q2 = RzT(Π / 2)

RzT( - Π / 2) =  Q2T............................(2)

又:

A = U∑VTPQ1D Q2TP= TR = t^R

直接可以得到:

U = PQ1, 都是正交

∑ = D Q2T =  - diag(σ,σ,0), √σ 刚好为A的特征值

V = P

t^  =  T = PQ1D   (PQ1) = U D U,  又 ∑ = D Q2T , D = ∑Q2

那么,t^ = U Q2 U = U ∑Rz( - Π / 2)  U ,  或 t = U ∑Rz(  Π / 2)  U

R = PQQ2TPT = U RzT( - Π / 2) VT , 或 R =  U RzT(  Π / 2) VT

 

 

 t1,t2是互为相反的

如何判断是哪种解?

因为已经有 z2p2 = K(RP+t), 4个解都代一下,得到z2大于0的那一种,就是物体在相机前的那种,就是真正的解。

 


 

对于任意的旋转矩阵R,和三维向量v,有:

(Rv)^ = Rv^RT

证明:

∀u∈R3,Rv x Ru = R(v x u),v x u 是一个向量,垂直于 v和u。先叉积再旋转,等价于先旋转再叉积。

等价于(Rv) ^ Ru = Rv^u

等价于(Rv) ^ R = Rv^ 

等价于(Rv) ^  = Rv^ RT (RRT = I)

 


单应矩阵

如果两张照片匹配好的特征点,在现实中位于同一平面上时,有:

nTP+ d = 0,

- nTP / d  = 1

n是平面法向量,P是点的坐标。

又:

 z2p2 = K(RP + t)

    = K(RP + t * 1)

         = K(RP + t * - nTP / d)

         =  K(R + t * - nT / d) P

又:

z1p1 = KP

P = K-1(z1p1) 

 z2p2 = K(R + t * - nT / d) K-1(z1p1) 

令:

H3*3  = K(R  - t *  nT / d) K-1 , 为【单应矩阵】

 z2p2 = H(z1p1)  

令:

H = z1/z2 * H, 相对于将深度信息融到H阵中 

 

u2 = h1 * u1 + h2 * v1 + h3

v2 = h4 * u1 + h5 * v1 + h6

1 =   h7 * u1 + h8 * v1 + h9

 等价于:

 

令 h9 =1

 

 

 

 


 

直接线性变换(DLT)——求深度

设某个点在I1中的相机空间坐标为 P = [X,Y,Z,1] T

投影到照片上的特征点x1 = [u1,v1,1] T (归一化坐标)

他们有如下关系:

 

 (这个3 x 4的矩阵,包含了旋转、平移、内参的信息,但是揉到一起了)

(以前是这个模型的)

消去最后一行(注意消去的方法,消去但不减少元素个数)

 令:

 

 

 

 


 P3P——得到点在相机坐标系下的3D坐标

 

 已知ABC三点,在【世界坐标系】下的坐标

(ABC的面,不一定平行于abc面)

 根据余弦定理:

 

 

 

 

 

 

 a,b,c在图像上的位置是已知的,焦距f也是已知的,因此:

cos<a,b>、cos<b,c>、cos<a,c>

都是已知的

u = BC² / AB² 、w = AC² / AB²

u、w也可以根据A、B、C三点得到

 


 

PNP

先求相机位姿,再求空间点位置

假设三维空间点P([X,Y,Z]T

根据相机位姿的变化R、t,有

 (a就是P,a‘就是第二个位置下,P的相机坐标系坐标P’)

又知道相机内参K,对于每张照片,都有:

 

 展开:

 

 

 

 两个公式结合,得到在第二张照片下,P点在照片上的位置:

(si就等于Z)

 

 

 

 

相机位姿,可以先有一个估计值T0,(假设旋转了多少,位移了多少),可以推测在照片I2上,位置是p2

实际上,拍下的照片的位姿是p2

 有T0,转换为对应李代数Φ

T = exp(ξ^)

目标求得:

 (ui也就是照片上的p2

对上式 e = 1 / 2 ∑(ui  - 1 / si * KTPi)²求导,并使其为0,实际上是对ξ求导:

但是对ξ求导比较复杂,改为使用扰动模型:T = ΔTT0 = exp(δξ^)exp(ξ^),δξ是ΔT对应的李代数

又  :

1. P'  = TP=ΔTT0 P( 在第二张照片上)

2. 

所以:

..............................(1) 

接下来求:∂P‘ / ∂δξ

 

 P' = RP + t

............................................(2)

 

 (1)(2)相乘:

 


 

ICP

参考:用SVD求解ICP问题的完整证明 - 知乎 (zhihu.com)

相机在两个位置,分别测得相机坐标系下的点:

1. P = {p1, p2,...pn}

2. P' = {p'1, p'2,...p'n}

∀i,p = Rp' + t,p'是前一帧

误差模型:

e = p  - (Rp' + t)

求:(R,t) = argmin 1 / 2 * ∑ || pi  - (Rp'i + t) ||²

求质心:

p = 1 / n * ∑(pi)

p' = 1 / n * ∑(p'i)

将误差模型改为:

e =  pi  - (Rpi' + t)

   =  pi - Rpi' - t  (- p + Rp' + p  - Rp')

(红色部分为0)

1 / 2 * ∑ || pi  - (Rp'i + t) ||²  

  = 1 / 2 * ∑ || pi - Rpi' - t  - (- p + Rp' + p  - Rp') ||² 

  = 1 / 2 * ∑ || ( pi - p - R(p'i-p') ) p - Rp' - t || ²

       = 1 / 2 * ∑ (  || ( pi - p - R(p'i-p') ) || ² ||p - Rp' - t || ²   + 2 *  ( pi - p - R(p'i-p') )T ( p - Rp' - t) 

 

1 / 2 * ∑ *  2 *  ( pi - p - R(p'i-p') )T *  ( p - Rp' - t) 

  = ∑   ( pi - p - R(p'i-p') )T *  ( p - Rp' - t)  ( 看作是常数项,和i无关的)

       =    (p1 + p2 +...pn  - np - R( p'1+ p'2 + ...p'n  - np'  ))T *  ( p - Rp' - t)    

  又有(p = 1 / n * ∑(pi)、p' = 1 / n * ∑(p'i))

       =  (0 - 0)T *  ( p - Rp' - t)

       =  0

 

目标变为:(R,t) = argmin  1 / 2 * ∑ (  || ( pi - p - R(p'i-p') ) || ² +  ||p - Rp' - t || ² ) (红色部分既有R也有t)

可以将目标分解,先求 t =   argmin ||p - Rp' - t || ²

 ||p - Rp' - t || ² = -pTt + (Rp')Tt - tTp + tTRp' + tTt

 ∂||p - Rp' - t || ² /  ∂t  =   - p + Rp' - p  +  Rp' + 2t                      

            = -2p + 2Rp' + 2t

令: ∂||p - Rp' - t || ² /  ∂t  = 0 

得到 :  t = p - Rp'(解算完R后,就可以这样求t)

 将t代入:(R,t)=  argmin 1 / 2 * ∑ || pi  - (Rp'i + t) ||²

(R,t)=  argmin 1 / 2 * ∑ || pi  - (Rp'i  +  p - Rp') ||²

           =   argmin 1 / 2 * ∑ || pi  - (Rp'i  +  p - Rp') ||²

           =   argmin 1 / 2 * ∑ || pi - p - R(p'i - p )  ||²

(推到最后,其实就是先通过重心化坐标,干掉t,只剩下旋转了)

那么,令重心化坐标为:

qipi - p

q‘ip'i - p'

R =  argmin 1 / 2 * ∑ || qi  - Rq'i  ||²

|| qi  - q‘i  ||² = (qi  - Rq'i)T(qi  - Rq'i)

                   = qiTqi  +  q'iTRTRq'i -  q'iTRTqi -    qiTRq' (  RTR = I )

                   = qiTqi  +  q'iTq'i  - 2qiTRq'i 

R =  argmin 1 / 2 * ∑  qiTqi  +  q'iTq'i  - 2qiTRq'i 

等价于

R = argmax  qiTRq'i 

补充知识:向量a、b 点积, d是一个数 :  d =   aTb = tr(baT) , baT是矩阵,d等于这个矩阵的迹

那么:

R = argmax  qiT(Rq'i

   = argmax  tr (Rq'i )qiT

   = argmax   tr (R  q'i qiT)

令:  (q'i )qiT =  MT3*3

R = argmax tr (R MT)

找到一个R,使得 tr (R MT)最大

M进行分解: M = U∑VT

 tr (R MT) = tr(RV∑UT)

      = tr(∑UTRV)   

补充知识:tr(AB) = tr(BA)

补充知识:R是正交,V也是正交,所以RV也是正交

*∑UT 也是正交

又SVD有如下性质:

 | ui| = 1、 | wi| = 1

所以,当 cos<ui,wi> = 1,tr(∑UTRV) 取得最大值 σ1 + σ2 + σ

观测上式:

tr(∑UTRV)   = σ1 + σ2 + σ

那么:tr(∑UTRV) = tr(∑ I)   = σ1 + σ2 + σ

当:U = (RV) , 才有 (RV)TRV  = I

所以: U = RV

R = UVT

可以参考:用SVD求解ICP问题的完整证明 - 知乎 (zhihu.com)


 

使用李代数迭代求解ICP

pi = Tpi'

等价于:

pi = exp(ξ^)pi'

e = 1 / 2 ∑ || pi - exp(ξ^)pi' ||²

 

 说明:f( x + Δx )在这里是误差函数

 

 

T = ΔTT0

T = exp(δξ^)exp(ξ0^), ξ0^ 是4 * 4的,δξ、ξ0 是 6 *1向量,∂e/ ∂(δξ)是 4* 6 的

令ei = pi - Tpi'

ei进行泰勒一级展开:

ei = pi - exp(δξ0^)exp(ξ0^)pi'  + ∂ei/∂(δξ) * Δδξ0

exp(δξ0^)exp(ξ0^) = exp(δξ0^+ ξ0^) 

δξ0 = [0,0,0,0,0,0]T 

那么:exp(δξ0^)exp(ξ0^)  = exp(ξ0^) = T0

因此:

ei = pi - T0pi'  + ∂ei/∂(δξ) * Δδξ

误差函数:

 f(T)  =   1 / 2 ∑ || pi - T0pi'  + ∂ei/∂(δξ) * Δδξ0||² 

 令:fi  =  pi - T0pi' ,Ji  * Δδξ0   = ∂ei/∂(δξ) * Δδξ0

  f(T)  =   1 / 2 ∑ || fi  + Ji * Δδξ0||² 

         =   1 / 2 ∑ (fi  + Ji * Δδξ)T(fi  + Ji * Δδξ)

    =  1  / 2 ∑  fiTfi   + fiTJiΔδξ0    ΔδξTJiTfi +  ΔδξTJiTJi * Δδξ  

         =  1  / 2 ∑  fiTfi   +  2 * fiTJiΔδξ0   +  ΔδξTJiTJi * Δδξ    

对Δδξ求导,并令其为0:

 ∑ Jf+ JiTJi * Δδξ     = 0

 Δδξ  *  JiTJi       =  - ∑ Jf

解得  Δδξ

δξ = δξ0 + Δδξ = [0,0,0,0,0,0]T + Δδξ = Δδξ

T = ΔTT= exp(δξ^)exp(ξ0^) 

继续迭代


 

补充知识

 

 

 

 

 


 

posted on 2022-12-14 15:52  耀礼士多德  阅读(76)  评论(0编辑  收藏  举报