標籤:
相機的標定對於測距和重建還是很重要的,特把用過的工具和方法進行一次匯總,以便查閱、分析和討論(本人扣扣1256635840)
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
1.MATLAB camera calibration toolbox工具箱
我只使用了13張圖片
將TOOLBOX_calib放入MATLAB的toolbox目錄下,工作目錄設為含標定圖集的目錄。
1.1單目標定
運行calib_gui.m檔案,選擇添加到路徑,介面:
選擇第一個後,介面:
通過讀圖和提取角點後點擊calibration進行初始標定
標定的初始化如下:
Calibration parameters after initialization:
Focal Length: fc = [ 532.49170 532.49170 ]
Principal point: cc = [ 319.50000 239.50000 ]
Skew: alpha_c = [ 0.00000 ] => angle of pixel = 90.00000 degrees
Distortion: kc = [ 0.00000 0.00000 0.00000 0.00000 0.00000 ]
得到的標定結果如下:
Calibration results after optimization (with uncertainties):
Focal Length: fc = [ 534.97637 536.20121 ] +/- [ 3.71984 3.92117 ]
Principal point: cc = [ 343.26051 233.07723 ] +/- [ 4.11643 4.58569 ]
Skew: alpha_c = [ 0.00000 ] +/- [ 0.00000 ] => angle of pixel axes = 90.00000 +/- 0.00000 degrees
Distortion: kc = [ -0.32075 0.27300 0.00104 -0.00074 0.00000 ] +/- [ 0.02040 0.07372 0.00103 0.00126 0.00000 ]
Pixel error: err = [ 0.55364 0.23137 ]
這裡對這5個參數進行說明
(詳見連結http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html)
(1)fc為焦距的像素尺寸,計算為F/DX,F/DY,F為幾何焦距尺寸,DX,DY為像元尺寸。(懶得敲公式>.<)
(2)cc為光心在映像座標系下的映像座標
(3)alpha_c扭曲係數,這裡好像是用來測垂直度的,不是很明確(??)
(4)kc畸變係數,這裡有5個,前兩個和最後一個為徑向畸變,第三和第四個為切向畸變,一般第五個為0,切向畸變也很小
(5)err像素誤差,可以看到這裡小於一個像素尺寸
點擊show extrinsic,得到相機和標定板的相對位置關係:
點擊reproject on images,根據當前標定的結果和棋盤世界尺寸,得到反投影到映像上的角點圖
誤差圖
點擊analyse error,對誤差進行分析
點擊圖上角點的相關資訊,一種顏色代表一副圖,nnd綠色是什麼鬼,隨機點擊綠色點
Selected image: 3
Selected point index: 18
Pattern coordinates (in units of (dX,dY)): (X,Y)=(5,6)
Image coordinates (in pixel): (449.80,357.74)
Pixel error = (0.85299,0.66929)
Window size: (wintx,winty) = (5,5)
第三張圖我做了啥—。—
初次標定的效果還算滿意,進行一次recomp.corners,對角點進行校正,一路空格。
然後再次標定,得到結果
Calibration results after optimization (with uncertainties):
Focal Length: fc = [ 533.09010 533.21564 ] +/- [ 1.20347 1.26428 ]
Principal point: cc = [ 342.48318 233.86838 ] +/- [ 1.34457 1.48320 ]
Skew: alpha_c = [ 0.00000 ] +/- [ 0.00000 ] => angle of pixel axes = 90.00000 +/- 0.00000 degrees
Distortion: kc = [ -0.29000 0.10044 0.00121 -0.00016 0.00000 ] +/- [ 0.00646 0.02256 0.00032 0.00041 0.00000 ]
Pixel error: err = [ 0.13682 0.13975 ]
效果好了很多
點擊save儲存標定結果Calib_Results.mat,以供後續的雙目標定。
個人感覺此方法標定結果效果更優,可以將MATLAB標定結果轉為opencv可處理的xml檔案後在vs下進行編程。
工具介面後兩排都是一些簡單操作,我也簡單介紹下
第三排是基本操作:
加減圖、儲存標定結果、載入標定結果、退出
第四排是小步操作:
擷取單圖外參、矯正映像、輸出標定資料、顯示標定結果
這裡說下前兩個,後兩個就是點來看看,不說了
第一個comp.extrinsic是擷取單圖片的外參,這一步需要相機的標定結果,根據結果獲得相機和該圖的位置關係。
點擊後得到comp.extrinsic後
輸入映像的全名,不帶格式,第二個提示為格式
然後操作如上,完成後得到以棋盤為全局座標的相機-全局座標的外參
Extrinsic parameters:
Translation vector: Tc_ext = [ 70.077058 -137.151501 379.099782 ]
Rotation vector: omc_ext = [ -0.341265 -2.948410 0.719537 ]
Rotation matrix: Rc_ext = [ -0.971247 0.194743 -0.136943
0.235933 0.864274 -0.444260
0.031840 -0.463796 -0.885370 ]
Pixel error: err = [ 0.11455 0.17418 ]
參數說明:
(1)Tc_ect為平移向量,這裡相機模型不再詳述
(2)omc_ext為旋轉向量
(3)Rc_ext為旋轉矩陣,Rc_ext = rodrigues(omc_ext).這裡進行了 rodrigues變換
(4)err為像素誤差
全局座標系見圖,Z軸的標註被吃了:
第二個為undistort image
得到矯正後的映像,並會儲存在標定圖集的路徑下。
經過以上步驟,單目標定結束
點擊exit退出
然後標定右相機,做好將左右圖集用兩個檔案夾儲存,得到標定結果檔案。對兩個結果檔案重新命名,加標註left和right
————————————————————————————————————————————————————————————————————————————
1.2雙目標定
開啟stereo_gui.m
操作介面:
點擊load left and right calibration files
然後運行run stereo calibration,進行全域最佳化的雙目標定(?為加號或減號)
Stereo calibration parameters after optimization:
Intrinsic parameters of left camera:
Focal Length: fc_left = [ 533.56169 533.59560 ] ? [ 0.92519 0.94450 ]
Principal point: cc_left = [ 342.53093 234.76465 ] ? [ 1.35047 1.34582 ]
Skew: alpha_c_left = [ 0.00000 ] ? [ 0.00000 ] => angle of pixel axes = 90.00000 ? 0.00000 degrees
Distortion: kc_left = [ -0.28866 0.09366 0.00120 -0.00014 0.00000 ] ? [ 0.00681 0.02389 0.00031 0.00037 0.00000 ]
Intrinsic parameters of right camera:
Focal Length: fc_right = [ 536.89174 536.47377 ] ? [ 0.97335 0.96952 ]
Principal point: cc_right = [ 327.39289 249.94526 ] ? [ 1.44008 1.30625 ]
Skew: alpha_c_right = [ 0.00000 ] ? [ 0.00000 ] => angle of pixel axes = 90.00000 ? 0.00000 degrees
Distortion: kc_right = [ -0.29010 0.10622 -0.00051 0.00010 0.00000 ] ? [ 0.00531 0.00958 0.00025 0.00062 0.00000 ]
Extrinsic parameters (position of right camera wrt left camera):
Rotation vector: om = [ 0.00715 0.00427 -0.00351 ] ? [ 0.00298 0.00336 0.00032 ]
Translation vector: T = [ -99.81327 1.10181 -0.14312 ] ? [ 0.15469 0.12424 0.54609 ]
這裡om和T:
om表示右網路攝影機相對於左網路攝影機的旋轉角度,即以左相機為參考系
T表示右網路攝影機相對於左網路攝影機的平移量,也以左相機為參考系(??此處存疑)
得到兩相機的相對位置
點擊save stereo calibration results儲存雙目標定結果,即完成了MATLAB calibration toolbox工具箱的雙目標定。
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
2.MATLAB 更新的應用stereo camera calibrator
本人使用MATLAB2015版
然後自動提取角點,得到對應映像對。這裡該工具箱需要保證標定板的X向和Y向的方格數要有一個為偶數,一個為奇數。
結果只檢測到7組。囧
該工具設長軸為X軸
點擊標定,得到reprojection errors和extrinsics
點擊輸出標定參數
得到標定的結果
可以看到有相機內參數、兩相機的旋轉平移矩陣、基礎矩陣、本質矩陣、平均反投影誤差、標定數量、角點數、單位
點擊cameraParameters,查看左相機的內參數
徑向畸變,切向畸變,世界點,單位,扭曲係數,徑向畸變參數數,切向畸變參數數,7張圖的平移向量,7張圖的反投影誤差,7張圖的旋轉向量,圖片數量,內參數矩陣,焦距的像素尺寸,主點的像素座標,扭曲係數,平均反投影誤差,投影點,7張圖的旋轉矩陣
產生mat檔案運行得到標定結果
Camera 1 Intrinsics
-------------------
Focal length (pixels): [ 534.3513 +/- 0.4050 534.3210 +/- 0.3959 ]
Principal point (pixels):[ 341.4583 +/- 0.5920 235.1254 +/- 0.5816 ]
Radial distortion: [ -0.2940 +/- 0.0028 0.1218 +/- 0.0092 ]
Camera 2 Intrinsics
-------------------
Focal length (pixels): [ 537.2223 +/- 0.4180 536.8958 +/- 0.4019 ]
Principal point (pixels):[ 325.8371 +/- 0.6577 251.4986 +/- 0.5598 ]
Radial distortion: [ -0.2894 +/- 0.0018 0.1048 +/- 0.0040 ]
Position And Orientation of Camera 2 Relative to Camera 1
---------------------------------------------------------
Rotation of camera 2: [ 1.0000 +/- 0.0012 0.0032 +/- 0.0014 0.0050 +/- 0.0001 ]
Translation of camera 2 (mm): [ -99.7254 +/- 0.0708 1.2402 +/- 0.0580 0.0645 +/- 0.2536 ]
可以看出和calibration toolbox的功能基本一致,角點的提取更加智能化,但提取的效果不是很理想,13張圖只檢測到了7張,使用上會更加方便
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
3.opencv相機標定
opencv相機標定的參考很多,這裡就不再給出連結,自行百度
大概步驟如下:
(1)opencv標定需要對映像的大小,角點的個數,方格的實際尺寸,映像的數量,棋盤的全局座標等等進行初始化
(2)使用findChessboardCorners進行角點的提取
(3)使用cornerSubPix提取角點子像素級精度
(4)儲存每幅圖片的角點和全局座標點
(5)使用calibrateCamera進行單相機的標定
(6)使用 stereoCalibrate進行雙目標定
這裡對calibrateCamera的標定標誌位進行注釋
//標誌位
/*CV_CALIB_USE_INTRINSIC_GUESS -內參數矩陣包含fx,fy,cx和cy的初始值。否則,(cx, cy)被初始化到映像中心(這兒用到映像大小),焦距用最小平方差方式計算得到。注意,如果內部參數已知,沒有必要使用這個函數,使用cvFindExtrinsicCameraParams2則可。
CV_CALIB_FIX_PRINCIPAL_POINT - 主點在全域最佳化過程中不變,一直在中心位置或者在其他指定的位置(當CV_CALIB_USE_INTRINSIC_GUESS設定的時候)。
CV_CALIB_FIX_ASPECT_RATIO - 最佳化過程中認為fx和fy中只有一個獨立變數,保持比例fx/fy不變,fx/fy的值跟內參數矩陣初始化時的值一樣。在這種情況下, (fx, fy)的///實際初始值或者從輸入記憶體矩陣中讀取(當CV_CALIB_USE_INTRINSIC_GUESS被指定時),或者採用估計值(後者情況中fx和fy可能被設定為任意值,只有比值被使用)。
CV_CALIB_ZERO_TANGENT_DIST – 切向形變參數(p1, p2)被設定為0,其值在最佳化過程中保持為0。*/
這裡選預設值0。
尺寸設為30,單位為mm。
角點提取的效果如下
可以看出,以上的方法偏差都不大。
這裡像素誤差、畸變矯正、極線校正的程式運行結果我沒有給出,待續。。。
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
4.halcon標定
halcon作為牛逼的機器視覺工業軟體,標定自然也是不能少
由於沒有halcon的標定板圖,使用halcon內建的樣本進行說明(坑啊)halcon的標定板有些不同
一般步驟:
(1)初始化參數
(2)使用 find_caltab找到標定板地區
(3)使用find_marks_and_pose找到標記和位姿
(4)使用disp_caltab利用相機內外參數,把標定板模型投影到映像平面,顯示標定點和連接線,X,Y軸也被顯示出來
(5)使用binocular_calibration進行雙目標定
binocular_calibration (X, Y, Z, RowsL, ColsL, RowsR, ColsR, StartCamParL, StartCamParR, StartPosesL, StartPosesR, ‘all‘, CamParamL, CamParamR, NFinalPoseL, NFinalPoseR, cLPcR, Errors)
(6)得到左、右相機的內參數和相對位姿、誤差如下(這裡標定板的選取不一致,和上面便不進行比較):
errors為0.0154181,這裡的標定圖片效果很好,所以誤差沒有比較的意義,但精度應該很高
以上便是目前常用的幾種標定方法。
matlab、opencv、halcon雙目標定匯總