天天看點

立體視覺入門指南:相機标定之Zhang式标定法

作者丨李迎松@知乎

親愛的同學們,我們的世界是3D世界,我們的雙眼能夠觀測三維資訊,幫助我們感覺距離,導航避障,進而翺翔于天地之間。而當今世界是智能化的世界,我們的科學家們探索各種機器智能技術,讓機器能夠擁有人類的三維感覺能力,并希望在速度和精度上超越人類,比如自動駕駛導航中的定位導航,無人機的自動避障,測量儀中的三維掃描等,都是高智機器智能技術在3D視覺上的具體實作。

立體視覺是三維重建領域的重要方向,它模拟人眼結構用雙相機模拟雙目,以透視投影、三角測量為基礎,通過邏輯複雜的同名點搜尋算法,恢複場景中的三維資訊。它的應用十分之廣泛,自動駕駛、導航避障、文物重建、人臉識别等諸多高科技應用都有它關鍵的身影。

本課程将帶大家由淺入深的了解立體視覺的理論與實踐知識。我們會從坐标系講到相機标定,從被動式立體講到主動式立體,甚至可能從深度恢複講到網格建構與處理,感興趣的同學們,來和我一起探索立體視覺的魅力吧!

本課程是電子資源,是以行文并不會有太多條條框框的限制,但會以邏輯清晰、淺顯易懂為目标,水準有限,若有不足之處,還請不吝賜教!

大家好,上一篇:立體視覺入門指南:關鍵矩陣(本質矩陣,基礎矩陣,單應矩陣)https://zhuanlan.zhihu.com/p/377794028

中,我們對立體視覺的3個關鍵矩陣:本質矩陣 E 、基礎矩陣 F、單應性矩陣H作了較為詳細的描述,同時給出了本質矩陣、單應性矩陣的求解方法以及本質矩陣分解外參R,t 的具體公式。更加難能可貴的是,我們在博文最後提供了幾個作業題并在Github開源了參考答案代碼【我知道很多心理都在默念李博666】【當然肯定也有一些人在默念這太easy了李博能不能上點難度】。無論如何,部落客覺得這是一件有意義的事情,隻希望沒有誤人子弟。

而本篇的内容,則是立體視覺的絕對核心子產品:相機标定。雖然它因為技術相對成熟,如今研究的人不多,也容易被人忽略,往往用一個開源算法庫如Opencv或者Matlab标定工具箱就直接搞定,但實際在立體視覺工程化、産品化時,開源工具由于其精度不高、靈活度低而不建議直接使用,企業往往是自己開發相機标定算法。相機标定作為立體視覺的核心子產品,掌握其理論是相當必要的,對我們深入了解立體視覺技術大有幫助,有開山辟路之效

立體視覺入門指南:相機标定之Zhang式标定法

所謂标定,即是由大量觀測值拟合參數模型的過程,且在此拟合的參數模型是已知的,是以應盡可能探索能便捷擷取大量觀測值的方案,如果觀測值之間還滿足一些其他的幾何限制就更有助于求解具體單個參數值。

今天所述的Zhang式标定法1即提供了一種便捷擷取大量觀測值的的方案,同時觀測值之間還滿足一類明顯的幾何限制(即平面限制),可直接求解出内外參。其操作方式非常簡單,隻需要拍攝帶有标定闆圖案的平面,即可完成相機标定,使标定難度極大降低,如果不追求高精度,列印一張棋盤格标定闆圖案粘貼到近似平的硬紙闆上即可完成标定,加快了立體視覺的入門和普及,影響深遠,是相機标定領域絕對的經典。

本篇即帶大家深入了解Zhang式相機标定法,掌握本篇對立體視覺的理論掌握及工程實戰來說都是非常必要的。

實施方法

Zhang式标定法能夠被廣泛應用,其中一個重要原因是其實施方法十分簡單,不需要專業的工藝制作即可完成。

第一步,設計一張具有明顯角點特征,且已知每個角點二維坐标的圖案作為标定圖案,常見的圖案有三種:

立體視覺入門指南:相機标定之Zhang式标定法

