matlab、opencv、halcon雙目標定匯總

來源:互聯網
上載者:User

標籤:

相機的標定對於測距和重建還是很重要的,特把用過的工具和方法進行一次匯總,以便查閱、分析和討論(本人扣扣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雙目標定匯總

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.