前言:
????????現在有許多雙目攝像頭在出廠時以及標定好,用戶拿到手后可以直接使用,但也有些雙目攝像頭在出廠時并沒有標定。因而這個時候就需要自己進行標定。本文主要介紹基于matlab工具箱的自動標定方式來對雙目相機進行標定。
1、MATLAB工具箱標定
????????首先需要準備一張棋盤,如下圖所示。對于標定不同測距范圍相機所用的棋盤方格寬度會有所不同。對于短焦雙目相機(測距范圍在20m以內),棋盤中方格的寬度達到20mm即可;對于長焦雙目相機(測距范圍在40m左右),棋盤中方格的寬度需要盡量大,否則會影響標定的精度,一般至少達到60mm。
?????????然后通過Python腳本對棋盤進行多角度拍攝,每按下一次s鍵之后自動保存一組左右鏡頭的照片。Python代碼如下:
注:盡可能拍攝多組照片,這樣可以提高標定效果,標定效果的好壞直接影響到測距的精度。對于短焦相機通常拍攝40組照片即可;長焦相機通常會需要更多組照片。
????????照片拍攝好后,進入matlab標定工具箱,如下圖所示。注意:不要選擇matlab2020b版本,筆者測試過該版本無法正常使用標定工具箱,可以使用matlab2020a版本。
注:Stero Camera Cailbrator為雙目標定工具箱,Camera Cailbrator為單目相機標定工具箱,因此這里選擇Stero Camera Cailbrator工具箱。
????????進入工具箱以后,選擇Add Images。然后選擇左右相機照片的路徑,Size of checkerboard square為棋盤中每一個方格的長度,單位為毫米,一定要準確測量方格的長度,如下圖所示。
????????點擊確定以后,Radial Distortion Compute選擇3 Coefficients和Tangential Distortion,然后點擊Calibrate進行校準。?
2、降低標定誤差?
????????左下方的直方圖為左右圖像的標定誤差,點擊誤差較大的直方圖,可以直接在左邊的圖像對中找到對應的圖像,右鍵選擇“Remove and Recalibrate”,可以重復上述步驟,直到認為誤差滿足標定需求為止。
3、導出標定數據
?????????標定好后將標定數據導入到工作空間,點擊Export Camera Parameters即可。此時我們已經拿到標定數據了,為了避免手工獲取數據時出錯,筆者寫了一個腳本可以直接獲取標定數據,并保存到表格文件中,之后直接復制粘貼即可。
rowName = cell(1,10);
rowName{1,1} = '平移矩陣';
rowName{1,2} = '旋轉矩陣';
rowName{1,3} = '相機1內參矩陣';
rowName{1,4} = '相機1徑向畸變';
rowName{1,5} = '相機1切向畸變';
rowName{1,6} = '相機2內參矩陣';
rowName{1,7} = '相機2徑向畸變';
rowName{1,8} = '相機2切向畸變';
rowName{1,9} = '相機1畸變向量';
rowName{1,10} = '相機2畸變向量';
xlswrite('out.xlsx',rowName(1,1),1,'A1');
xlswrite('out.xlsx',rowName(1,2),1,'A2');
xlswrite('out.xlsx',rowName(1,3),1,'A5');
xlswrite('out.xlsx',rowName(1,4),1,'A8');
xlswrite('out.xlsx',rowName(1,5),1,'A9');
xlswrite('out.xlsx',rowName(1,6),1,'A10');
xlswrite('out.xlsx',rowName(1,7),1,'A13');
xlswrite('out.xlsx',rowName(1,8),1,'A14');
xlswrite('out.xlsx',rowName(1,9),1,'A15');
xlswrite('out.xlsx',rowName(1,10),1,'A16');
xlswrite('out.xlsx',stereoParams.TranslationOfCamera2,1,'B1'); % 平移矩陣
xlswrite('out.xlsx',stereoParams.RotationOfCamera2.',1,'B2'); % 旋轉矩陣
xlswrite('out.xlsx',stereoParams.CameraParameters1.IntrinsicMatrix.',1,'B5'); % 相機1內參矩陣
xlswrite('out.xlsx',stereoParams.CameraParameters1.RadialDistortion,1,'B8'); % 相機1徑向畸變(1,2,5)
xlswrite('out.xlsx',stereoParams.CameraParameters1.TangentialDistortion,1,'B9'); % 相機1切向畸變(3,4)
xlswrite('out.xlsx',stereoParams.CameraParameters2.IntrinsicMatrix.',1,'B10'); % 相機2內參矩陣
xlswrite('out.xlsx',stereoParams.CameraParameters2.RadialDistortion,1,'B13'); % 相機2徑向畸變(1,2,5)
xlswrite('out.xlsx',stereoParams.CameraParameters2.TangentialDistortion,1,'B14'); % 相機2切向畸變(3,4)
xlswrite('out.xlsx',[stereoParams.CameraParameters1.RadialDistortion(1:2), stereoParams.CameraParameters1.TangentialDistortion,...stereoParams.CameraParameters1.RadialDistortion(3)],1,'B15'); % 相機1畸變向量
xlswrite('out.xlsx',[stereoParams.CameraParameters2.RadialDistortion(1:2), stereoParams.CameraParameters2.TangentialDistortion,...stereoParams.CameraParameters2.RadialDistortion(3)],1,'B16'); % 相機2畸變向量
showReprojectionErrors(stereoParams)
showExtrinsics(stereoParams)
標定數據文件保存的路徑即為當前程序的路徑,要想保存到其他路徑直接修改腳本中的路徑即可,導出的參數如下圖所示。
將表格中的數據復制到雙目相機配置文件中,其中相機1內參復制到left_camera_matrix中,相機1畸變復制到left_distortion中,相機2內參復制到right_camera_matrix中,相機2畸變復制到right_distortion中,旋轉矩陣復制到R中,轉移矩陣復制到T中,如下圖所示。
?
參考文獻:Matlab雙目相機標定?