RANSAC算法的單應性矩陣講解

還可以參考:https://blog.csdn.net/lhanchao/article/details/52849446

我們已經得到了像素座標系和世界座標系下的座標映射關係:

其中,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() )

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

四點求解單應性矩陣

% 返回值 H 是一個3*3的矩陣
% pts1 和 pts2是2*4的座標矩陣對應特徵點的(x,y)座標
n = size(pts1,2);
A = zeros(2*n,9);
A(1:2:2*n,1:2) = pts1';
A(1:2:2*n,3) = 1;
A(2:2:2*n,4:5) = pts1';
A(2:2:2*n,6) = 1;
x1 = pts1(1,:)';
y1 = pts1(2,:)';
x2 = pts2(1,:)';
y2 = pts2(2,:)';
A(1:2:2*n,7) = -x2.*x1;
A(2:2:2*n,7) = -y2.*x1;
A(1:2:2*n,8) = -x2.*y1;
A(2:2:2*n,8) = -y2.*y1;
A(1:2:2*n,9) = -x2;
A(2:2:2*n,9) = -y2;

[evec,~] = eig(A'*A);
H = reshape(evec(:,1),[3,3])';
H = H/H(end); % make H(3,3) = 1

在齊次座標中,假設一點p(xi,yi,1)經過H矩陣的變換變爲p‘(xi',yi',1),即 p' = H*p,通常,對於透視變換,H矩陣有8個自由度,這樣至少需要4對特徵點對求解。4個特徵點對可以建立8個方程。那麼對於有n對特徵點的情況(超定方程),解p' = H*p方程組可以轉化爲對齊次方程組Ax = 0 的求解。而對 Ax = 0 的求解轉化爲 min ||Ax||2 的非線性優化問題(超定方程,通過最小二乘擬合得到近似解)。

對於某一點(xi,yi),其變換可表述爲 p' = H*p,代入展開可得:

(1)

那麼可得:

(2)

進一步變換爲:

(3)

這樣便可構造係數矩陣:

(4)

通過係數矩陣我們可以構造出齊次線性方程組(Ax = 0):

(5)

即:

(6)

對於(6)這樣的超定方程求解,可以通過最小二乘的方式求解。通過對係數矩陣A求取特徵值和特徵向量得到。通過以下方式獲得最小二乘解:

[V,D] = eig(A'*A) (7)

其中D是特徵值對角矩陣(特徵值沿主對角線降序),V是對應D特徵值的特徵向量(列向量)組成的特徵矩陣,A'表示A的轉置。其最小二乘解爲V(1),即係數矩陣A最小特徵值對應的特徵向量就是超定方程組Ax = 0的最小二乘解。

至此,H矩陣已經求取,後續可以通過隨機採樣一致性(RANSC)進行精選,或者通過LM進行優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章