https://zhuanlan.zhihu.com/p/94244568
一、相機標定的目的
我們首先要明白兩個問題:1、相機是如何成像的?2、相機標定的目的是什么?
1、相機是如何成像的呢?
相機成像系統中,共包含四個坐標系:世界坐標系、相機坐標系、圖像坐標系、像素坐標系。對於這四個坐標系中之間的關系還不太明白成像原理的同學需要先查一查學習一下。
這四個坐標系之間的轉化關系為:
其中, 為在世界坐標系下一點的物理坐標,
為該點對應的在像素坐標系下的像素坐標,
為尺度因子。
我們將矩陣:
稱為相機的內參矩陣,內參矩陣取決於相機的內部參數。其中, 為像距,
分別表示
方向上的一個像素在相機感光板上的物理長度(即一個像素在感光板上是多少毫米),
分別表示相機感光板中心在像素坐標系下的坐標,
表示感光板的橫邊和縱邊之間的角度(
表示無誤差)。
我們將矩陣: 稱為相機的外參矩陣,外參矩陣取決於相機坐標系和世界坐標系的相對位置,
表示旋轉矩陣,
表示平移矢量。
即單點無畸變的相機成像模型如下:
2、相機標定的目的是什么?
為什么要進行相機標定呢?比如,當我們拿到一張圖片,進行識別之后,得到的兩部分之間的距離為多少多少像素,但是這多少多少像素究竟對應實際世界中的多少米呢?這就需要利用相機標定的結果來將像素坐標轉換到物理坐標來計算距離(當然這里值得說明,僅僅利用單目相機標定的結果,是無法直接從像素坐標轉化到物理坐標的,因為透視投影丟失了一個維度的坐標,所以測距其實需要雙目相機)。
相機標定的目的其實很簡單,我們要想對一個成像系統建模,進而進行相應的計算,所必須的參數就是相機的內參矩陣: 和相機的外參矩陣
,因此,相機標定的第一個目的就是獲得相機的內參矩陣和外參矩陣。
3、畸變與畸變矯正
另外,相機拍攝的圖片還存在一定的畸變,畸變包括桶形畸變和枕形畸變。對於畸變原理還不太明白的同學需要先查一查學習一下。
畸變模型包括徑向畸變和切向畸變。
徑向畸變公式(3階)如下:
切向畸變公式如下:
其中,分別為理想的無畸變的歸一化的圖像坐標、畸變后的歸一化圖像坐標, 為圖像像素點到圖像中心點的距離,即
。
相機標定的第二個目的就是獲得相機的畸變參數,如上式中的 等,進而對拍攝的圖片進行去畸變處理。
二、張正友標定法簡介
張正友標定法利用如下圖所示的棋盤格標定板,在得到一張標定板的圖像之后,可以利用相應的圖像檢測算法得到每一個角點的像素坐標 。
張正友標定法將世界坐標系固定於棋盤格上,則棋盤格上任一點的物理坐標 ,由於標定板的世界坐標系是人為事先定義好的,標定板上每一個格子的大小是已知的,我們可以計算得到每一個角點在世界坐標系下的物理坐標
。
我們將利用這些信息:每一個角點的像素坐標 、每一個角點在世界坐標系下的物理坐標
,來進行相機的標定,獲得相機的內外參矩陣、畸變參數。
三、標定相機的內參矩陣和外參矩陣
張正友標定法標定相機的內外參數的思路如下:
1)、求解內參矩陣與外參矩陣的積;
2)、求解內參矩陣;
3)、求解外參矩陣。
1、求解內參矩陣與外參矩陣的積
將世界坐標系固定於棋盤格上,則棋盤格上任一點的物理坐標 ,因此,原單點無畸變的成像模型可以化為下式。其中,
為旋轉矩陣
的前兩列。為了簡便,將內參矩陣記為
。
我們對於上式做一定的說明。對於不同的圖片,內參矩陣 為定值;對於同一張圖片,內參矩陣
,外參矩陣
為定值;對於同一張圖片上的單點,內參矩陣
,外參矩陣
,尺度因子
為定值。
我們將 記為矩陣
,
即為內參矩陣和外參矩陣的積,記矩陣
的三列為
,則有:
利用上式,消去尺度因子 ,可得:(此處感謝
科學嚴謹的態度終於解決了我關於尺度因子的矛盾之處)
此時,尺度因子 已經被消去,因此上式對於同一張圖片上所有的角點均成立。
是像素坐標系下的標定板角點的坐標,
是世界坐標系下的標定板角點的坐標。通過圖像識別算法,我們可以得到標定板角點的像素坐標
,又由於標定板的世界坐標系是人為定義好的,標定板上每一個格子的大小是已知的,我們可以計算得到世界坐標系下的
。
由這里的 是齊次矩陣,有8個獨立未知元素。每一個標定板角點可以提供兩個約束方程(
的對應關系、
的對應關系提供了兩個約束方程),因此,當一張圖片上的標定板角點數量等於4時,即可求得該圖片對應的矩陣
。當一張圖片上的標定板角點數量大於4時,利用最小二乘法回歸最佳的矩陣
。
2、求解內參矩陣
我們已知了矩陣 ,接下來需要求解相機的內參矩陣
。
我們利用作為旋轉矩陣
的兩列,存在單位正交的關系,即:
則由 和
的關系,可知:
代入可得:
另外,我們發現,上述兩個約束方程中均存在矩陣 。因此,我們記
,則
為對稱陣。我們試圖先求解出矩陣
,通過矩陣
再求解相機的內參矩陣
。
同時,為了簡便,我們記相機內參矩陣 為:
則:
則用矩陣 表示矩陣
得:
注意:由於為對稱陣,上式出現了兩次
。
這里,我們可以使用 將前面通過
單位正交得到的約束方程化為:
因此,為了求解矩陣 ,我們必須計算
。則:
上述方程看起來有點復雜,但是其實不然,我們可以記:
則上述方程化為:
此時,通過 單位正交得到的約束方程可化為:
即:
其中,矩陣
由於矩陣 已知,矩陣
又全部由矩陣
的元素構成,因此矩陣
已知。
此時,我們只要求解出向量 ,即可得到矩陣
。每張標定板圖片可以提供一個
的約束關系,該約束關系含有兩個約束方程。但是,向量
有6個未知元素。因此,單張圖片提供的兩個約束方程是不足以解出來向量
。因此,我們只要取3張標定板照片,得到3個
的約束關系,即6個方程,即可求解向量
。當標定板圖片的個數大於3時(事實上一般需要15到20張標定板圖片),可采用最小二乘擬合最佳的向量
,並得到矩陣
。
根據矩陣 的元素和相機內參
的對應關系(如上式),可得到:
即可求得相機的內參矩陣 。
3、求解外參矩陣
這里再次強調一下,對於同一個相機,相機的內參矩陣取決於相機的內部參數,無論標定板和相機的位置關系是怎么樣的,相機的內參矩陣不變。這也正是在第2部分“求解內參矩陣”中,我們可以利用不同的圖片(標定板和相機位置關系不同)獲取的矩陣 ,共同求解相機內參矩陣
的原因。
但是,外參矩陣反映的是標定板和相機的位置關系。對於不同的圖片,標定板和相機的位置關系已經改變,此時每一張圖片對應的外參矩陣都是不同的。
在關系: 中,我們已經求解得到了矩陣
(對於同一張圖片相同,對於不同的圖片不同)、矩陣
(對於不同的圖片都相同)。通過公式:
,即可求得每一張圖片對應的外參矩陣
。
注意,這里值得指出,完整的外參矩陣為 。但是,由於張正友標定板將世界坐標系的原點選取在棋盤格上,則棋盤格上任一點的物理坐標
,將旋轉矩陣的
的第三列
消掉,因此,
在坐標轉化中並沒有作用。但是
要使得
滿足旋轉矩陣的性質,即列與列之間單位正交,因此可以通過向量
的叉乘,即
,計算得到
。
此時,相機的內參矩陣和外參矩陣均已得到。
注:以上推導都是假設不存在畸變參數的情況下成立的。但是事實上,相機是存在畸變參數的,因此,張正友標定法還需要通過L-M算法對於參數進行迭代優化。
四、標定相機的畸變參數
張正友標定法僅僅考慮了畸變模型中影響較大的徑向畸變。
徑向畸變公式(2階)如下:
其中,分別為理想的無畸變的歸一化的圖像坐標、畸變后的歸一化圖像坐標,
為圖像像素點到圖像中心點的距離,即
。
圖像坐標和像素坐標的轉化關系為:
其中,為理想的無畸變的像素坐標。由於
接近於
,則上式近似為:
同理可得畸變后的像素坐標的表達式為:
代入徑向畸變公式(2階)則有:
可化簡得:
即為:
每一個角點,只要知道畸變后的像素坐標 、理想的無畸變的像素坐標
,就可以構造兩個上述等式。那么,有m幅圖像,每幅圖像上有n個標定板角點,則將得到的所有等式組合起來,可以得到mn個未知數為
的約束方程,將約束方程系數矩陣記為
,等式右端非齊次項記為
,可將其記着矩陣形式:
之后,利用最小二乘法可得:
此時,相機的畸變矯正參數已經標定好。
那么,如何獲得畸變后的像素坐標 和理想的無畸變的像素坐標
呢?
可以通過識別標定板的角點獲得,
可以通過如下方法近似求得。世界坐標系下每一個角點的坐標
是可以計算得到的,我們利用已經求得的外參矩陣
和內參矩陣
進行反投影。
利用上式,消去尺度因子 ,可得:
即可得到理想的、無畸變的像素坐標。當然,由於外參矩陣
和內參矩陣
是在有畸變的情況下獲得的,這里得到的像素坐標
並不是完全理想的、無畸變的。我們的總邏輯是,在進行內參矩陣和外參矩陣的求解的時候,我們假設不存在畸變;在進行畸變系數的求解的時候,我們假設求得的內參矩陣和外參矩陣是無誤差的。最后,我們再通過L-M算法對於參數進行迭代優化。
需要指出,上述公式推導的時候以2階徑向畸變為例,但實際上更高階的徑向畸變同理,只是需要的約束方程個數更多而已。
注:以下部分為個人提出的方法。
在 矩陣的構建過程中,需要用到
。而由於張正友標定法不能直接求出焦距
,理想的無畸變的歸一化的圖像坐標
無法求解,造成
矩陣無法構建的問題。
但是個人思考了一種解決方案。
世界坐標系下的標定板角點的坐標 乘上剛體變換矩陣(外參矩陣)即可轉化為相機坐標系下的標定板角點坐標
。
此時,相機坐標系下的標定板角點坐標 乘上透視投影矩陣可得:
其中,為理想的無畸變的歸一化的圖像坐標。即為:
記 ,則有
。
帶入 中,可得:
我們將上式重新記為,此時這個系數矩陣
是可以完全求出來的,利用最小二乘法求解
為:
這里解得的 雖然不是真正的畸變系數,但是由於焦距
是定值,因此
也是定值,當求得
之后,可以將畸變模型化為:
此時可以直接在像素坐標系下對畸變參數進行矯正。
五、L-M算法參數優化
從上述推導過程就可以看出,張正友標定法是有很多近似的,所以僅僅利用上述的過程進行標定誤差肯定是很大的。所以張正友標定法還利用L-M(Levenberg-Marquardt)算法對參數進行了優化。
下一次需要做標定寫報告時更新這一部分。
六、相機標定的步驟
1)、准備一個張正友標定法的棋盤格,棋盤格大小已知,用相機對其進行不同角度的拍攝,得到一組圖像;
2)、對圖像中的特征點如標定板角點進行檢測,得到標定板角點的像素坐標值,根據已知的棋盤格大小和世界坐標系原點,計算得到標定板角點的物理坐標值;
3)、求解內參矩陣與外參矩陣。
根據物理坐標值和像素坐標值的關系,求出 矩陣,進而構造
矩陣,求解
矩陣,利用
矩陣求解相機內參矩陣
,最后求解每張圖片對應的相機外參矩陣
;
4)、求解畸變參數。
利用構造
矩陣,計算徑向畸變參數;
5)、利用L-M(Levenberg-Marquardt)算法對上述參數進行優化。
七、源代碼
python基於opencv的源代碼:
Calibration_ZhangZhengyou_Method