1. 程式人生 > >相機標定的數學原理及其推導過程

相機標定的數學原理及其推導過程

接著上一篇部落格計算機視覺之相機模型推導建立過程

在上一篇部落格中介紹了針孔模型,這篇部落格介紹一下相機的畸變引數,然後對推導過程做了詳細的推導。

畸變引數:由於針孔模型透光很少,導致相機的曝光時間很長,現實生活中一般使用凸透鏡代替針孔,大大提高了曝光效率,但是代價便是引入了畸變。畸變主要分為兩種,切向畸變和徑向畸變。

徑向畸變:由於一般透鏡在製作過程中,由於工藝問題,所以光在離中心越遠的地方折射的角度會越大,導致成像就是產生了"魚眼"效果,導致了徑向畸變,如圖所示。一般來說,貴一點的鏡頭徑向畸變的影響會小一點。可以採用泰勒級數展開式來矯正,至於為什麼,由於知識較少,無法解釋。

切向畸變:由於鏡頭在裝配過程中沒法保證凸透鏡和成像面絕對的平行,所以會產生切向畸變,具體表現就是

影象有點誇張,不過大概是這個樣子。同樣切向畸變可以通過公式矯正,同樣沒法解釋為什麼要用這個來矯正。

 

到目前為止,我們介紹了比較完整的相機模型,接下來開始推導求解內參數矩陣K和畸變引數k和p的過程,這個過程也稱為相機內參數的標定。至於相機的外引數R和t是在每一個場景都會發生變化的,所以內參數才是所追求的不變的東西,但是標定過程中也會涉及到外引數。

內參數的重要性:在立體視覺中,所有的計算都是建立在內參數的基礎上的,所以要保證內參數儘可能的精確,一般會進行標定。接下來介紹張正友標定法,也就是常見的使用標定板標定,這裡介紹他的原理。

單應性

在計算機視覺中,平面的單應性被定義為從一個平面到另一個平面的投影對映。因此一個二維平面的點對映到攝像機成像儀上的對映就是平面單應性的例子。

我們把單應性應用到棋盤格標定法中,第一步就是要求出從棋盤格角點的世界座標到畫素座標的單應性變換矩陣H。求解步驟如下,注意這個是可以直接通過所拍攝的足夠多照片求解的,這個很重要,很重要,很重要。

我們對公式稍微變形一下

,

由於世界座標是我們自己定義的,為了計算方便,我們可以將棋盤格平面定義為Zw=0平面,定義第一個角點為原點,然後根據邊長資訊可以推匯出所有的世界座標,當然所有的座標的Z=0,則公式變形為

,角點座標定義為

其中a,s是縮放因子。

我們通過把矩陣H歸一化,所以,H是一個3*3的矩陣,所以只剩下了8個未知元素。接下來開始求解H,s是個變數,這個也很重要,a是任意常量,也是縮放因子(個人理解,不知道正確不)。

根據前面介紹的,我們已知世界座標下的棋盤格角點,然後也通過計算,得到了對應的畫素座標。轉換成數學語言就是

步驟如下

變形可以得到

借用一位博主的話,但是作為一個大學生,如果只會列公式,那麼我們和鹹魚,,,嗯,我是說我們和小學生有什麼區別。我們要列,矩,陣。唯有如此,才能體現出我們曾上過矩陣這門課,或者說,被它上過。我們把它寫成矩陣的形式。

其中,

每一個點對應一個,由於每個Xw和Yw不一樣,也反映了s是個變數

可以知道式子中所有的未知數只有H,只要最左邊的矩陣的行數不小於8行,可知矩陣有解。可以看到一個對應點可以提供兩條方程,一個棋盤格只能提供四個有效點,一個正方形的對角線延伸出去全部共線,所以一個棋盤格剛剛好可以提供4個有效點,也就是八條方程,所以矩陣可以求解。求解的方式有很多,例如SVD分解的方法。

標定過程

根據上述推導的,我們能夠求解出H,且,但是H是內參數和外引數的具體表現,而我們要的是內參數,所以要分解H矩陣,得到內參數。

,變形可以得到

其中

消失是因為。R是旋轉矩陣,本身是一個正交陣,即R的轉置等於R的逆。正交陣的每個列向量是兩兩正交且單位化的(即模為1),那麼是相互正交的。利用這些性質可以得到

兩兩正交:

向量長度相等:

帶入上述公式,可得

此處,的轉置的簡寫。

發現兩個約束條件都出現了,為了簡化計算,令B=

可以發現矩陣B是一個對稱矩陣,那麼他只有6個元素。兩個約束條件有統一的表現形式,注意h是一個3*1的向量,具體寫出來則是

展開為

寫成矩陣的形式為

使用的定義(注意ij下標的關係),兩個約束條件可以寫成:

在這裡V是已知的(可以根據H得到),並且每個場景對應一個v,但是b是純內參數決定的,所以每個場景都不變化,所以只要有足夠多的場景就可以求解出b。

至少要多少個場景?

假設有K的場景,每個場景只有四個有效點,每個場景對應6的外引數,相機有4個內參數(保持不變)。所以有解的前提是2*4*K>=6K+4.

乘以2是因為,每個點都是xy組成,一個點可以提供兩個約束。

所以解得2K>=4,K>=2。

從另一個角度來將,B矩陣是由內參數矩陣M組成的,而M只含4個未知引數,所以一共只需要四條方程,而一個場景可以提供兩個約束條件,所以只要兩個場景便可以求解。但是在現實中我們會追求魯棒性,所以至少使用10幅7*8或者更大棋盤影象。

我們將多個場景的約束條件寫在一起Vb=0,則V是一個2K*6的矩陣,求解得到b。

得到b之後便可以求解內參數了。至於怎麼從B到內參,我實在是搞不懂,只能直接套用結論了。大致上是又莫名其妙多了個縮放因子

結論

內參數

外引數

當我們在真實資料求解的時候,將向量r放置在一起的時候無法得到一個精確的旋轉矩陣,即不成立。

要使式子成立,常用的技巧是使用SVD分解,SVD是將矩陣分解為一個對角陣D和兩個正交陣U和V的數學方法。這允許我們將R轉化為.因為R本身是正交的,矩陣D必須是單位陣I,使得UI。我們可以通過對R的奇異分解,設定D為單位幀,用SVD方法再重新合成R,將R強制計算為吻合的旋轉矩陣。(由於個人的數學水平實在有限,所以從結論到這裡都是直接抄寫learning opencv 的)。

接下來求解畸變引數

到目前為止,我們一切的推導都沒有考慮畸變引數。我們現在通過前面求解得到的相機內外引數,來解大的系統方程,得到畸變引數。

我們還是通過角點的匹配來得到方程組,具體如下

先把世界座標轉換到相機座標

然後使用針孔模型,得到理論的畫素座標

然後通過一開始提出的畸變矯正公式,來擬合真實座標和理論座標的關係。

 

同樣一個點可以提供兩個方程,共有5個引數,所以至少需要3個點就可以求解,當然點更多一點,魯棒性會更好。

到此,單目相機的內外參標定就介紹完了。

參考書籍:

learning opencv