在機器視覺領域,相機標定是不可或缺的一步,而張氏標定法,因其靈活性,是各種標定方法中最有影響力的一種,稱其為相機標定的 "奧林匹斯山" 并不為過
張正友 99年發表的論文 "Flexible Camera Calibration by Viewing a Plane from Unknown Orientations",在 2013年獲得 ICCV 的 Helmholtz Prize,便是對其影響的認可
鑒于該論文的廣泛影響,張后來再三完善論文細節,治學嚴謹可見一斑,網上下載最多的是 "A Flexible New Technique for Camera Calibration",和獲獎那篇差異不大

關于張氏標定法,不再贅述,本文將圍繞"標定精度",和讀者一起翻越相機標定的"奧林匹斯山"
1 相機標定
1.1 定義
已知:世界坐標系中(建在平面標定板上),幾組特征點的空間坐標,以及在像素坐標系中,特征點對應的像素位置坐標
求解:相機的內參和畸變系數

標定板上特征點的空間坐標(3d),通過相機模型,與特征點的像素位置坐標(2d)關聯起來,如下:
$\qquad s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w\\ 1 \end{bmatrix} $
1.2 二維展開
相機標定的程序,就是輸入幾組已知的 3d 特征點坐標和提取的 2d 特征點坐標,將反投影誤差構建為目標函式,在已知相機模型方程的基礎上,通過最小化目標函式,得到相機模型方程的引數
開個腦洞,類比《三體》中的質子展開程序:高維度的相機標定問題,如果展開到二維空間,就是一個曲線擬合的問題,如下圖,參見 Ceres Solver 的曲線擬合例程

分析相機標定的程序,得出影響標定(精度)的三個因素:1) 特征提取;2) 最優化方法;3) 相機模型
2 特征提取
以視場(對角線) 100mm 的機器視覺系統為例,根據卓越成像的最佳實踐原則 #3,可知鏡頭的作業距離約為 200~400mm
選 1/3 英寸(對角線6mm) CIS芯片,同樣根據最佳實踐原則 #3,推測出鏡頭的理想焦距為 12~24mm

假定 CIS芯片的解析度為 1024(H) x 768(V),則 H 方向的"像素解析度"為 80mm/1024pixel ≈ 0.08mm/pixel
這意味著,如果提取的特征點偏差 1個像素,造成的尺寸偏差為 0.08mm,因此,特征提取的精度非常重要
2.1 標定板圖案
特征提取,屬于影像處理范疇,處理的是標定板在相機中的成像圖片,提取的是標定板圖案的特征點 (如角點、圓心等)
常用標定板的圖案,有棋盤格、圓、非對稱圓、圓環,以及 ChArUco 等,Halcon 公司有特定圖案的 Halcon 標定板

一般而言,圓環標定板的標定精度最高,圓次之,棋盤格最低
2.1.1 特征提取精度
參考[2]中,對三種圖案標定板的各五張合成影像(非相機拍攝),添加相同的徑向畸變,比較不同圖案的特征提取精度
1) 棋盤格,特征為角點,利用 OpenCV 先 findChessboardCorners() 粗定位,再 cornerSubPix() 精定位,得定位誤差 6pixel
2) 圓標定板,特征為圓心,定位誤差次小,為 2.6pixel
3) 圓環標定板,特征為圓環中心,定位誤差最小,為 1.7pixel
對于0.08mm/pixel 的機器視覺系統,當鏡頭確定時(畸變系數固定),不同標定板對應的特征,提取精度最大相差 4.3pixel,約 0.34mm

2.1.2 反投影誤差
用這三種圖案的各五張合成影像,來進行標定,得到反投影誤差的 RMSE 分別為 0.1263,0.0517 和 0.0515
而用相機拍攝的三種圖案的實際影像,進行標定后,得到反投影誤差的 RMSE 分別為 0.139,0.135 和 0.115

綜上,圓環標定板的標定精度,略高于圓標定板,二者均高于棋盤格標定板
2.2 迭代標定法
特征提取出現偏差,是因為在標定程序中,標定板要變換位姿,不同位姿會引起透視收縮,導致特征檢測精度降低,張正友的論文里也提到過

2.2.1 偏差原因
當棋盤格旋轉一定角度時,cornerSubPix() 精定位演算法中的梯度,并不和邊緣垂直,導致提取的角點有偏差

將標定板進行透視校正,使棋盤格正對相機,此時演算法中的梯度和影像邊緣垂直,角點提取無偏差
針對位姿導致的特征提取偏差,參考[2]提出了一種迭代標定法:先將影像轉換為平行正對,再檢測特征,重新標定,迭代直至收斂

2.2.2 方法步驟
1)給定影像的特征檢測(角點、圓心或圓環中心)
2)相機標定,得到標定引數
重復以下步驟,直至收斂
3)畸變校正和透視校正(轉換為平行正對影像)
4)在平行正對影像中,檢測特征(模板匹配演算法)
5)根據標定引數(每次迭代更新),將特征點轉換回原始位置
6)相機標定,得到新的標定引數
選相機真實拍攝的影像,采用該方法標定,得到反投影誤差的 RMSE,如下:

從表中看,采用迭代標定法,棋盤格的 RMSE 從 0.14 降到了 0.08,而圓和圓環的,則分別從 0.14 和 0.12 降到了 0.07 和 0.06
以上結果,是參考[2]中所列,本人未實踐過,但在一家公司公眾號的文章中 (參考[4]),發現了類似迭代標定法的動圖,如下:

3 優化方法
張的論文中,輸入影像 ≥11幅時,標定誤差顯著減小,而 Bouguet 標定包,用 20~25幅影像,影像數量越多,意味著提取的特征點也越多