規則的圖案設計可以友善的計算出角點在圖案内的二維坐标,拿棋盤格來說,角點之間的間隔像素數是固定的,假設左上角角點的坐标為(0,0),則其他角點的像素坐标都可以通過格子的偏移量計算出來,而一張已知DPI的标定闆圖像,在列印後每個角點的二維空間坐标也是完全已知的(通過像素換算成空間尺寸)。

第二步,将标定闆圖案以某種方式置于一個平面上。比如最簡單的方式是将标定圖原尺寸列印出來,然後找一塊近似平的平闆,将列印後的标定圖案粘貼至平闆上;更專業高精度的方式是找專業廠家制作高精平闆(如陶瓷闆)并将标定圖案以某種工藝刻印到平闆上。這一步的目的是讓标定圖案的角點都位于一個平面上。

立體視覺入門指南:相機标定之Zhang式标定法

圖檔來源:Calibration Patterns Explained

如此,第一步所描述的二維坐标可以轉換成第三維  坐标等于0的三維坐标(将世界坐标系的原點放在标定闆的某個角點,Z軸垂直于标定闆)。

第三步,移動相機到N(N>=3)個不同的位姿拍攝标定闆圖案。

立體視覺入門指南:相機标定之Zhang式标定法

第四步,對上一步拍攝的标定闆圖案進行角點提取,解算标定參數。

立體視覺入門指南:相機标定之Zhang式标定法

matlab軟體标定示意圖

以上便是相機标定的實施步驟,總結來說,在一個平面标定闆上有一組已知空間坐标的角點,相機在多個不同位姿下拍攝角點圖案并提取角點的像素坐标,即可完成相機内外參數的解算。這句總結蘊含2個重要的知識點:

1.标定圖案中角點的空間坐标是已知的,且它們都位于一個平面上, Z坐标等于0

2.相機需要在多個不同的位姿拍攝角點圖案并提取像素坐标

可以看到Zhang式标定法确實是易于實施的方法,其中蘊含的标定理論,是非常有價值的,對于立體視覺的初學者來說,掌握其理論很有必要,還請務必閱讀本篇接下來的内容。

理論基礎

定義

立體視覺入門指南:相機标定之Zhang式标定法

單應性矩陣

在實施方法中,我們一定能夠關注到一個非常關鍵的資訊:标定圖案被置于一個平面上。它的目的是為了讓标定圖案中的角點都位于一個空間平面上,進而當相機拍攝角點成像後,空間平面和像平面之間存在一個單應性變換關系,即可通過一個單應性矩陣H将角點的空間坐标轉換成圖像坐标。

立體視覺入門指南:相機标定之Zhang式标定法

對内參的限制

立體視覺入門指南:相機标定之Zhang式标定法

由上式可知,單應性矩陣H和内參矩陣A的元素之間滿足兩個線性方程限制。如果能夠計算出單應性矩陣,直覺上感覺應該可通過解線性方程解出内參矩陣。具體是否可以呢?我們繼續往下看。

相機參數求解

本小節将帶大家了解相機參數的具體解法,回答上節遺留的問題,即是否能夠通過公式(7)來求解相機參數。

本小節将分為3個部分,第一部分介紹直接由式(7)求解相機參數的閉合解公式;第二部分介紹相機參數的最大似然解法;第三部分介紹考慮相機畸變後的畸變參數解法。

閉合解

立體視覺入門指南:相機标定之Zhang式标定法
立體視覺入門指南:相機标定之Zhang式标定法

這是一個典型的線性方程組,系數矩陣的行數為2,求解6維向量 b 。由公式(4),當相機在1個位姿下拍攝标定闆圖案後,經過角點的像素坐标提取,可得所有角點的世界坐标系和像素坐标系的對應關系,進而通過線性方程組的最小二乘解法求解目前位姿下的單應性變換矩陣 H ,可得公式(11)的具體表達式。

但公式(11)的系數矩陣隻有2行,要求解6維向量b是不夠的。是以我們需要相機在n個位姿下拍攝标定圖案,得到n個單應性矩陣,以及行數為2n的系數矩陣,當 n>=3 時,便可求解6維向量 b 。也就是說至少3張圖檔才能完成相機标定。最後得到的總方程組可表達為:

立體視覺入門指南:相機标定之Zhang式标定法
立體視覺入門指南:相機标定之Zhang式标定法

