相機標定(Camera calibration)原理、步驟
author@jason_ql(lql0716)
http://blog.csdn.net/lql0716
在圖像測量過程以及機器視覺應用中,爲確定空間物體表面某點的三維幾何位置與其在圖像中對應點之間的相互關係,必須建立相機成像的幾何模型,這些幾何模型參數就是相機參數。在大多數條件下這些參數必須通過實驗與計算才能得到,這個求解參數的過程就稱之爲相機標定(或攝像機標定)。無論是在圖像測量或者機器視覺應用中,相機參數的標定都是非常關鍵的環節,其標定結果的精度及算法的穩定性直接影響相機工作產生結果的準確性。因此,做好相機標定是做好後續工作的前提,提高標定精度是科研工作的重點所在。
常用術語
內參矩陣: Intrinsic Matrix
焦距: Focal Length
主點: Principal Point
徑向畸變: Radial Distortion
切向畸變: Tangential Distortion
旋轉矩陣: Rotation Matrices
平移向量: Translation Vectors
平均重投影誤差: Mean Reprojection Error
重投影誤差: Reprojection Errors
重投影點: Reprojected Points
1、座標系的轉換
1.1 世界座標系
世界座標系(world coordinate)
(xw,yw,zw) ,也稱爲測量座標系,是一個三維直角座標系,以其爲基準可以描述相機和待測物體的空間位置。世界座標系的位置可以根據實際情況自由確定。
1.2 相機座標系
相機座標系(camera coordinate)
(xc,yc,zc) ,也是一個三維直角座標系,原點位於鏡頭光心處,x、y軸分別與相面的兩邊平行,z軸爲鏡頭光軸,與像平面垂直。
1.3 世界座標系轉換爲相機座標系
其中
1.4 像素座標系、圖像座標系
圖1:
像素座標系(pixel coordinate)
如圖1,像素座標系uov 是一個二維直角座標系,反映了相機CCD/CMOS芯片中像素的排列情況。原點o 位於圖像的左上角,u 軸、v 軸分別於像面的兩邊平行。像素座標系中座標軸的單位是像素(整數)
。像素座標系不利於座標變換,因此需要建立圖像座標系
XOY ,其座標軸的單位通常爲毫米(mm)
,原點是相機光軸與相面的交點(稱爲主點),即圖像的中心點,X 軸、Y 軸分別與u 軸、v 軸平行。故兩個座標系實際是平移關係,即可以通過平移就可得到。圖像座標系轉換爲像素座標系
其中,
1.5 針孔成像原理
圖2:
如圖,空間任意一點
該過程爲透視投影,如下矩陣表示:
其中,
1.6 世界座標系轉換爲像素座標系
其中,
αx=f/dX 、αy=f/dY ,稱爲u 、v 軸的尺度因子,M1 稱爲相機的內部參數矩陣,M2 稱爲相機的外部參數矩陣,M 稱爲投影矩陣。
2 相機內參與畸變參數
2.1 相機內參
- 參看1.6節所述
2.2 畸變參數
畸變參數(distortion parameters)
畸變(distortion)
是對直線投影(rectilinear projection)的一種偏移。簡單來說直線投影是場景內的一條直線投影到圖片上也保持爲一條直線。
畸變簡單來說就是一條直線投影到圖片上不能保持爲一條直線了,這是一種
光學畸變(optical aberration)
,可能由於攝像機鏡頭的原因。畸變一般可以分爲:徑向畸變、切向畸變
1、徑向畸變來自於透鏡形狀
2、切向畸變來自於整個攝像機的組裝過程畸變還有其他類型的畸變,但是沒有徑向畸變、切向畸變顯著
畸變圖示
徑向畸變
實際攝像機的透鏡總是在成像儀的邊緣產生顯著的畸變,這種現象來源於“筒形”或“魚眼”的影響。
如下圖,光線在原理透鏡中心的地方比靠近中心的地方更加彎曲。對於常用的普通透鏡來說,這種現象更加嚴重。筒形畸變在便宜的網絡攝像機中非常厲害,但在高端攝像機中不明顯,因爲這些透鏡系統做了很多消除徑向畸變的工作。
對於徑向畸變,成像儀中心(光學中心)的畸變爲0,隨着向邊緣移動,畸變越來越嚴重。
徑向畸變包括:枕形畸變、桶形畸變
切向畸變
切向畸變是由於透鏡製造上的缺陷使得透鏡本身與圖像平面不平行而產生的。
切向畸變可分爲:薄透鏡畸變、離心畸變
切向畸變圖示:
2.2.1 opencv中的畸變模型
- 徑向畸變模型:
以下公式由泰勒展式得出,在opencv中
- 切向畸變模型:
- 理想座標
(x′,y′) 與真實座標(x,y) :
也即:
實際計算過程中,如果考慮太多高階的畸變參數,會導致標定求解的不穩定。
2.2.2 張氏標定中的畸變模型
張正友的方法只考慮了徑向畸變,沒有考慮切向畸變
模型:
理想情況下(沒有畸變)圖片的像素座標爲:
(u,v) 真實的像素座標爲:
(u¯,v¯) 真實座標與理想座標的關係式(泰勒展開):
(x,y) and(x¯,y¯) are the ideal (distortion-free) and real (distorted) normalized image coordinates.
x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
y¯=y+y[k1(x2+y2)+k2(x2+y2)2] 其中
k1 ,k2 是徑向畸變係數(coefficients of the radial distortion)。像素座標表示爲:
u¯=u+(u−u0)[k1(x2+y2)+k2(x2+y2)2] v¯=v+(v−v0)[k1(x2+y2)+k2(x2+y2)2] 即:
[(u−u0)(x2+y2)(v−v0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)][k1k2]=[u¯−uv¯−v]
2.2.3 Tasi畸變模型
- Tasi畸變模型同張氏畸變模型類似,也只考慮了徑向畸變
2.3 相機標定
- 相機標定步驟:
1、打印一張棋盤格,把它貼在一個平面上,作爲標定物。
2、通過調整標定物或攝像機的方向,爲標定物拍攝一些不同方向的照片。
3、從照片中提取棋盤格角點。
4、估算理想無畸變的情況下,五個內參和六個外參。
5、應用最小二乘法估算實際存在徑向畸變下的畸變係數。
6、極大似然法,優化估計,提升估計精度。
3 Matlab相機標定
- 打開matlab,找到“Camera Calibrator”並打開
- 在新窗口中選擇添加圖片“Add Images”
- 添加圖片之後,會有如下提示,設置棋盤格的實際大小之後,點擊ok
- 點擊“Calibrate”開始計算
- 點擊“Export Camera Parameters”,輸出到matlab命令窗口
- 導出的數據如下:
cameraParams =
cameraParameters (具有屬性):
Camera Intrinsics
IntrinsicMatrix: [3x3 double]
FocalLength: [510.6720 511.9534]
PrincipalPoint: [332.3800 238.4849]
Skew: 0
Lens Distortion
RadialDistortion: [0.0618 -0.4877]
TangentialDistortion: [0 0]
Camera Extrinsics
RotationMatrices: [3x3x50 double]
TranslationVectors: [50x3 double]
Accuracy of Estimation
MeanReprojectionError: 0.1923
ReprojectionErrors: [77x2x50 double]
ReprojectedPoints: [77x2x50 double]
Calibration Settings
NumPatterns: 50
WorldPoints: [77x2 double]
WorldUnits: 'mm'
EstimateSkew: 0
NumRadialDistortionCoefficients: 2
EstimateTangentialDistortion: 0
estimationErrors =
cameraCalibrationErrors (具有屬性):
IntrinsicsErrors: [1x1 intrinsicsEstimationErrors]
ExtrinsicsErrors: [1x1 extrinsicsEstimationErrors]
- 在命令窗口輸入以下命令即可獲得內參矩陣和徑向畸變:
>> cameraParams.IntrinsicMatrix
ans =
510.6720 0 0
0 511.9534 0
332.3800 238.4849 1.0000
>> cameraParams.RadialDistortion
ans =
0.0618 -0.4877
參考資料
相關文章
《學習opencv》