author@jason_ql(lql0716)
http://blog.csdn.net/lql0716
java
在圖像測量過程以及機器視覺應用中,爲肯定空間物體表面某點的三維幾何位置與其在圖像中對應點之間的相互關係,必須創建相機成像的幾何模型,這些幾何模型參數就是相機參數。在大多數條件下這些參數必須經過實驗與計算才能獲得,這個求解參數的過程就稱之爲相機標定(或攝像機標定)。不管是在圖像測量或者機器視覺應用中,相機參數的標定都是很是關鍵的環節,其標定結果的精度及算法的穩定性直接影響相機工做產生結果的準確性。所以,作好相機標定是作好後續工做的前提,提升標定精度是科研工做的重點所在。算法
經常使用術語
內參矩陣: Intrinsic Matrix
焦距: Focal Length
主點: Principal Point
徑向畸變: Radial Distortion
切向畸變: Tangential Distortion
旋轉矩陣: Rotation Matrices
平移向量: Translation Vectors
平均重投影偏差: Mean Reprojection Error
重投影偏差: Reprojection Errors
重投影點: Reprojected Points
網絡
一、座標系的轉換
1.1 世界座標系
世界座標系(world coordinate)(xw,yw,zw)(xw,yw,zw),也稱爲測量座標系,是一個三維直角座標系,以其爲基準能夠描述相機和待測物體的空間位置。世界座標系的位置能夠根據實際狀況自由肯定。
機器學習
1.2 相機座標系
相機座標系(camera coordinate)(xc,yc,zc)(xc,yc,zc),也是一個三維直角座標系,原點位於鏡頭光心處,x、y軸分別與相面的兩邊平行,z軸爲鏡頭光軸,與像平面垂直。
ide
1.3 世界座標系轉換爲相機座標系
⎡⎣⎢⎢⎢xcyczc1⎤⎦⎥⎥⎥=[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥
[xcyczc1]=[Rt01][xwywzw1]
其中RR爲3*3的旋轉矩陣,tt爲3*1的平移矢量,(xc,yc,zc,1)T(xc,yc,zc,1)T爲相機座標系的齊次座標,(xw,yw,zw,1)T(xw,yw,zw,1)T爲世界座標系的齊次座標。
學習
1.4 像素座標系、圖像座標系
圖1:
優化
像素座標系(pixel coordinate)
如圖1,像素座標系uovuov是一個二維直角座標系,反映了相機CCD/CMOS芯片中像素的排列狀況。原點oo位於圖像的左上角,uu軸、vv軸分別於像面的兩邊平行。像素座標系中座標軸的單位是像素(整數)。
idea
像素座標系不利於座標變換,所以須要創建圖像座標系XOYXOY,其座標軸的單位一般爲毫米(mm),原點是相機光軸與相面的交點(稱爲主點),即圖像的中心點,XX軸、YY軸分別與uu軸、vv軸平行。故兩個座標系實際是平移關係,便可以經過平移就可獲得。.net
圖像座標系轉換爲像素座標系orm
⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢XY1⎤⎦⎥
[uv1]=[1/dX0u001/dYv0001][XY1]
其中,dXdX、dYdY分別爲像素在XX、YY軸方向上的物理尺寸,u0,v0u0,v0爲主點(圖像原點)座標。
1.5 針孔成像原理
圖2:
如圖,空間任意一點PP與其圖像點pp之間的關係,PP與相機光心oo的連線爲oPoP,oPoP與像面的交點pp即爲空間點PP在圖像平面上的投影。
該過程爲透視投影,以下矩陣表示:
s⎡⎣⎢XY1⎤⎦⎥=⎡⎣⎢f000f0001000⎤⎦⎥⎡⎣⎢⎢⎢xyz1⎤⎦⎥⎥⎥
s[XY1]=[f0000f000010][xyz1]
其中,ss爲比例因子(ss不爲0),ff爲有效焦距(光心到圖像平面的距離),(x,y,z,1)T(x,y,z,1)T是空間點PP在相機座標系oxyzoxyz中的齊次座標,(X,Y,1)T(X,Y,1)T是像點pp在圖像座標系OXYOXY中的齊次座標。
1.6 世界座標系轉換爲像素座標系
s⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢f000f0001000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=⎡⎣⎢αx000αy0u0v01000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=M1M2Xw=MXw
s[uv1]=[1/dX0u001/dYv0001][f0000f000010][Rt01][xwywzw1]=[αx0u000αyv000010][Rt01][xwywzw1]=M1M2Xw=MXw
其中,αx=f/dXαx=f/dX、αy=f/dYαy=f/dY,稱爲uu、vv軸的尺度因子,M1M1稱爲相機的內部參數矩陣,M2M2稱爲相機的外部參數矩陣,MM稱爲投影矩陣。
2 相機內參與畸變參數
2.1 相機內參
參看1.6節所述
2.2 畸變參數
畸變參數(distortion parameters)
畸變(distortion)是對直線投影(rectilinear projection)的一種偏移。
簡單來講直線投影是場景內的一條直線投影到圖片上也保持爲一條直線。
畸變簡單來講就是一條直線投影到圖片上不能保持爲一條直線了,這是一種光學畸變(optical aberration),可能因爲攝像機鏡頭的緣由。
畸變通常能夠分爲:徑向畸變、切向畸變
一、徑向畸變來自於透鏡形狀
二、切向畸變來自於整個攝像機的組裝過程
畸變還有其餘類型的畸變,可是沒有徑向畸變、切向畸變顯著
畸變圖示
徑向畸變
實際攝像機的透鏡老是在成像儀的邊緣產生顯著的畸變,這種現象來源於「筒形」或「魚眼」的影響。
以下圖,光線在原理透鏡中心的地方比靠近中心的地方更加彎曲。對於經常使用的普通透鏡來講,這種現象更加嚴重。筒形畸變在便宜的網絡攝像機中很是厲害,但在高端攝像機中不明顯,由於這些透鏡系統作了不少消除徑向畸變的工做。
對於徑向畸變,成像儀中心(光學中心)的畸變爲0,隨着向邊緣移動,畸變愈來愈嚴重。
徑向畸變包括:枕形畸變、桶形畸變
切向畸變
切向畸變是因爲透鏡製造上的缺陷使得透鏡自己與圖像平面不平行而產生的。
切向畸變可分爲:薄透鏡畸變、離心畸變
切向畸變圖示:
2.2.1 opencv中的畸變模型
徑向畸變模型:
如下公式由泰勒展式得出,在opencv中K=1K=1,r2=x2+y2r2=x2+y2, (x,y)(x,y)爲真實座標(發生畸變),(x′,y′)(x′,y′)爲理想座標。
δxr=x(k1r2+k2r4+k3r6+K)
δxr=x(k1r2+k2r4+k3r6+K)
δyr=y(k1r2+k2r4+k3r6+K)
δyr=y(k1r2+k2r4+k3r6+K)
切向畸變模型:
δxd=2p1xy+p2(r2+2x2)+K
δxd=2p1xy+p2(r2+2x2)+K
δyd=2p1(r2+2y2)+2p2xy+K
δyd=2p1(r2+2y2)+2p2xy+K
理想座標(x′,y′)(x′,y′)與真實座標(x,y)(x,y):
x′=x+δxr+δxd
x′=x+δxr+δxd
y′=y+δyr+δyd
y′=y+δyr+δyd
也即:
[x′y′]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]
[x′y′]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]
實際計算過程當中,若是考慮太多高階的畸變參數,會致使標定求解的不穩定。
2.2.2 張氏標定中的畸變模型
張正友的方法只考慮了徑向畸變,沒有考慮切向畸變
模型:
理想狀況下(沒有畸變)圖片的像素座標爲:
(u,v)
(u,v)
真實的像素座標爲:
(u¯,v¯)
(u¯,v¯)
真實座標與理想座標的關係式(泰勒展開):
(x,y)(x,y) and (x¯,y¯)(x¯,y¯) are the ideal (distortion-free) and real (distorted) normalized image coordinates.
x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
y¯=y+y[k1(x2+y2)+k2(x2+y2)2]
y¯=y+y[k1(x2+y2)+k2(x2+y2)2]
其中k1k1,k2k2是徑向畸變係數(coefficients of the radial distortion)。
像素座標表示爲:
u¯=u+(u−u0)[k1(x2+y2)+k2(x2+y2)2]
u¯=u+(u−u0)[k1(x2+y2)+k2(x2+y2)2]
v¯=v+(v−v0)[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]
[(u−u0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)(v−v0)(x2+y2)][k1k2]=[u¯−uv¯−v]
2.2.3 Tasi畸變模型
Tasi畸變模型同張氏畸變模型相似,也只考慮了徑向畸變
2.3 相機標定
相機標定步驟:
一、打印一張棋盤格,把它貼在一個平面上,做爲標定物。
二、經過調整標定物或攝像機的方向,爲標定物拍攝一些不一樣方向的照片。
三、從照片中提取棋盤格角點。
四、估算理想無畸變的狀況下,五個內參和六個外參。
五、應用最小二乘法估算實際存在徑向畸變下的畸變係數。
六、極大似然法,優化估計,提高估計精度。
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]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
在命令窗口輸入如下命令便可得到內參矩陣和徑向畸變:
>> cameraParams.IntrinsicMatrix
ans =
510.6720 0 0
0 511.9534 0
332.3800 238.4849 1.0000
>> cameraParams.RadialDistortion
ans =
0.0618 -0.4877
1
2
3
4
5
6
7
8
9
10
11
12
13
參考資料
相關文章
機器學習、深度學習、計算機視覺、天然語言處理及應用案例——乾貨分享(持續更新……)
旋轉矩陣、歐拉角、四元數理論及其轉換關係
基於生長的棋盤格角點檢測方法–(1)原理介紹
opencv角點檢測、棋盤格檢測、亞像素cvFindCornerSubPix()
相機標定(Camera calibration)
OpenCV相機標定和姿態更新
Camera Calibration and 3D Reconstruction
Camera Calibration
相機姿態估計(二)–單目POSIT算法
相機位姿估計1:根據四個特徵點估計相機姿態
Head Pose Estimation using OpenCV and Dlib
opencv角點檢測、棋盤格檢測、亞像素cvFindCornerSubPix()
關於OpenCV的那些事——相機標定
計算機視覺-相機內參數和外參數
張正友相機標定算法 【2】
Python+OpenCV學習(17)—攝像機標定
相機標定Opencv實現以及標定流程&&標定結果評價&&圖像矯正流程解析(附標定程序和棋盤圖)
張正友相機標定Opencv實現以及標定流程&&標定結果評價&&圖像矯正流程解析(附標定程序和棋盤圖)
MATLAB–相機標定教程
《學習opencv》
張正友相機標定論文《A Flexible New Technique for Camera Calibration》
OpenCV相機標定
畸變模型
相機的那些事兒 - 概念、模型及標定
相機標定(二)之相機畸變模型————————————————版權聲明:本文爲CSDN博主「jason_ql」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/lql0716/java/article/details/71973318