實際中,受照明不均勻、標定板或鏡頭污染、提取演算法等的限制,即使標定板轉換為平行正對,提取的特征點也會有離群點
3.1 RANSAC 標定法
對于特征中離群點的剔除,常用的一種方法是 RANSAC:以反投影誤差 $E_{reproj}$ 做閾值,小于的為內點,大于的為外點,不斷迭代使選定的內點都滿足 $<E_{reproj}$
3.1.1 方法步驟
1)張氏標定法,得到標定引數
2)計算所有特征點的反投影誤差 $E_{reproj}$
3)選 $E_{reproj} < T_{reproj}$ 的所有內點,再次標定得到新的引數
重復步驟 2) 和 3),直到所有的內點都滿足 $E_{reproj} < T_{reproj}$ (文中 T 取 2)
4)對每一幅標定影像,計算其反投影誤差 $E_{img}$,設定 RANSAC 引數初值,例如,$T_{img}=1.2 E_{img}$,最大內點數 $N=\infty$,置信度 $p=0.99$,$i=1$ 等
5)將提取的特征點,在像素位置坐標中畫十字線,均分成四組 (避免四點共線)
6)四組中各選一個點,計算相機外參,綜合之前的相機內參,篩選出滿足 $< T_{img}$ 的內點集 $S_{in}^i$
7)如果本次篩選的 $S_{in}^i$,比之前篩選的內點數量多,則更新 $N$ 值為 $S_{in}^i$ 的內點數
8)當 $i > N$ 時,進入步驟 9),否則,令 $i=i+1$,重復步驟 5) 6) 7)
9)對每一幅影像,都執行步驟 5) 6) 7) 8),獲取每一幅影像的最大內點集 $S_{con}$
10)綜合每幅影像,選出的內點集,再次標定,得到最終的標定引數
以上步驟,和 OpenCV 中的 findHomography() 函式,在求解單應性矩陣時所用的 RANSAC 法類似,可參考之
3.1.2 測驗效果
對于一幅合成的標定影像,添加高斯噪聲后,采用閾值法 和 RANSAC 法,篩選出的內點集,如下:

對于一幅真實的標定影像,當因光照不均等存在離群點時,采用閾值法 和 RANSAC 法,篩選效果如下:

從統計學上分析,隨著提取特征點中離群點的剔除,標定引數更逼近真實值,相機的標定精度也越來越高

由此可知,采用閾值法 和 RANSAC 法,對于大部分的離群點,都能成功的篩選出來
3.2 目標函式
3.2.1 2d 和 3d
考慮鏡頭的畸變,相機標定是一個非線性優化的程序,對于張氏標定法,目標函式在 2d 像平面上,如下:

可定義為像平面中檢測到的特征點 $m_{u}^d$,和反投影到像平面上的特征點$\hat m_{u}^d$之間的像素差,如下:
$\quad\displaystyle\sum_{i=1}^{N} \sum_{j=1}^{L}|| m_{u,i,j}^d - \hat{m}_{u,i,j}^{d}(f_x, f_y, u_0, v_0, k_1, k_2, R_i, t_i)||^2$
在實際應用中,視覺系統測量的是 3d 空間中的特征點,2d 像平面中像素差相同的兩組點對,投射到 3d 空間中的距離差反而不相同

可重定義目標函式,為檢測到的特征點轉換到相機坐標系 $m_c$,和反投影到相機坐標系上的特征點 $\hat m_c$ 之間的距離差,如下:
$\quad\displaystyle\sum_{i=1}^N \sum_{j=1}^L || m_{c,i,j}(R_i, t_i) - \hat{m}_{c, i, j}(f_x, f_y, u_0, v_0,k_1, k_2, R_i, t_i)||^2$
拍攝實際的影像,分別用上述兩種方法進行標定,結果表明:二者的反投影誤差幾無差別

3.2.2 $E_1$ 和 $E_2$
目標函式變了,用原來的反投影誤差來評價標定精度,不再合適,為此,引入三個新的評價指標:
$\quad E_1 = \begin{split}\frac{1}{n}\displaystyle\sum_{i=1}^{n}\sqrt{||M_{c,i} - \hat M_{c,i}||^2} \end{split}$
$\quad E_2 = \begin{split}\frac{1}{n}\displaystyle \sum_{i=1}^{n}\sqrt{||M_{c,i} - \hat L_{c,i}||^2} \end{split}$
$\quad E_3 = \begin{split}\frac{1}{m}\displaystyle \sum_{i,j=1}^{n}\sqrt{(|| M_{w,i} - M_{w,j}|| - ||\hat M_{c,i} - \hat M_{c,j}||)^2} \end{split}$
再次比較這兩種標定方法,結果表明:3d 目標函式的優化精度要高于 2d 目標函式

參考
卓越成像的11條最佳實踐原則
Accurate Camera Calibration using Iterative Refinement of Control Points,2009
Calibration Best Practices
計算機與機器視覺中的高精度相機標定 (下)
Accurate and robust estimation of camera parameters using RANSAC,2012
Camera Calibration Toolbox for Matlab,Jean-Yves Bougue
OpenCV Tutorials / feature2d module / Basic concepts of the homography explained with code
A novel optimization method of camera parameters used for vision measurement,2013
Review of Calibration Methods for Scheimpflug Camera,2018
Automatic machine vision calibration using statistical and neural network methods,2005
原文鏈接: http://www.cnblogs.com/xinxue/
專注于機器視覺、OpenCV、C++ 編程
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/549437.html
標籤:其他
