綜述 | 相機標定方法


本文作者蔡量力,公眾號:計算機視覺life成員,由於格式原因,公式顯示可能出問題,建議閱讀原文鏈接:綜述 | 相機標定方法
另外推薦幾個原創的號 計算機視覺,Python,自然語言處理、數據挖掘相關,匯總最新資源,學習更高效!

​ 在圖像測量過程以及機器視覺應用中,為確定空間物體表面某點的三維幾何位置與其在圖像中對應點之間的相互關系,必須建立相機成像的幾何模型,這些幾何模型參數就是相機參數。在大多數條件下這些參數(內參、外參、畸變參數)必須通過實驗與計算才能得到,這個求解參數的過程就稱之為相機標定(或攝像機標定)。無論是在圖像測量或者機器視覺應用中,相機參數的標定都是非常關鍵的環節,其標定結果的精度及算法的穩定性直接影響相機工作產生結果的准確性。因此,做好相機標定是做好后續工作的前提,提高標定精度是科研工作的重點所在。

​ 標定的目的主要為解決兩個問題:

​ a、確定世界坐標系下三維空間點與像素平面像素點間的轉換關系(內外參);

​ b、確定相機成像過程中的畸變系,用於圖像矯正。

針孔相機模型

相機將三維世界中的坐標點(單位:米)映射到二維圖像平面(單位:像素)的過程能夠用一個幾何模型來描述,其中最簡單的稱為針孔相機模型 (pinhole camera model),其框架如下圖所示:

圖 1

其中,涉及到相機標定涉及到了四大坐標系,分別為:

像素坐標系img:為了描述物體成像后的像點在數字圖像上(相片)的坐標而引入,是我們真正從相機內讀取到的信息所在的坐標系。單位為個(像素數目)。

成像平面坐標系img:為了描述成像過程中物體從相機坐標系到圖像坐標系的投影透射關系而引入,方便進一步得到像素坐標系下的坐標。 單位為m。

相機坐標系img:在相機上建立的坐標系,為了從相機的角度描述物體位置而定義,作為溝通世界坐標系和圖像/像素坐標系的中間一環。單位為m。

世界坐標系img:用戶定義的三維世界的坐標系,為了描述目標物在真實世界里的位置而被引入。單位為m。

下面,我們來詳細推導從世界坐標系到像素坐標的過程。

世界坐標系到相機坐標系

從世界坐標系到相機坐標系, 這是一個剛體變換,只需對世界坐標系的三維點作用一個旋轉R和平移t(R,t即為相機的外參),變換過程可以通過一下公式完成:

相機坐標系到成像平面坐標系

這一過程進行了從三維坐標到二維坐標的轉換,也即投影透視過程(用中心投影法將物體投射到投影面上,從而獲得的一種較為接近視覺效果的單面投影圖,也就是使我們人眼看到景物近大遠小的一種成像方式)。

成像過程如下圖所示:針孔面(相機坐標系)在圖像平面(圖像坐標系)和物點平面(棋盤平面)之間,所成圖像為倒立實像。

圖 2

但是為了在數學上更方便描述,我們將相機坐標系和圖像坐標系位置對調,變成下圖所示的布置方式(沒有實際的物理意義,只是方便計算):

圖 3

此時,假設相機坐標系中有一點M,則在理想圖像坐標系下(無畸變)的成像點P的坐標為(可由相似三角形原則得出):

f為焦距,整理,得:

成像平面坐標系到像素坐標系

圖 4

如上圖,成平面坐標系和像素坐標系之間存在一個縮放和平移

整理得:

以fx、fy的方式表示為:

其中

  • α、β的單位為像素/米;
  • fx、fy為x、y方向的焦距,單位為像素;
  • (cx,cy)為主點,圖像的中心,單位為像素。

那么,相機坐標系到像素坐標系的最終形式可寫成:

將 Zc移到左邊:

所以,在世界坐標系中的三維點M=[X,Y,Z]T 和像素坐標系中二維點m=[u,v]T的關系為:

即:

其中,s為縮放因子,A為相機的內參矩陣,[R t]為相機的外參矩陣,分別為m和M對應的齊次坐標。

畸變模型

我們在攝像機坐標系到圖像坐標系變換時談到透視投影。攝像機拍照時通過透鏡把實物投影到像平面上,但是透鏡由於制造精度以及組裝工藝的偏差會引入畸變,導致原始圖像的失真。因此我們需要考慮成像畸變的問題。

透鏡的畸變主要分為徑向畸變和切向畸變,還有薄透鏡畸變等等,但都沒有徑向和切向畸變影響顯著,所以我們在這里只考慮徑向和切向畸變。

徑向畸變

顧名思義,徑向畸變就是沿着透鏡半徑方向分布的畸變,產生原因是光線在原理透鏡中心的地方比靠近中心的地方更加彎曲,這種畸變在普通廉價的鏡頭中表現更加明顯,徑向畸變主要包括桶形畸變和枕形畸變兩種。以下分別是枕形和桶形畸變示意圖:

圖 5

實際情況中我們常用r=0處的泰勒級數展開的前幾項來近似描述徑向畸變,矯正徑向畸變前后的坐標關系為:

切向畸變

切向畸變是由於透鏡本身與相機傳感器平面(像平面)或圖像平面不平行而產生的,這種情況多是由於透鏡被粘貼到鏡頭模組上的安裝偏差導致。畸變模型可以用兩個額外的參數p1和p2來描述:

其中,

所以,我們一共需要5個畸變參數(k1,k2,k3,p1,p2)來描述透鏡畸變。

綜上所述,相機標定實際上就是確定相機的內外參數、畸變參數的過程。

以上是對於單個相機進行標定,那么對於多目相機系統或者RGBD 相機的標定呢?

立體標定

對於多目相機系統或者RGBD 相機除了要對別對每個相機進行以上標定以外,還需要求傳感器之間的變換T,以使同一時刻獲取的數據能夠“對齊”,以雙目為例,左右兩個相機的坐標系如下圖:

 圖 6

計算出兩個攝像機之間的旋轉矩陣R和平移向量t,方法是分別計算出兩個攝像機的R和T,再由以下公式計算:

\[R=R_r\bullet R_l\\ t=t_r-R\bullet t_l \]

立體匹配

由於單相機獲取的圖像只能計算出二維坐標,因為我們使用了2套相機,且2套相機之間的關系也是已知的,那么如果我們能把三維空間中某點在左右相機成像的二維坐標都計算出來,且能知道這是同一個點,這樣就可以計算出三維坐標。這里面確認同名點的技術就是立體匹配。立體匹配有很多種算法,其中局部匹配法是最常用的,但是就目前已有算法來說,沒有一種算法可以實現100%匹配。一般來說待匹配點越多,匹配准確率越低。

現有標定方法介紹

相機標定方法有:傳統相機標定法、主動視覺相機標定法、相機自標定法。

標定方法 優點 缺點 常用方法
傳統相機標定法 可使用於任意的相機模型、 精度高 需要標定物、算法復雜 Tsai兩步法、張氏標定法
主動視覺相機標定法 不需要標定物、算法簡單、魯棒性高 成本高、設備昂貴 主動系統控制相機做特定運動
相機自標定法 靈活性強、可在線標定 精度低、魯棒性差 分層逐步標定、基於Kruppa方程

(左右滑動查看)

  1. Tsai兩步法是先線性求得相機參數,之后考慮畸變因素,得到初始的參數值,通過非線性優化得到最終的相機參數。Tsai兩步法速度較快,但僅考慮徑向畸變,當相機畸變嚴重時,該方法不適用。
  2. 張氏標定法使用二維方格組成的標定板進行標定,采集標定板不同位姿圖片,提取圖片中角點像素坐標,通過單應矩陣計算出相機的內外參數初始值,利用非線性最小二乘法估計畸變系數,最后使用極大似然估計法優化參數。該方法操作簡單,而且精度較高,可以滿足大部分場合。
  3. 基於主動視覺的相機標定法是通過主動系統控制相機做特定運動,利用控制平台控制相機發生特定的移動拍攝多組圖像,依據圖像信息和已知位移變化來求解相機內外參數。這種標定方法需要配備精准的控制平台,因此成本較高。
  4. 分層逐步標定法是先對圖像的序列做射影重建,在重建的基礎上進行放射標定和歐式標定,通過非線性優化算法求得相機內外參數。由於初始參數是模糊值,優化算法收斂性不確定。
  5. 基於Kruppa的自標定法是通過二次曲線建立關於相機內參矩陣的約束方程,至少使用3對圖像來標定相機。圖像序列長度會影響標定算法的穩定性,無法保證射影空間中的無窮遠平面。

