1.單應性矩陣是什麼?
言簡意赅定義:定義在兩個不同視角中對同一平面範圍内的特征點的射影變換(projective transformation)即:
x1 = H*x2 //x1、x2為比對點
上圖中x,x‘為一對比對點,通過單應矩陣H實作在各自圖像坐标系下的坐标轉化。
H矩陣(單應性矩陣)大小為3×3:
因為H矩陣因尺度一緻性,減少一個自由度,故H矩陣的自由度為8(有疑問可網上搜尋一下),是以我們有兩種處理方法:
1.可以将 h33 設定成1
2.或者||H|| = 1,即:
2.單應矩陣求解原理
故在兩視角所有比對點對都滿足:
進而變換為:
進而轉化為:
進而轉化為:
假如我們得到了兩幅圖檔中對應的N個點對(特征點比對對),那麼可以得到如下線性方程組:
寫成矩陣形式:
由于單應矩陣H包含了||H||=1限制,是以根據上圖的線性方程組,8自由度的H我們至少需要4對對應的點才能計算出單應矩陣。但是,以上隻是理論推導,在真實的應用場景中,我們計算的點對中都會包含噪聲。比如點的位置偏差幾個像素,甚至出現特征點對誤比對的現象,如果隻使用4個點對來計算單應矩陣,那會出現很大的誤差。是以,為了使得計算更精确,一般都會使用遠大于4個點對來計算單應矩陣。另外上述方程組采用直接線性解法通常很難得到最優解,是以實際使用中一般會用其他優化方法,如RANSAC算法、奇異值分解、Levenberg-Marquarat(LM)算法(後續文章會介紹)等進行求解。
3.單應矩陣用于錄影機标定
我們标定其實就是從單應矩陣H中恢複出内外參數矩陣,怎麼了解标定裡面H?因為我們常常把标定的棋盤格圖像放在平面上,并設定Z=0,故棋盤格自身是一平面xy坐标系,而最後我們錄影機的像素坐标系也可看作一個xy坐标系,那麼這就符合單應矩陣的使用情景可用于求解兩坐标系中比對點對的映射變換關系。詳見從零開始學習「張氏相機标定法」(一)
其中,u、v表示像素坐标系中的坐标,s表示尺度因子(等于1/zw),fx、fy、u0、v0、γ(由于制造誤差産生的兩個坐标軸偏斜參數,通常很小)表示5個相機内參,R(對應列向量r1、r2、r3),t表示相機外參,xw、yw、zw(zw= 0,上面公式未寫出,其中 1 是齊次化表達的最後一維)(假設标定棋盤位于世界坐标系中Zw=0的平面)表示世界坐标系中的坐标。故我們這裡把内外參合并看作H。
r3,zw沒寫出是因為r3*zw=0,故可以同時省略。
流程:
1、列印一張棋盤格标定圖紙,将其貼在平面物體的表面。
2、拍攝一組不同方向棋盤格的圖檔,可以通過移動相機來實作,也可以移動标定圖檔來實作。
3、對于每張拍攝的棋盤圖檔,檢測圖檔中所有棋盤格的特征點(角點,也就是下圖中黑白棋盤交叉點,中間品紅色的圓圈内就是一個角點)。我們定義列印的棋盤圖紙位于世界坐标系Zw=0的平面上,世界坐标系的原點位于棋盤圖紙的固定一角(比如下圖中黃色點),像素坐标系原點位于圖檔左上角。
4、因為棋盤标定圖紙中所有角點的空間坐标是已知的,這些角點對應在拍攝的标定圖檔中的角點的像素坐标也是已知的,如果我們得到這樣的N>=4個比對點對(越多計算結果越魯棒),就可以根據LM等優化方法得到其單應矩陣H。當然計算單應矩陣一般不需要自己寫函數實作,OpenCV中就有現成的函數可以調用。現在也有專門用于傳感器标定的工具箱Kalibr(github連結),精度要好于OpenCV。
4.單應矩陣恢複内外參數學推導
我們知道H是内參矩陣和外參矩陣的乘積,而我們想要最終分别獲得内參和外參。是以需要想個辦法,先把内參求出來(先求内參是因為更容易),得到内參後,外參也就随之解出了。
我們先不考慮鏡頭畸變(正規的标定是包含鏡頭畸變的),來看看如何求解内參和外參。求解思路是利用旋轉向量的限制關系,以下是具體推導,建議自己演算一遍,加深了解。
為了利用旋轉向量之間的限制關系,我們先将單應性矩陣H化為3個列向量,即H=[h1 h2 h3],則有:
進而轉換為:
因為旋轉向量在構造中是互相正交的,即r1和r2互相正交,由此我們就可以利用“正交”的兩個含義,得出每個單應矩陣提供的兩個限制條件:
限制條件1:旋轉向量點積為0(兩垂直平面上的旋轉向量互相垂直),即:
限制條件2:旋轉向量長度相等(旋轉不改變尺度),即:
是以一個單應性矩陣H可以提供上述兩個限制條件。那麼如何利用上述兩個限制條件求解内參或者外參呢?我們一步一步來看,由前面可知内參矩陣M:
利用M定義B:
我們看到B為對稱矩陣,真正有用的元素隻有6個(主對角線任意一側的6個元素)。把B帶入前面兩個限制條件後可轉化為:
上面兩限制中的式子均可寫為通式:
的形式,定義3X3的單應矩陣H=[h1 h2 h3]的第i列列向量:
将如下表達式代入上述的限制單項式:
其中,令:
則:
由此,兩限制條件最終可以轉化為如下形式:
假設我們已經根據前面計算得到了矩陣B元素的值,那麼根據已知的矩陣B很容易解出内參,如下:
得到内參數後,内參矩陣M也已知。單應矩陣H也已知,是以可繼續求得外參數:
其中又由旋轉矩陣性質有:
則:
實際情況下,資料中是存在噪音的,是以計算得到的旋轉矩陣R并不一定能滿足旋轉矩陣的性質。是以通常根據奇異值分解來得到旋轉矩陣R。
5.補充
上述的推導結果是基于理想情況下的解,從理論上證明了張氏标定算法的可行性。但在實際标定過程中,一般使用非線性優化求解。假設我們拍攝了n張标定圖檔,每張圖檔裡有m個棋盤格角點。三維空間點X在圖檔上對應的二維像素為x,三維空間點經過相機内參M,外參R,t變換後得到的二維像素為x',假設噪聲是獨立同分布的,求解上述非線性優化問題得到最小化x, x'的位置來:
現在我們來考慮透鏡畸變的影響,由于徑向畸變的影響相對較明顯,是以主要考慮徑向畸變參數,根據經驗,通常隻考慮徑向畸變的前兩個參數k1,k2就可以(增加更多的參數會使得模型變的複雜且不穩定)。實際求解中,通常把k1,k2也作為參數加入上述函數一起進行優化,待優化函數如下所示:
上述非線性優化問題通常用Levenberg-Marquardt(LM)算法進行疊代求解。一般将k1,k2初值設為0。