以上,内外參數全部解出,整個閉合解法完成。

備注:感謝微信公衆号「3D視覺工坊」整理。

最大似然估計

閉合解法可得到代數距離最小的解,并沒有考慮到各個參數實際的幾何含義,由于噪聲的存在,解并不會非常精确。我們可以通過最大似然估計法來擷取更精确的解。

如果我們觀測到标定闆n張拍攝圖像中的m個點對。假設所有點存在獨立的等尺度的噪聲,則最大似然估計即最小化如下表達式:

立體視覺入門指南:相機标定之Zhang式标定法

式(16)是一個非線性表達式,是以這是一個非線性最小化求解問題,可以用Levenberg-Marquardt算法來求解。想必部分同學知道求解該類問題需要一個相對準确的初始化值,這個值便可以使用前一節得到的閉合解來擷取。

在工程實踐中,我們通常用ceres-solver庫來搞定這部分。

相機畸變

到目前為止,我們還沒有考慮相機畸變,所有推導都是基于無畸變的理想情況,而實際情況是相機必然會有多多少少的畸變,主要包括兩種:徑向畸變和切向畸變。一般情況下,會考慮3項徑向畸變 k1,k2,k3 和2項切向畸變p1,p2 。在Zhang式标定法中,隻考慮了2項徑向畸變 k1,k2 ,而實際應用時,我們會考慮更多項,原理相同,依次類推即可。

立體視覺入門指南:相機标定之Zhang式标定法

式(17)是一個線性方程組,求解k1,k2看上去是一件簡單的事兒,但實際上卻面臨一個問題,即無法擷取無畸變的理想坐标 (u,v),它需要已知準确的内外參通過投影公式(2)來求解,同學們可能會問:前兩節不是解出了内外參數嗎!?不要忘了,前面是沒有考慮相機畸變的,内外參的求解實際是不精确的(把觀測值當做無畸變坐标來求解的内外參,是有偏差的)。是以這成了一個雞生蛋蛋生雞的沖突問題。

那就幹脆不奢求通過線性方程求出精确畸變,将閉合解得到的内内外參代入公式(2)求出近似的理想坐标 (u,v),進而由公式(17)建立線性方程組求解近似的k1,k2 。

然後,我們建立新的最大似然估計表達式:

立體視覺入門指南:相機标定之Zhang式标定法

同樣通過非線性求解方法來求解所有内外參數和畸變系數。而畸變系數的初值由上面所描述的方法來求解。

實際上,因為畸變系數是非常小值,是以直接将畸變系數的初值全部設定為0也是可以的,這就不需要解線性方程組了。

總結

下面對整個Zhang式标定的流程做一個總結:

1.列印标定圖案并粘貼至一個平面上,稱之為标定闆。

2.通過移動相機或移動标定闆在不同的位姿拍攝多張标定闆圖像(圖像數>=3)。

3.在所有圖像上檢測特征點(角點或者圓心點)。

4.使用閉合解法求解所有内參數和外參數。

5.通過線性方程組求解近似的畸變系數(或者直接指派為0)。

6.通過非線性優化計算精确的内外參數和畸變系數。

以上便是Zhang式标定法的所有理論講解,希望同學們讀完此篇能有醍醐灌頂之效,并能融會貫通,在實際工程應用中得心應手。

在Zhang式标定法的原文中,還有一些值得學習的高階知識點并未在本篇中展現,包括關鍵公式(7)的幾何解釋,以及退化情況下的讨論,感興趣的同學可以繼續閱讀原文來了解。

下一篇我們将帶來相機标定的另一種方法:DLT直接線性變換法。

作業

這裡為大家準備了一些練習題,可以通過實踐加深了解:

1 通過opencv開源庫提供的接口完成相機标定,可使用opencv提供的圖像,也可使用自己的圖像。

2 更高階的是,你能夠自己不依賴opencv庫寫一套相機标定算法嗎?或者隻使用opencv來檢測角點坐标,其他步驟自己來實作。

參考答案位址:https://github.com/ethan-li-coding/StereoV3DCode

[代碼持續更新,大家感興趣可以star和watch,本篇代碼暫缺]。

參考文獻

繼續閱讀