以上為單個相機標定的方法,而對於相機-相機、相機-距離傳感器之間進行標定,OpenCV、Matlab都有自帶的工具箱或函數庫可以用來標定,但[1]提出了一個帶有Web界面的工具箱,用於全自動相機到相機和相機到范圍的校准。該系統可在一分鍾內恢復內外參數以及攝像機和距離傳感器之間的轉換。而且,該方法所提出的基於生長的棋盤格角點檢測方法明顯優於OpenCV需要指定棋盤格角點大小的角點檢測方法。詳細介紹請參考《一次拍攝搞定多相機自動化標定》

References:

1、Geiger A, Moosmann F, Car Ö, et al. Automatic camera and range sensor calibration using a single shot[C]//Robotics and Automation (ICRA), 2012 IEEE International Conference on. IEEE, 2012: 3936-3943.

2、針孔相機投影模型以及畸變模型

3、計算機視覺life| 相機標定

4、學習opencv3(中文版) —— Adrian Kaehler & Gary Bradski

5、雙目視覺之相機標定

關注公眾號,點擊“學習圈子”,“SLAM入門“”,從零開始學習三維視覺核心技術SLAM,3天內無條件退款。早就是優勢,學習切忌單打獨斗,這里有教程資料、練習作業、答疑解惑等,優質學習圈幫你少走彎路,快速入門!

推薦閱讀

如何從零開始系統化學習視覺SLAM?
從零開始一起學習SLAM | 為什么要學SLAM?
從零開始一起學習SLAM | 學習SLAM到底需要學什么?
從零開始一起學習SLAM | SLAM有什么用?
從零開始一起學習SLAM | C++新特性要不要學?
從零開始一起學習SLAM | 為什么要用齊次坐標?
從零開始一起學習SLAM | 三維空間剛體的旋轉
從零開始一起學習SLAM | 為啥需要李群與李代數?
從零開始一起學習SLAM | 相機成像模型
從零開始一起學習SLAM | 不推公式,如何真正理解對極約束?
從零開始一起學習SLAM | 神奇的單應矩陣
從零開始一起學習SLAM | 你好,點雲
從零開始一起學習SLAM | 給點雲加個濾網
從零開始一起學習SLAM | 點雲平滑法線估計
從零開始一起學習SLAM | 點雲到網格的進化
從零開始一起學習SLAM | 理解圖優化,一步步帶你看懂g2o代碼
從零開始一起學習SLAM | 掌握g2o頂點編程套路
從零開始一起學習SLAM | 掌握g2o邊的代碼套路
從零開始一起學習SLAM | 用四元數插值來對齊IMU和圖像幀
零基礎小白,如何入門計算機視覺?
SLAM領域牛人、牛實驗室、牛研究成果梳理
我用MATLAB擼了一個2D LiDAR SLAM
可視化理解四元數,願你不再掉頭發
最近一年語義SLAM有哪些代表性工作?
視覺SLAM技術綜述
匯總 | VIO、激光SLAM相關論文分類集錦
研究SLAM,對編程的要求有多高?
2018年SLAM、三維視覺方向求職經驗分享
2018年SLAM、三維視覺方向求職經驗分享
深度學習遇到SLAM | 如何評價基於深度學習的DeepVO,VINet,VidLoc?
AI資源對接需求匯總:第1期
AI資源對接需求匯總:第2期


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM