【視頻開發】【計算機視覺】相機標定(Camera calibration)原理、步驟

相機標定(Camera calibration)原理、步驟


author@jason_ql(lql0716) 
http://blog.csdn.net/lql0716css


  • 在圖像測量過程以及機器視覺應用中,爲肯定空間物體表面某點的三維幾何位置與其在圖像中對應點之間的相互關係,必須創建相機成像的幾何模型,這些幾何模型參數就是相機參數。在大多數條件下這些參數必須經過實驗與計算才能獲得,這個求解參數的過程就稱之爲相機標定(或攝像機標定)。不管是在圖像測量或者機器視覺應用中,相機參數的標定都是很是關鍵的環節,其標定結果的精度及算法的穩定性直接影響相機工做產生結果的準確性。所以,作好相機標定是作好後續工做的前提,提升標定精度是科研工做的重點所在。html

  • 經常使用術語 
    內參矩陣: Intrinsic Matrix 
    焦距: Focal Length 
    主點: Principal Point 
    徑向畸變: Radial Distortion 
    切向畸變: Tangential Distortion 
    旋轉矩陣: Rotation Matrices 
    平移向量: Translation Vectors 
    平均重投影偏差: Mean Reprojection Error 
    重投影偏差: Reprojection Errors 
    重投影點: Reprojected Pointspython

一、座標系的轉換

1.1 世界座標系

世界座標系(world coordinate) (xw,yw,zw) ,也稱爲測量座標系,是一個三維直角座標系,以其爲基準能夠描述相機和待測物體的空間位置。世界座標系的位置能夠根據實際狀況自由肯定。算法

1.2 相機座標系

相機座標系(camera coordinate) (xc,yc,zc) ,也是一個三維直角座標系,原點位於鏡頭光心處,x、y軸分別與相面的兩邊平行,z軸爲鏡頭光軸,與像平面垂直。apache

1.3 世界座標系轉換爲相機座標系

xcyczc1=[R0t1]xwywzw1

其中 R 爲3*3的旋轉矩陣, t 爲3*1的平移矢量, (xc,yc,zc,1)T 爲相機座標系的齊次座標, (xw,yw,zw,1)T 爲世界座標系的齊次座標。網絡

1.4 像素座標系、圖像座標系

  • 圖1: 
    此處輸入圖片的描述app

  • 像素座標系(pixel coordinate) 
    如圖1,像素座標系 uov 是一個二維直角座標系,反映了相機CCD/CMOS芯片中像素的排列狀況。原點 o 位於圖像的左上角, u 軸、 v 軸分別於像面的兩邊平行。像素座標系中座標軸的單位是像素(整數)機器學習

    像素座標系不利於座標變換,所以須要創建圖像座標系 XOY 其座標軸的單位一般爲毫米(mm),原點是相機光軸與相面的交點(稱爲主點),即圖像的中心點, X 軸、 Y 軸分別與 u 軸、 v 軸平行。故兩個座標系實際是平移關係,便可以經過平移就可獲得。ide

  • 圖像座標系轉換爲像素座標系學習

uv1=1/dX0001/dY0u0v01XY1

其中, dX dY 分別爲像素在 X Y 軸方向上的物理尺寸, u0,v0 爲主點(圖像原點)座標。

1.5 針孔成像原理

圖2: 
此處輸入圖片的描述

如圖,空間任意一點 P 與其圖像點 p 之間的關係, P 與相機光心 o 的連線爲 oP oP 與像面的交點 p 即爲空間點 P 在圖像平面上的投影。 
該過程爲透視投影,以下矩陣表示:

sXY1=f000f0001000xyz1

其中, s 爲比例因子( s 不爲0), f 爲有效焦距(光心到圖像平面的距離), (x,y,z,1)T 是空間點 P 在相機座標系 oxyz 中的齊次座標, (X,Y,1)T 是像點 p 在圖像座標系 OXY 中的齊次座標。

1.6 世界座標系轉換爲像素座標系

suv1=1/dX0001/dY0u0v01f000f0001000[R0t1]xwywzw1=αx000αy0u0v01000[R0t1]xwywzw1=M1M2Xw=MXw

其中, α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),可能因爲攝像機鏡頭的緣由。

  • 畸變通常能夠分爲:徑向畸變、切向畸變

    一、徑向畸變來自於透鏡形狀 
    二、切向畸變來自於整個攝像機的組裝過程

    畸變還有其餘類型的畸變,可是沒有徑向畸變、切向畸變顯著

  • 畸變圖示 
    此處輸入圖片的描述

  • 徑向畸變

    實際攝像機的透鏡老是在成像儀的邊緣產生顯著的畸變,這種現象來源於「筒形」或「魚眼」的影響。

    以下圖,光線在原理透鏡中心的地方比靠近中心的地方更加彎曲。對於經常使用的普通透鏡來講,這種現象更加嚴重。筒形畸變在便宜的網絡攝像機中很是厲害,但在高端攝像機中不明顯,由於這些透鏡系統作了不少消除徑向畸變的工做。 
    此處輸入圖片的描述

    對於徑向畸變,成像儀中心(光學中心)的畸變爲0,隨着向邊緣移動,畸變愈來愈嚴重。

  • 徑向畸變包括:枕形畸變、桶形畸變

  • 切向畸變

    • 切向畸變是因爲透鏡製造上的缺陷使得透鏡自己與圖像平面不平行而產生的。

    • 切向畸變可分爲:薄透鏡畸變、離心畸變

    • 切向畸變圖示: 
      此處輸入圖片的描述

2.2.1 opencv中的畸變模型

  • 徑向畸變模型:

如下公式由泰勒展式得出,在opencv中 K=1 r2=x2+y2 (x,y) 爲真實座標(發生畸變), (x,y) 爲理想座標。

δxr=x(k1r2+k2r4+k3r6+K)

δyr=y(k1r2+k2r4+k3r6+K)

  • 切向畸變模型:

δxd=2p1xy+p2(r2+2x2)+K

δyd=2p1(r2+2y2)+2p2xy+K

  • 理想座標 (x,y) 與真實座標 (x,y)

x=x+δxr+δxd

y=y+δyr+δyd

也即:

[xy]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]

實際計算過程當中,若是考慮太多高階的畸變參數,會致使標定求解的不穩定。

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+(uu0)[k1(x2+y2)+k2(x2+y2)2]

    v¯=v+(vv0)[k1(x2+y2)+k2(x2+y2)2]

    即: 

    [(uu0)(x2+y2)(vv0)(x2+y2)(uu0)(x2+y2)2(vv0)(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命令窗口

此處輸入圖片的描述

此處輸入圖片的描述

  • 導出的數據以下:
  
  
  
  
  • 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 = 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
>> cameraParams.IntrinsicMatrix ans = 510.6720 0 0 0 511.9534 0 332.3800 238.4849 1.0000 >> cameraParams.RadialDistortion ans = 0.0618 -0.4877

參考資料

相關文章
相關標籤/搜索