在之前的博文OpenCV,計算兩幅圖像的單應矩陣,介紹調用OpenCV中的函數,通過4對對應的點的坐標計算兩個圖像之間單應矩陣\(H\),然后調用射影變換函數,將一幅圖像變換到另一幅圖像的視角中。當時只是知道通過單應矩陣,能夠將圖像1中的像素坐標\((u_1,v_1)\)變換到圖像2中對應的位置上\((u_2,v_2)\),而沒有深究其中的變換關系。
單應(Homography)是射影幾何中的概念,又稱為射影變換。它把一個射影平面上的點(三維齊次矢量)映射到另一個射影平面上,並且把直線映射為直線,具有保線性質。總的來說,單應是關於三維齊次矢量的一種線性變換,可以用一個\(3\times3\)的非奇異矩陣\(H\)表示
這是一個齊次坐標的等式,\(H\)乘以一個非零的比例因子上述等式仍然成立,即\(H\)是一個\(3\times3\)齊次矩陣,具有8個未知量。
假設已經取得了兩圖像之間的單應,則可單應矩陣\(H\)可以將兩幅圖像關聯起來
其中,\((u_1,v_1,1)^T\)表示圖像1中的像點,\((u_2,v_2,1)^T\)是圖像2中的像點,也就是可以通過單應矩陣\(H\)將圖像2變換到圖像1,如下圖。這有了很多實際的應用,例如圖像的校正、對齊以及在SLAM中估計兩個相機間的運動。
同一相機在不同的位姿得到同一平面的圖像
假設使用同一相機在不同的位姿拍攝同一平面,如下圖:

上圖表示場景中的平面\(\pi\)在兩相機的成像,設平面\(\pi\)在第一個相機坐標系下的單位法向量為\(N\),其到第一個相機中心(坐標原點)的距離為\(d\),則平面\(\pi\)可表示為:
即
其中,\(X_1\)是三維點\(P\)在第一相機坐標系下的坐標,其在第二個相機坐標系下的坐標為\(X_2\),則
將上面式子結合起來,
所以就得到了同一平面兩個不同相機坐標系的單應矩陣
上面提到單應表示的是兩個平面之間的映射,這里為何得到了同一平面兩個不同相機坐標系的單應矩陣。雖然平面是通過,但是在不同坐標系中會有不同的表示,單應也是將平面從一個位置映射到另一個位置,並保持其某些性質不變,例如保線性。[image]
上面得到的單應矩陣第一個相機坐標系取得,還需要將其變換到成像平面坐標系中,取得兩圖像間的單應矩陣。設\(x_1,x_2\)為\(P\)在兩圖像的像點坐標,
\(K\)是相機的內參數,代入上面求得單應變換公式
所以,同一平面得到的兩個圖像間的單應矩陣\(H\)為
平面的單應和對極約束的區別
兩圖像間的單應矩陣后,有什么作用呢?它和兩幅圖像間的對極約束有何區別
兩圖像間的對極約束和場景的結構無關,也就是說對極約束對於任意場景結構的兩幅圖像都是成立的,不能給出兩幅圖像上的像點的一一對應關系,只能給出點對應的必要條件,另一幅圖像上與圖像上對應的像點在位於對應的對極線上。基礎矩陣\(F\)描述的實際是一種點和直線的映射關系,而不是一種點對點的約束關系,並不能給出另一個點的確切位置。
平面間的單應,並不像對極約束完全不需要場景的結構信息,它對場景的結構有了要求:場景的點必須在同一個平面上,因此單應矩陣\(H\)也就能夠對兩圖像上對應點的提供更多的約束,知道了某點在一幅圖像的像點位置后,可以通過單應矩陣,求得其在另一幅圖像中像點的確切位置。
也就說,三維點如果不是在同一個平面上,可以使用基礎矩陣\(F\)來計算圖像上像點在另一幅圖像上對應的對極線,而不能使用單應矩陣\(H\)得到對應點的確切位置。但如果在這種情況下,仍使用單應矩陣\(H\)計算對應點的位置,其結果會如何呢,如下圖

通過平面\(P\)在兩圖像上的匹配點,計算得到了其兩圖像間的單應矩陣\(H\)。三維點\(p'\)並不在平面\(P\)上,其在圖像1中的像點為\(x_1\),使用單應矩陣\(H\)計算其在圖像2中對應的像點。從上圖可以看出,\(p'\)在圖像2上的像點是\(x_2'\),而使用單應矩陣計算得到的像點卻是\(x_2\)。
在這種情形下,使用單應矩陣\(H\)估計圖像上對應點位置,誤差來自兩個方面:
- 三維點\(p'\)和單應矩陣\(H\)對應的平面\(P\)之間的距離。
從上圖可知使用\(H\)計算\(p'\)像點位置時,實際得到的是卻是平面\(P\)上的點\(p\)在圖像2的像點,而\(p\)是相機1的中心\(O_1\)和\(p'\)確定的直線和平面\(P\)的交點。 - 相機2相對於相機1的平移。
具體分析可看下一小節相機只有旋轉無平移下的單應。
也就是說,在相機的平移相對於場景的深度足夠小時,仍然可以使用單應矩陣\(H\)來計算圖像中匹配像點的對應位置。
該段分析多數參考Homography 知多少?
相機只有旋轉無平移下的單應
當相機在只有旋轉而沒有平移的情況下取得同一場景的兩幅圖像,可以使用單應矩陣\(H\)來描述這兩圖像之間的關系。
通過前面的文章知道,相機在不同位姿下取得同一場景的圖像,可以使用基礎矩陣\(F\)描述兩圖像像點之間的約束關系。這里的不同位姿指的是相機要有旋轉和平移,但如果相機之間只有旋轉無平移,圖像的像點之間又有怎樣的約束關系呢,單應矩陣\(H\)又和前面提到的基礎矩陣\(F\),有何不同。
假設得到兩幅圖像的相機之間只有旋轉,而沒有平移\(t = (0,0,0)^T\),有:
其中,\(K\)是相機的內參,\(p_1,p_2\)分別是兩圖像的像點,\(P\)在相機坐標系下的三維點坐標,以第一個相機的中心為坐標原點。
從上面公式可得到
又有兩個圖像間的單應\(p_2 = Hp_1\),所以就有:
也就是在相機只有旋轉的情況下,可像求解兩圖像間的單應矩陣\(H\),然后可從\(H\)中分解得到相機的內參數\(K\),以及旋轉矩陣\(R\)。
基礎矩陣\(F=K^{-T}t_{\times}RK^{-1}\)(具體推導過程可參看:SLAM入門之視覺里程計(3):兩視圖對極約束 基礎矩陣 ),而由於相機的平移向量\(t = (0,0,0)^T\),可知基礎矩陣\(F\)為零矩陣,也就是說
- 在相機只有旋轉而沒有平移的情況下,兩視圖的對極約束就不再適用,這時可以使用單應矩陣\(H\)來描述兩個圖像像點的對應關系。
- 在這種情況下,兩圖像點的匹配不依賴於三維點的深度信息,無法使用三角法重構出三維點在世界坐標系中的三維坐標。
通過匹配的點對計算單應矩陣
兩圖像上的像點\(p_1(x_1,y_1),p_2(x_2,y_2)\)是一對匹配的點對,其單應矩陣為\(H\),則有
將矩陣的乘法展開,即可得到
方便求解,可以將上面等式變換為\(Ax = 0\)的形式,做如下變換
第一和第二個式子的左右兩邊同時乘以第三個式子的左右兩邊得到
將式子的右邊變為0
將上面的等式改寫為向量積的形式,令\(h=(H_{11}, H_{12},H_{13},H_{21},H_{22},H_{23},H_{31},H_{32},1)^T\),單應矩陣\(H\)是一個齊次矩陣,可以將其最后一個元素歸一化為1。
則上面兩個式子可以改寫為
其中,\(a_x = (-x_1,-y_1,0,0,0,x_2x_1,x_2y_1,x_2)^T\),\(a_y=(0,0,0,-x_1,-y_1,-1,y_2x_1,y_2y_1,y_2)^T\)
一對匹配的點對,可以得到上述等式,\(H\)有8個未知量,也就說最少4對匹配的點對(任意3點不共線),就可以求出兩幅圖像的單應矩陣\(H\)。但是通常來說,圖像的匹配點對要超過4對,設得到了\(n\)對匹配的點對,可以得到如下的等式
具體求解方法,可以參考SLAM入門之視覺里程計(4):基礎矩陣的估計,首先將圖像坐標歸一化,然后使用最小二乘法或者隨機采樣一致性(RANSAC)的方法估計得到單應矩陣\(H\)。
在OpenCV 中也封裝了各種求解單應矩陣的方法,具體的使用可以參考OpenCV,計算兩幅圖像的單應矩陣,通過求解兩圖像的單應矩陣,將圖像變換到同一個視角下,然后疊加到一起。
總結
相比於兩視圖的基礎矩陣(本質矩陣)來說,兩圖像的單應矩陣比較難理解一些。針對本文,總結以下幾點
-
使用場景
- 基礎矩陣表示的是兩視圖的對極約束,和三維場景的結構無關,只依賴於相機的內參數以及外參數,需要兩個相機的位置有旋轉和平移
- 單應矩陣對場景的三維結構有了更多的要求,需要場景中的點在同一個平面上; 或者是,對相機的位姿有了要求,兩個相機之間只有旋轉而無平移
-
約束關系
- 基礎矩陣表示的像點和另一幅圖像上的對極線的映射關系,使用基礎矩陣無法得到像點對應點在另一幅圖像上的確切位置。
- 單應矩陣則是點和點的映射,使用單應矩陣可以找到像點在另一幅圖像上對應點的確切位置。
-
使用單應矩陣而不是基礎矩陣
- 相機只有旋轉而無平移的時候,兩視圖的對極約束不成立,基礎矩陣\(F\)為零矩陣,這時候需要使用單應矩陣\(H\)
- 場景中的點都在同一個平面上,可以使用單應矩陣計算像點的匹配點。
- 相機的平移距離相對於場景的深度較小的時候,也可以使用單應矩陣\(H\)。
