張正友標定算法解讀
一直以來想寫篇相機標定方面的東西,最近組會上也要講標定方面東西,所以順便寫了。無論是OpenCV還是matlab標定箱,都是以張正友棋盤標定算法為核心實現的,這篇PAMI的文章《A Flexible New Technique for Camera Calibration》影響力極大,張正友是浙江大學的機械系出身,貌似現在是微軟的終身教授了。我就簡單的介紹下算法的核心原理,公式的推理可能有點多。
一 基本問題描述:空間平面的三維點與相機平面二維點的映射。
假設空間平面中三維點:(齊次坐標,世界坐標系)。
相機平面二維點:(齊次坐標,相機坐標系)。
那么空間中的點是如何映射到相機平面上去呢?我們用一個等式來表示兩者之間關系:
(1)
注:A為相機內參矩陣,R,t分別為旋轉和平移矩陣,s為一個放縮因子標量。
我們把等式(1)再簡化下:
(2)
因為張正友算法選取的是平面標定,所以令z=0,所以平移向量只有r1,r2即可。H就是我們常說的單應性矩陣,在這里描述的是空間中平面三維點和相機平面二維點之間的關系。因為相機平面中點的坐標可以通過圖像處理的方式(哈里斯角點,再基於梯度搜索的方式精確控制點位置)獲取,而空間平面中三維點可以通過事先做好的棋盤獲取。所以也就是說每張圖片都可以計算出一個H矩陣。
二 內參限制
我們把H矩陣(3*3)寫成3個列向量形式,那么我們把H矩陣又可寫成:
(3)
注:lamda是個放縮因子標量,也是s的倒數。
那么現在我們要用一個關鍵性的條件:r1和r2標准正交。
正交:(4)
單位向量(模相等): (5)
這個兩個等式是非常優美的,因為它完美的與絕對二次曲線理論聯系起來了,這里就不展開了。
三 相機內參的求解
我們令:
(6)
我們可知B矩陣是個對稱矩陣,所以可以寫成一個6維向量形式:
(7)
我們把H矩陣的列向量形式為:
(8)
那么根據等式(8)我們把等式(4)改寫成:
(9)
(10)
最后根據內參數限制條件(等式(4)(5)):
(11)
即,(12)
V矩陣是2*6矩陣,也就是說每張照片可建立起兩個方程組,6個未知數。根據線性代數知識可知,解6個未知數需至少6個方程組,所以也就是說我們至少需要三張照片就求解未知數。b矩陣的解出,相機內參矩陣A也就求解出,從而每張圖像的R,t也就根據等式(1)迎刃而解。
四 參數優化
因為初始的參數已經求解,所以我們將每張圖像的控制點根據求解的參數重投影回三維空間,最小化與真實值的差異,其實就是建立非線性最小化模型:
(13)
這里用的是Levenberg-Marquardt迭代算法。
至此,整個流程走完,至於相機畸變系數的求解本文也不具體展開了。