1. 程式人生 > >單應性矩陣的理解及求解

單應性矩陣的理解及求解

單應性矩陣的理解及求解

1. 齊次座標(Homogeneous Coordinate)

一幅2D影象上的非齊次座標為(x,y),而齊次座標為(x,y,1),也可以寫成(x/z,y/z,1)(x,y,z)。齊次座標有很多好處,比如可以很清楚的確定一個點在不在直線上:

T(x)*I=0, T表示轉置矩陣;

還可以描述無窮遠點:(x,y,0)

還可以把平移和旋轉寫到一個矩陣裡(也有不願意這麼幹的,攝影測量裡用的都是非齊次座標,平移和旋轉分開寫);

具體的可去看<計算機視覺中的多檢視幾何>,i.e.,<multiple view geometry in computer vision>

2. 單應性矩陣(Homography Matrix)

兩個不同視角的影象上的點對的homogeneous coordinate可以用一個射影變換(projective transformation)表述,即:x1 = H*x2

二維和三維的圖示如下:

射影變換也叫“單應”--Homography,“Homo”字首就是same的意思,表示“同”,homography就是用同一個源產生的graphy,中文譯過來大概就是“單應”。

因此上面式子中的矩陣H就叫單應性矩陣。上式中的x1x2都是3*1的齊次座標,因此H是一個3*3的矩陣:{h00,h01,h02;h10,h11,h12;h20,h21,h22}

然而,單應矩陣的自由度是多少呢?

如果給定一個單應H={h_ij},給它的元素乘上同一個數a,得到的的單應a*HH作用相同,因為新單應無非把齊次點x1變成了齊次點a*x1,都是一回事。因此我們可以把a換成1/h22,那麼H就變成了只有8個自由元素的矩陣。

那麼需要多少個點對求解這個H呢?如果需要唯一解的話,需要4個點對(對應8個方程,去解H中的8個未知數)。

3. 兩個應用例子

例子1:如何進行兩個影象的拼接?

解答:通過影象特徵點匹配+RANSAC可以獲得影象之間的單應性矩陣,然後把其中一個影象通過這個矩陣投影到另一個影象上就完成了基本的拼接。

例子2:在相機的內參數標定過程中會用到求解單應性矩陣嗎?

對一個棋盤格拍照,棋盤格的世界座標系是使用者任意設定的,標定的時候,預設世界座標系就是以標定板左上角點為原點,z軸垂直於標定板,xoy面與標定板重合的三維直角座標系。棋盤格的格子長度已知,因此可以知道各個角點的世界座標系座標XYZZ=0)。由於Z=0,因此可以忽略掉Z這個維度,世界座標系中某個座標(X,Y,Z,1)到影象座標(x,y,1)的變換就等價於(X,Y,1)到影象座標(x,y,1)的變換。此時的變換矩陣就由3*4變為3*3,成為了單應性矩陣。

因此用4個角點就可以計算H8個引數。以不同的角度對棋盤格拍攝3張就可以得到3H,如果用張正友標定法,就可以得到6個約束方程,可以求解B矩陣(對稱矩陣)的6個未知引數,進而通過Cholesky分解求解出內參矩陣A的引數。

4. 單應矩陣Homography求解

《從零開始學習「張氏相機標定法」(一)成像幾何模型》中我們已經得到了畫素座標系和世界座標系下的座標對映關係:

https://img-blog.csdnimg.cn/20181229155213467

其中,uv表示畫素座標系中的座標,s表示尺度因子,fxfyu0v0、γ(由於製造誤差產生的兩個座標軸偏斜引數,通常很小)表示5個相機內參,Rt表示相機外參,XwYwZw(假設標定棋盤位於世界座標系中Zw=0的平面)表示世界座標系中的座標。

單應性概念的引出

我們在這裡引入一個新的概念:單應性(Homography)變換。可以簡單的理解為它用來描述物體在世界座標系和畫素座標系之間的位置對映關係。對應的變換矩陣稱為單應性矩陣。在上述式子中,單應性矩陣定義為:

https://img-blog.csdnimg.cn/20181229155213511

其中,M是內參矩陣。

https://img-blog.csdnimg.cn/20181229155213554

從單應矩陣定義式子來看,它同時包含了相機內參和外參。在進一步介紹相機標定知識之前,我們重點來了解一下單應性,這有助於深入理解相機標定。因為在計算機視覺領域,單應性是一個非常重要的概念。

為了不讓讀者淹沒在公式的汪洋大海中失去興趣,我們顛倒一下順序,先來看看單應性到底有什麼用,然後再介紹單應矩陣的估計方法。

單應性在計算機視覺中的應用

單應性在計算機視覺領域是一個非常重要的概念,它在影象校正、影象拼接、相機位姿估計、視覺SLAM等領域有非常重要的作用。

1. 影象校正

用單應矩陣進行影象矯正的例子如下圖所示,最少需要四個對應點對(後面會給出原因)就可以實現。

