SLAM入門之視覺里程計(5):單應矩陣
在之前的博文OpenCV,計算兩幅影象的單應矩陣,介紹呼叫OpenCV中的函式,通過4對對應的點的座標計算兩個影象之間單應矩陣HH,然後呼叫射影變換函式,將一幅影象變換到另一幅影象的視角中。當時只是知道通過單應矩陣,能夠將影象1中的畫素座標(u1,v1)(u1,v1)變換到影象2中對應的位置上(u2,v2)(u2,v2),而沒有深究其中的變換關係。
單應(Homography)是射影幾何中的概念,又稱為射影變換。它把一個射影平面上的點(三維齊次向量)對映到另一個射影平面上,並且把直線對映為直線,具有保線性質。總的來說,單應是關於三維齊次向量的一種線性變換,可以用一個3×33×3的非奇異矩陣HH表示
x1=Hx2x1=Hx2
這是一個齊次座標的等式,HH乘以一個非零的比例因子上述等式仍然成立,即HH是一個3×33×3齊次矩陣,具有8個未知量。
假設已經取得了兩影象之間的單應,則可單應矩陣HH可以將兩幅影象關聯起來
⎛⎝⎜u1v11⎞⎠⎟=H⎛⎝⎜u2v21⎞⎠⎟(u1v11)=H(u2v21)
其中,(u1,v1,1)T(u1,v1,1)T表示影象1中的像點,(u2,v2,1)T(u2,v2,1)T是影象2中的像點,也就是可以通過單應矩陣HH將影象2變換到影象1,如下圖。這有了很多實際的應用,例如影象的校正、對齊以及在SLAM中估計兩個相機間的運動。
同一相機在不同的位姿得到同一平面的影象
假設使用同一相機在不同的位姿拍攝同一平面,如下圖:
上圖表示場景中的平面ππ在兩相機的成像,設平面ππ在第一個相機座標系下的單位法向量為NN,其到第一個相機中心(座標原點)的距離為dd,則平面ππ可表示為:
NTX1=dNTX1=d
即
1dNTX1=1,∀X1∈π1dNTX1=1,∀X1∈π
其中,X1X1是三維點PP在第一相機座標系下的座標,其在第二個相機座標系下的座標為X2X2,則
X2=RX1+TX2=RX1+T
將上面式子結合起來,
X2=RX1+T1dNTX1=(R+T1dNT)X1=H′X1X2=RX1+T1dNTX1=(R+T1dNT)X1=H′X1
所以就得到了同一平面兩個不同相機座標系的單應矩陣
H′=R+T1dNTH′=R+T1dNT
上面提到單應表示的是兩個平面之間的對映,這裡為何得到了同一平面兩個不同相機座標系的單應矩陣。雖然平面是通過,但是在不同座標系中會有不同的表示,單應也是將平面從一個位置對映到另一個位置,並保持其某些性質不變,例如保線性。[image]
上面得到的單應矩陣第一個相機座標系取得,還需要將其變換到成像平面座標系中,取得兩影象間的單應矩陣。設x1,x2x1,x2為PP在兩影象的像點座標,
x1=KX1,x2=KX2x1=KX1,x2=KX2
KK是相機的內參數,代入上面求得單應變換公式
K−1x2=HK−1x1⟹x2=KH′K−1x1=K(R+T1dNT)K−1x1K−1x2=HK−1x1⟹x2=KH′K−1x1=K(R+T1dNT)K−1x1
所以,同一平面得到的兩個影象間的單應矩陣HH為
H=K(R+T1dNT)K−1H=K(R+T1dNT)K−1
平面的單應和對極約束的區別
兩影象間的單應矩陣後,有什麼作用呢?它和兩幅影象間的對極約束有何區別
兩影象間的對極約束和場景的結構無關,也就是說對極約束對於任意場景結構的兩幅影象都是成立的,不能給出兩幅影象上的像點的一一對應關係,只能給出點對應的必要條件,另一幅影象上與影象上對應的像點在位於對應的對極線上。基礎矩陣FF描述的實際是一種點和直線的對映關係,而不是一種點對點的約束關係,並不能給出另一個點的確切位置。
平面間的單應,並不像對極約束完全不需要場景的結構資訊,它對場景的結構有了要求:場景的點必須在同一個平面上,因此單應矩陣HH也就能夠對兩影象上對應點的提供更多的約束,知道了某點在一幅影象的像點位置後,可以通過單應矩陣,求得其在另一幅影象中像點的確切位置。
也就說,三維點如果不是在同一個平面上,可以使用基礎矩陣FF來計算影象上像點在另一幅影象上對應的對極線,而不能使用單應矩陣HH得到對應點的確切位置。但如果在這種情況下,仍使用單應矩陣HH計算對應點的位置,其結果會如何呢,如下圖
通過平面PP在兩影象上的匹配點,計算得到了其兩影象間的單應矩陣HH。三維點p′p′並不在平面PP上,其在影象1中的像點為x1x1,使用單應矩陣HH計算其在影象2中對應的像點。從上圖可以看出,p′p′在影象2上的像點是x′2x2′,而使用單應矩陣計算得到的像點卻是x2x2。
在這種情形下,使用單應矩陣HH估計影象上對應點位置,誤差來自兩個方面:
- 三維點p′p′和單應矩陣HH對應的平面PP之間的距離。
從上圖可知使用HH計算p′p′像點位置時,實際得到的是卻是平面PP上的點pp在影象2的像點,而pp是相機1的中心O1O1和p′p′確定的直線和平面PP的交點。 - 相機2相對於相機1的平移。
具體分析可看下一小節相機只有旋轉無平移下的單應。
也就是說,在相機的平移相對於場景的深度足夠小時,仍然可以使用單應矩陣HH來計算影象中匹配像點的對應位置。
該段分析多數參考Homography 知多少?
相機只有旋轉無平移下的單應
當相機在只有旋轉而沒有平移的情況下取得同一場景的兩幅影象,可以使用單應矩陣HH來描述這兩影象之間的關係。
通過前面的文章知道,相機在不同位姿下取得同一場景的影象,可以使用基礎矩陣FF描述兩影象像點之間的約束關係。這裡的不同位姿指的是相機要有旋轉和平移,但如果相機之間只有旋轉無平移,影象的像點之間又有怎樣的約束關係呢,單應矩陣HH又和前面提到的基礎矩陣FF,有何不同。
假設得到兩幅影象的相機之間只有旋轉,而沒有平移t=(0,0,0)Tt=(0,0,0)T,有:
p1=KP ,p2=KRPp1=KP ,p2=KRP
其中,KK是相機的內參,p1,p2p1,p2分別是兩影象的像點,PP在相機座標系下的三維點座標,以第一個相機的中心為座標原點。
從上面公式可得到
P=K−1p1,p2=KRK−1p1P=K−1p1,p2=KRK−1p1
又有兩個影象間的單應p2=Hp1p2=Hp1,所以就有:
H=KRK−1H=KRK−1
也就是在相機只有旋轉的情況下,可像求解兩影象間的單應矩陣HH,然後可從HH中分解得到相機的內參數KK,以及旋轉矩陣RR。
基礎矩陣F=K−Tt×RK−1F=K−Tt×RK−1(具體推導過程可參看:SLAM入門之視覺里程計(3):兩檢視對極約束 基礎矩陣 ),而由於相機的平移向量t=(0,0,0)Tt=(0,0,0)T,可知基礎矩陣FF為零矩陣,也就是說
- 在相機只有旋轉而沒有平移的情況下,兩檢視的對極約束就不再適用,這時可以使用單應矩陣HH來描述兩個影象像點的對應關係。
- 在這種情況下,兩影象點的匹配不依賴於三維點的深度資訊,無法使用三角法重構出三維點在世界座標系中的三維座標。
通過匹配的點對計算單應矩陣
兩影象上的像點p1(x1,y1),p2(x2,y2)p1(x1,y1),p2(x2,y2)是一對匹配的點對,其單應矩陣為HH,則有
⎛⎝⎜x2y21⎞⎠⎟=⎛⎝⎜H11H21H31H12H22H32H13H23H33⎞⎠⎟⎛⎝⎜x1y11⎞⎠⎟⇔p2=Hp1(x2y21)=(H11H12H13H21H22H23H31H32H33)(x1y11)⇔p2=Hp1
將矩陣的乘法展開,即可得到
⎧⎩⎨⎪⎪x2=H11x1+H12y1+H13y2=H21x1+H22y1+H231=H31x1+H32y1+H33{x2=H11x1+H12y1+H13y2=H21x1+H22y1+H231=H31x1+H32y1+H33
方便求解,可以將上面等式變換為Ax=0Ax=0的形式,做如下變換
第一和第二個式子的左右兩邊同時乘以第三個式子的左右兩邊得到
x2(H31x1+H32y1+H33)=H11x1+H12y1+H13y2(H31x1+H32y1+H33)=H21x1+H22y1+H23x2(H31x1+H32y1+H33)=H11x1+H12y1+H13y2(H31x1+H32y1+H33)=H21x1+H22y1+H23
將式子的右邊變為0
x2(H31x1+H32y1+H33)−H11x1+H12y1+H13=0y2(H31x1+H32y1+H33)−H21x1+H22y1+H23=0x2(H31x1+H32y1+H33)−H11x1+H12y1+H13=0y2(H31x1+H32y1+H33)−H21x1+H22y1+H23=0
將上面的等式改寫為向量積的形式,令h=(H11,H12,H13,H21,H22,H23,H31,H32,1)Th=(H11,H12,H13,H21,H22,H23,H31,H32,1)T,單應矩陣HH是一個齊次矩陣,可以將其最後一個元素歸一化為1。
則上面兩個式子可以改寫為
axh=0ayh=0axh=0ayh=0
其中,ax=(−x1,−y1,0,0,0,x2x1,x2y1,x2)Tax=(−x1,−y1,0,0,0,x2x1,x2y1,x2)T,ay=(0,0,0,−x1,−y1,−1,y2x1,y2y1,y2)Tay=(0,0,0,−x1,−y1,−1,y2x1,y2y1,y2)T
一對匹配的點對,可以得到上述等式,HH有8個未知量,也就說最少4對匹配的點對(任意3點不共線),就可以求出兩幅影象的單應矩陣HH。但是通常來說,影象的匹配點對要超過4對,設得到了nn對匹配的點對,可以得到如下的等式
Ah=0,其中A=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜aTx1aTy1aTx2aTy2⋮aTxnaTyn⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟Ah=0,其中A=(ax1Tay1Tax2Tay2T⋮axnTaynT)
具體求解方法,可以參考SLAM入門之視覺里程計(4):基礎矩陣的估計,首先將影象座標歸一化,然後使用最小二乘法或者隨機取樣一致性(RANSAC)的方法估計得到單應矩陣HH。
在OpenCV 中也封裝了各種求解單應矩陣的方法,具體的使用可以參考OpenCV,計算兩幅影象的單應矩陣,通過求解兩影象的單應矩陣,將影象變換到同一個視角下,然後疊加到一起。
總結
相比於兩檢視的基礎矩陣(本質矩陣)來說,兩影象的單應矩陣比較難理解一些。針對本文,總結以下幾點
- 使用場景
- 基礎矩陣表示的是兩檢視的對極約束,和三維場景的結構無關,只依賴於相機的內參數以及外引數,需要兩個相機的位置有旋轉和平移
- 單應矩陣對場景的三維結構有了更多的要求,需要場景中的點在同一個平面上; 或者是,對相機的位姿有了要求,兩個相機之間只有旋轉而無平移
- 約束關係
- 基礎矩陣表示的像點和另一幅影象上的對極線的對映關係,使用基礎矩陣無法得到像點對應點在另一幅影象上的確切位置。
- 單應矩陣則是點和點的對映,使用單應矩陣可以找到像點在另一幅影象上對應點的確切位置。
- 使用單應矩陣而不是基礎矩陣
- 相機只有旋轉而無平移的時候,兩檢視的對極約束不成立,基礎矩陣FF為零矩陣,這時候需要使用單應矩陣HH
- 場景中的點都在同一個平面上,可以使用單應矩陣計算像點的匹配點。
- 相機的平移距離相對於場景的深度較小的時候,也可以使用單應矩陣HH。