计算相机运动
对极几何——单目相机
假设,能在相片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在 I1 坐标系下坐标为[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-1p1 ( x1 实际上不就是P ?) ,x2 = K-1p2, 那么有:x2 = Rx1 + t, x2是P在I2坐标系下的坐标,因为p2 = Kx2
3. x1、x2、与向量t做叉积, 相当于 t^x2 = t^Rx1 + 0
4. 上面式子,左右两边乘以 x2T , x2Tt^x2 = x2Tt^Rx1
5. t^x2就是一个向量,垂直于t 与 x2形成的面,那么 x2Tt^x2 = 0
7. x2Tt^Rx1 = 0
8. 代入p1 , p2得到 (K-1p2)Tt^R K-1p1 = 0 , 即:p2T (K-1)Tt^R K-1p1 = 0, (K-1)T写成 K-T ,那么:p2T K-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 ]
对极约束——p2T K-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, 因为PT = 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 . 对于 x2 ,它可以变为Z归一化的坐标令 x2 = k2x2, x2 = [u2,v2,1 ]
4. 那么 E '' =k1 k2 Z1 Z2 E , E相当于乘以一个常数而已,k1 k2 Z1 Z2 相当于一个尺度常数。
那么,有x2TE''x1 = 0,左右两边乘以 1 / k1 k2 Z1 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 = PQ1 Q2TPT,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(σ1+σ2 / 2,σ1 + σ2 / 2,0),或直接(1,1,0)
根据上面,有
本质矩阵A = PQ1D I Q2TPT = TR = t^R
其中:
T = PQ1D (PQ1)T
R = PQ1 Q2TPT
由有罗德里格斯公式: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∑VT= PQ1D Q2TPT = TR = t^R
直接可以得到:
U = PQ1, 都是正交
∑ = D Q2T = - diag(√σ,√σ,0), √σ 刚好为A的特征值
V = P
t^ = T = PQ1D (PQ1)T = U D UT , 又 ∑ = D Q2T , D = ∑Q2
那么,t^ = U ∑Q2 U = U ∑Rz( - Π / 2) U , 或 t = U ∑Rz( Π / 2) U
R = PQ1 Q2TPT = 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' = TPi =ΔTT0 Pi ( 在第二张照片上)
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,只剩下旋转了)
那么,令重心化坐标为:
qi = pi - p
q‘i = p'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'i ( 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 + σ3
观测上式:
tr(∑UTRV) = σ1 + σ2 + σ3
那么:tr(∑UTRV) = tr(∑ I) = σ1 + σ2 + σ3
当:UT = (RV)T , 才有 (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向量,∂ei / ∂(δξ)是 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:
∑ Jfi + JiTJi * Δδξ = 0
Δδξ * ∑ JiTJi = - ∑ Jfi
解得 Δδξ
δξ = δξ0 + Δδξ = [0,0,0,0,0,0]T + Δδξ = Δδξ
T = ΔTT0 = exp(δξ^)exp(ξ0^)
继续迭代
补充知识