菜鳥談相機標定(一):張氏標定原理淺析
好久沒寫部落格了,今天嘛,咱們來盤盤相機標定的道!!!
本弟弟最近面試的時候被問到相機標定的演算法流程,還有相機標定精度對SLAM演算法的影響,幸虧我原先看過張正友的論文,也看過X乎網友大神寫的一些blog,於是我就和麵試官大概談了一下張氏標定的求解思路和標定的影響,萬幸面試官反饋還不錯。
本弟弟認為,一個合格的工程師,必須要知其然,更要知其所以然。所以本弟弟回家後查了一下相關資料,發現相機標定這一塊竟然如此複雜,甚至標定板的大小,拍攝標定板的角度都都會對標定精度有影響,根本不是我們調個OpenCV函式,隨便拍攝幾張圖片那麼簡單。同時,相機模型的選用還有標定結果的評價,也對SLAM系統的影響非常之巨大。
為了記錄這次所學,也為了和廣大網友共同進步,共同學習,準備寫一系列關於相機模型和標定的文章。
正如筆者的網名,我就是個弟弟,也剛開始學習,技術水平還比較低,寫的也是自己的學習體會,如有疏漏,非常歡迎各位網友批評指正,麼麼噠。
本文是第一篇,先從最簡單的針孔模型(pinhole model)標定講起。
首先嘛,關於相機標定呢,有幾種方法:(1)。相機自標定法。(2)。基於主動視覺的標定方法。(3)。基於標定物的相機標定方法。張氏標定法屬於第三種方法。
本文主要分為以下幾部分,
重點是OpenCV中的程式碼梳理
:
張氏標定論文簡介。
張氏標定的OpenCV程式碼梳理
(重點關注相機內參初始化部分,
因為程式碼和論文的實現方式有一些不同。
隨後的內參外參和畸變最佳化問題,個人認為說白了就是個BA問題,本文不準備深入探究。關於BA,歡迎閱讀我的另一篇文章:劉弟弟:淺談PNP的BA求解!)。
總結與討論。
1.張氏標定論文簡介(
Zhang Z 。 A Flexible New Technique for Camera Calibration[J]。 IEEE Transactions on Pattern Analysis and Machine Intelligence, 2000, 22(11):1330-1334。)
張氏標定,簡單來說就是個透過單應矩陣的約束求解相機內參的過程。
1.1 棋盤格空間位置求解
因為我們使用棋盤格來作為標定物,那麼棋盤格的大小和個數我們都是知道的,這樣,如果我們定義棋盤格所在的平面為(世界座標系下):
的平面,那麼棋盤格上的每個角點的3D座標我們都可以確定為:
這樣,如果我們有N張照片,且已知棋盤格的大小和個數,我們就可以得到每個3D點的位置(可以定義棋盤上任意一點為世界座標系原點)。然後,透過角點檢測,我們就可以確定N組匹配好的3D點座標和2D點座標了。
1.2單應矩陣
1。1 論文中的相機內參矩陣定義
首先定義相機內參矩陣A,這和我們平時使用的針孔模型有些不同,除了fx,fy,cx,cy被換了個名字之外,A矩陣還多了個引數γ,論文中解釋為“The parameter describing the skewness of the two image axes。”不過我看論文裡面可以直接把γ設定為0,並且OpenCV裡面也確實是這麼做的,咱們就直接把γ當成0吧,哈哈。
為了統一符號,本文以後的相機內參表示以論文中的符號為準。
上圖方程(1)中,
代表影象上的點,
代表棋盤格上的3D位置點,
代表尺度因子。
因為我們有N組已知匹配的3D點與2D點,我們對(1)式進行簡化,可以得到單應矩陣表示的方程。
1。2 單應矩陣
再對上式進行一些變換,可以構建出兩個約束:
1。3 利用單應矩陣構建約束
簡單寫下(3)和(4)的推導過程:
因為:
所以,針對於(3)式:
針對於(4)式:
同理可得:
推導過程用到了旋轉矩陣
單位正交的性質(
為單位向量且相互正交)。
1.3 絕對二次曲線(absolute conic)與絕對二次曲面
暫略,有空寫,附參考:
多檢視幾何(multiple view geometry)中的二次曲線,二次曲面到底有什麼用?
1.4 初始化內參數的求解
有了約束方程,我們就可以求解未知引數了
(建議看看原論文,X乎打公式太麻煩了,我就不打了,直接貼圖)。
這樣求解出來的
和
,還有內參矩陣
了,相機內參和外參的初始化就完成了。
2.張氏標定的opencv程式碼梳理
這篇文章太長了,其餘內容挪到下一篇文章裡面:
下一篇:凡事要輕重緩急