https://img-blog.csdnimg.cn/20181229155213595

2. 視角變換

單應矩陣用於視角變換的例子如下圖所示,可以方便地將左邊普通檢視轉換為右圖的鳥瞰圖。

https://img-blog.csdnimg.cn/20181229155213634

3. 影象拼接

既然單應矩陣可以進行視角轉換,那我們把不同角度拍攝的影象都轉換到同樣的視角下,就可以實現影象拼接了。如下圖所示,通過單應矩陣H可以將image1image2都變換到同一個平面。

https://img-blog.csdnimg.cn/20181229155213680

單應矩陣用於影象拼接的例子如下所示。

https://img-blog.csdnimg.cn/20181229155213726

4. 增強現實(AR)

平面二維標記圖案(marker)經常用來做AR展示。根據marker不同視角下的影象可以方便的得到虛擬物體的位置姿態並進行顯示,如下圖所示。

https://img-blog.csdnimg.cn/20181229155213765

如何估計單應矩陣?

瞭解了上述單應性的部分應用後,我們就有很大的動力來學習單應矩陣的推導和計算了。首先,我們假設兩張影象中的對應點對齊次座標為(x',y',1)(x,y,1),單應矩陣H定義為:

則有:

https://img-blog.csdnimg.cn/20181229155213807

矩陣展開後有3個等式,將第3個等式代入前兩個等式中可得:

也就是說,一個點對對應兩個等式。在此插入一個討論:單應矩陣H有幾個自由度?

或許有人會說,9個啊,H矩陣不是9個引數嗎?從h11h33總共9個。真的是這樣嗎?實際上並不是,因為這裡使用的是齊次座標系,也就是說可以進行任意尺度的縮放。比如我們把hij乘以任意一個非零常數k並不改變等式結果:

https://img-blog.csdnimg.cn/20181229155213848

所以實際上單應矩陣H只有8個自由度。8自由度下H計算過程有兩種方法。

第一種方法:直接設定h33=1,那麼上述等式變為:

第二種方法:將H新增約束條件,將H矩陣模變為1,如下:

https://img-blog.csdnimg.cn/20181229155213925

以第2種方法(用第1種也類似)為例繼續推導,我們將如下等式(包含||H||=1約束):

乘以分母展開,得到:

https://img-blog.csdnimg.cn/20181229155213966

整理,得到:

https://img-blog.csdnimg.cn/2018122915521427

假如我們得到了兩幅圖片中對應的N個點對(特徵點匹配對),那麼可以得到如下線性方程組:

https://img-blog.csdnimg.cn/2018122915521468

寫成矩陣形式:

由於單應矩陣H包含了||H||=1約束,因此根據上圖的線性方程組,8自由度的H我們至少需要4對對應的點才能計算出單應矩陣。這也回答了前面影象校正中提到的為何至少需要4個點對的根本原因。

但是,以上只是理論推導,在真實的應用場景中,我們計算的點對中都會包含噪聲。比如點的位置偏差幾個畫素,甚至出現特徵點對誤匹配的現象,如果只使用4個點對來計算單應矩陣,那會出現很大的誤差。因此,為了使得計算更精確,一般都會使用遠大於4個點對來計算單應矩陣。另外上述方程組採用直接線性解法通常很難得到最優解,所以實際使用中一般會用其他優化方法,如奇異值分解、Levenberg-MarquaratLM)演算法(後續文章會介紹)等進行求解。

如何根據標定圖得到單應矩陣?

經過前面一系列的介紹,我們應該大致明白如何根據列印的棋盤標定圖和拍攝的照片來計算單應矩陣H。我們來總結一下大致過程。

1. 列印一張棋盤格標定圖紙,將其貼在平面物體的表面。

2. 拍攝一組不同方向棋盤格的圖片,可以通過移動相機來實現,也可以移動標定圖片來實現。

3. 對於每張拍攝的棋盤圖片,檢測圖片中所有棋盤格的特徵點(角點,也就是下圖中黑白棋盤交叉點,中間品紅色的圓圈內就是一個角點)。我們定義列印的棋盤圖紙位於世界座標系Zw=0的平面上,世界座標系的原點位於棋盤圖紙的固定一角(比如下圖中黃色點)。畫素座標系原點位於圖片左上角。

https://img-blog.csdnimg.cn/20181229155214118

4. 因為棋盤標定圖紙中所有角點的空間座標是已知的,這些角點對應在拍攝的標定圖片中的角點的畫素座標也是已知的,如果我們得到這樣的N>=4個匹配點對(越多計算結果越魯棒),就可以根據LM等優化方法得到其單應矩陣H。當然計算單應矩陣一般不需要自己寫函式實現,OpenCV中就有現成的函式可以呼叫,對應的C++函式是:

Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )

從函式定義來看,只要輸入匹配點對,指定具體計算方法即可輸出結果。