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

單應性矩陣的理解及求解3

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

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

單應性概念的引出

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

其中,M是內參矩陣

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

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

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

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

1

影象校正

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

2

視角變換

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

3

影象拼接

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

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

4

增強現實(AR)

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

如何估計單應矩陣?

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

則有:

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

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

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

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

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

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

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

乘以分母展開,得到:

整理,得到:

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

寫成矩陣形式:

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

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

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

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

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

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

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

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

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

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