Matlab 单双目相机标定+畸变校正
不管单目双目标定第1第2步都是必须的
第3步为单目标定,第4步为双目标定
1. 标定板
您使用的棋盘图案不得为方形。一侧必须包含偶数个正方形,另一侧必须包含奇数个正方形。此条件使应用程序可以确定模式的方向。校准器将长边指定为x方向。
直接用python生成国际象棋盘格图片再打印到A4纸上做为标定板,生成图片代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import cv2 import numpy as np #A4纸的标准大小为210*297mm,这里大小设为A4的三倍,格子边长为90 width = 630 height = 891 length = 90 image = np.zeros((height,width),dtype = np.uint8) print(image.shape[0],image.shape[1]) for j in range(height): for i in range(width): if((int)(i/length) + (int)(j/length))%2: image[j,i] = 255; cv2.imwrite("chess.jpg",image) cv2.imshow("chess",image) cv2.waitKey(0) |
2. 拍照
拍摄图片至少10张,我拍了35张,
如果你标定的是单摄像头直接拍照就好了,
如果你标定的是双目摄像头请阅读:
python+opencv调用双目同步摄像头模组
————————–
3. 单目相机标定工具的使用
参考Matlab官网:https://ww2.mathworks.cn/help/vision/ug/single-camera-calibrator-app.html
————————–
打开工具方法有二,方法一:点击app在下拉列表找到“camera Calibrator”
方法二:直接在MATLAB的Command Window里面输入cameraCalibrator即可调用标定应用
点击“Add Images”添加我们用摄像头已拍好的照片
最后会弹出“Checkerboard Square Size”对话框要我们输入标定板上小格子的实际边长
这步很重要,我这里是用的尺子量的为29mm
1. camera model : standard(标准) fisheye(鱼眼),我的摄像头是标准。
2. options:选中径向畸变:“2 coefficients”并且选择偏差:“Skew“和切向畸变:“Tangential Distortion“
径向畸变: 通常,两个系数足以进行校准。对于严重失真,例如在广角镜头中,您可以选择3″“3 coefficients””个系数来包含k 3。
偏差: 选择Compute Skew 复选框时,校准器会估算图像轴偏斜。某些相机传感器包含缺陷,导致图像的x轴和y轴不垂直。您可以使用skew参数对此缺陷进行建模。如果不选中该复选框,则假定图像轴是垂直的,大多数现代相机都是这种情况。
切向畸变: 当镜头和图像平面不平行时,发生切向畸变。切向失真系数模拟了这种类型的失真:
综上所述,我的选项为:
径向畸变:“2 coefficients” 因为我的单目摄像头不是广角
偏差:“Skew” 因为我的单目摄像头是老旧的那种
切向畸变:”Tangential Distortion” 因为我拍照时是用手拿的摄像头很难和标定板平行
关于畸变可参考:
https://blog.csdn.net/waeceo/article/details/50580808
https://blog.csdn.net/dcrmg/article/details/52950141
3. 然后点击Calibrate等待一段时间即可完成标定
4. 点击show Undistorted即可看到无畸变的图像,点击Export Camera Parameters就可以导出数据,最后记得点击Save Session可保存整个工程*.mat
导出数据后可以退出标定应用,在MATLAB主界面中的命令窗口可以查看到如下数据(或在右边的工作区双击“cameraParameters”查看):
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 39 40 41 |
>> cameraParams = cameraParameters - 属性: Camera Intrinsics IntrinsicMatrix: [3×3 double] FocalLength: [762.6390 758.8221] PrincipalPoint: [314.3942 242.9882] Skew: 0.6420 RadialDistortion: [-0.3241 0.2864] TangentialDistortion: [0.0082 -5.6938e-04] ImageSize: [480 640] Camera Extrinsics RotationMatrices: [3×3×35 double] TranslationVectors: [35×3 double] Accuracy of Estimation MeanReprojectionError: 0.1202 ReprojectionErrors: [54×2×35 double] ReprojectedPoints: [54×2×35 double] Calibration Settings NumPatterns: 35 WorldPoints: [54×2 double] WorldUnits: 'millimeters' EstimateSkew: 1 NumRadialDistortionCoefficients: 2 EstimateTangentialDistortion: 1 estimationErrors = cameraCalibrationErrors - 属性: IntrinsicsErrors: [1×1 intrinsicsEstimationErrors] ExtrinsicsErrors: [1×1 extrinsicsEstimationErrors] >> |
————————–
4. 双目相机标定工具的使用
参考Matlab官网:https://ww2.mathworks.cn/help/vision/ug/stereo-camera-calibrator-app.html
————————–
打开立体相机校准器
- MATLAB工具条:在“ app”选项卡上的“ 图像处理和计算机视觉”部分中,单击“
Stereo Camera Calibrator
”图标。 - MATLAB命令提示符:输入
stereoCameraCalibrator
如下图1为相机镜头1拍摄的图片目录,2为相机镜头2拍摄的图片目录,3为标定板小格子实际边长
其他选项:
径向畸变:“2 coefficients” 因为我的单目摄像头不是广角
偏差:“Skew” 因为我的双目摄像头是现代摄像头所以这一项不选
切向畸变:”Tangential Distortion” 因为我拍照时是用手拿的摄像头很难和标定板平行
然后点击Calibrate等待一段时间即可完成标定,点击Export Camera Parameters就可以导出数据,最后记得点击Save Session可保存整个工程*.mat
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 |
stereoParams = stereoParameters - 属性: Parameters of Two Cameras CameraParameters1: [1×1 cameraParameters] CameraParameters2: [1×1 cameraParameters] Inter-camera Geometry RotationOfCamera2: [3×3 double] TranslationOfCamera2: [-62.0630 -1.3048 9.7289] FundamentalMatrix: [3×3 double] EssentialMatrix: [3×3 double] Accuracy of Estimation MeanReprojectionError: 0.1107 Calibration Settings NumPatterns: 93 WorldPoints: [54×2 double] WorldUnits: 'millimeters' estimationErrors = stereoCalibrationErrors - 属性: Camera1IntrinsicsErrors: [1×1 intrinsicsEstimationErrors] Camera1ExtrinsicsErrors: [1×1 extrinsicsEstimationErrors] Camera2IntrinsicsErrors: [1×1 intrinsicsEstimationErrors] RotationOfCamera2Error: [2.4278e-04 3.9806e-04 2.4674e-05] TranslationOfCamera2Error: [0.1999 0.1391 1.0925] >> |
5. 评估校准结果
通过可视化界面可以查看相机和标定板的距离为2500mm(2.5米)左右
如果和你的拍摄时实际情况不符请看第6步
6. 改善校准
要改进校准,您可以删除高错误图像对,添加更多图像对或修改校准器设置。