說明:以下涉及到的一些公式以及圖片來自於Learning OpenCV。
做了快2個月的立體相機標定,遇到了一些問題,也有了一些體會,在這裏記下來。
1.在做立體相機標定的時候,標定板的規範與否直接影響到最後標定的結果,進而會影響目標3D座標重建。
這裏說的規範指的是,打印的棋盤格(或者圓點)需要保證每個square都是嚴格大小一致的,即打印出來後每個棋盤格大小應一樣;打印出來的棋盤格要儘量平整的附在某一平面或者玻璃板上,然後才能用來拍攝標定圖像;測量squareSize的時候,要儘可能的精確,也就是說,棋盤格的實際物理尺寸對標定結果影響很大。
對左右相機出來圖像要有深刻的理解,左圖的目標處於相對偏右的位置,左右相機出來的圖像千萬不要弄反了,建議選取10對以上的圖像對做標定。
2.立體相機標定的一些概念
2.1.相機投影
像素平面上的點q(x,y)與世界中的點Q(X,Y,Z)的變換對應關係爲:
x = fx(X/Z)+cx,y = fy(Y/Z) + cy;
寫成矩陣的形式:
2.2.透鏡畸變
理論上面可能定義一種透鏡而不引入任何畸變,但是在實際製造中會引入透鏡畸變。徑向畸變來自於透鏡的形狀,切向畸變則來自於整個攝像機的組裝過程。 其他形式的畸變基本可以忽略,在OpenCV標定的過程中,也只針對這兩種畸變做處理。
徑向畸變示意圖如上,其畸變矯正建模如下:
x_corrected = x(1+k1*r²+k2*r^4+k3*r^6);
y_corrected = y(1+k1*r²+k2*r^4+k3*r^6).
(x,y)爲畸變點在成像儀上的原始位置,(x_corrected,y_corrected)爲矯正後的新位置,標定中,k1,k2,k3爲畸變內參。
切向畸變示意圖如上,其畸變矯正建模如下所示:
x_corrected = x + [2*p1*y+p2*(r^2+2x^2)]
y_corrected = y + [p1*(r^2+2*y^2)+2*p2*x]
標定中,p1,p2爲畸變內參。
2.3.立體成像stereo imaging
通過上面的三角關係,利用簡單的相似三角形知識,就可以得到
T-(xl-xr) : (Z-f) = T : Z ==> Z = f*T/(xl - xr)
f爲焦距,T爲baseline,(xl - xr)爲視差,可知求取深度信息只與這三個值有關。
深度與視差成反比例關係,當視差接近0時,微小的視差變化會導致很大的深度變化,當視差較大時,微小的視差變化幾乎不會引起很大的深度變化。
通過相機標定,我們最終要將攝像機在數學上對準到同一個觀察平面上,從而使得攝像機之間的像素行是嚴格平行的。
2.4.對極幾何
立體成像的基本幾何就是對極幾何,運用對極幾何的最終目的是爲了儘可能的縮小兩臺立體攝像機上匹配點出現的可能範圍。
說明幾點:
1.攝像機視圖內的每個3D點都包含在極面內,極面與每幅圖像相交的直線是極線,
2.指定一個圖像上面的特徵,它在另一幅圖像上的匹配視圖一定在對應的極線上,這就是“對極約束”,
3.有了對極約束之後,意味着對二幅圖像間特徵匹配的二維搜索轉變成了沿着極線的一維搜索,這不僅節約了時間,還可排除大量的虛假匹配,
4.不同特徵的次序時保留的,如果A,B在兩成像儀中都可見,按順序水平出現,那麼在另一成像儀上也是水平出現。
2.5.本徵矩陣E與基礎矩陣F
本徵矩陣E是單幾何意義上的,與成像儀無關,它將左攝像機觀測到的點P的物理座標與右攝像機觀測到的相同位置的點關聯起來。
基礎矩陣F則是將一臺攝像機的像平面上的點的像素座標和另一臺攝像機像平面上的點關聯起來。
2.6.重投影矩陣
給定屏幕座標以及內參矩陣,二維點同樣可以重投影到三維世界中,
三維座標就是(X / W , Y / W , Z / W).
3.立體標定stereo calibration
具體參照OpenCV自帶的stereo_calib demo;
在對標定板進行拍攝時,目標棋盤要儘可能清晰,設備分辨率越高對檢測棋盤格角度越精確,棋盤格要以不同姿態擺放,且棋盤格的運動範圍要覆蓋所有圖像區域,這樣才能夠保證標定的參數結果是針對幾乎所有位置的像素進行標定得到的。
3.1.輸入立體圖像對文件:stereo_images.xml
<?xml version="1.0"?>
<opencv_storage>
<imagelist>
"left01.bmp" "left02.bmp" ...
</imagelist>
</opencv_storage>
注意:"left01.bmp" "left02.bmp" 兩個文件名中間要有空格
3.2.輸入squareSize:實際的棋盤格大小mm
測量要精確,畢竟網上賣的玻璃棋盤板都是號稱準確度爲0.001mm。
3.3輸出文件:intrinsic.yml, extrinsic.yml
4.參數解釋
intrinsic params內參
M1,M2--內參矩陣
[fx 0 cx;
M = 0 fy cy;
0 0 1]
D1,D2--畸變向量
D =
k爲徑向畸變,p爲切向畸變.
extrinsic params外參
R--右相機相對左相機的旋轉矩陣
T--右相機相對左相機的平移矩陣
R1,R2--左右相機校準變換(旋轉)矩陣
P1,P2--左右相機在校準後座標系中的投影矩陣
Q--視差-深度映射矩陣,我利用它來計算單個目標點的三維座標
5.三維座標計算
step1. 立體相機標定,獲取相機系統內外參數
step2. 獲取目標點在左右成像平面上的像素座標
step3. 利用標定參數對像素座標進行校準undistortPoints
step4. 利用重投影矩陣計算目標三維座標
三角關係計算座標原理圖示: