Matlab 单双目相机标定+畸变校正
1月14日 1月19日
Matlab 单双目相机标定+畸变校正
不管单目双目标定第1第2步都是必须的
第3步为单目标定,第4步为双目标定
1. 标定板
您使用的棋盘图案不得为方形。一侧必须包含偶数个正方形,另一侧必须包含奇数个正方形。此条件使应用程序可以确定模式的方向。校准器将长边指定为x方向。
直接用python生成国际象棋盘格图片再打印到A4纸上做为标定板,生成图片代码如下:
Python
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
importcv2
importnumpyasnp
#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])
forjinrange(height):
foriinrange(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张,
如果你标定的是单摄像头直接拍照就好了,
如果你标定的是双目摄像头请阅读:
————————–
3.单目相机标定工具的使用
————————–
打开工具方法有二,方法一:点击app在下拉列表找到“camera Calibrator”
方法二:直接在MATLAB的Command Window里面输入cameraCalibrator即可调用标定应用
点击“Add Images”添加我们用摄像头已拍好的照片
最后会弹出“Checkerboard Square Size”对话框要我们输入标定板上小格子的实际边长
这步很重要,我这里是用的尺子量的为29mm
1. camera model : standard(标准) fisheye(鱼眼),我的摄像头是标准。
2.options:选中径向畸变:“2coefficients”并且选择偏差:“Skew“和切向畸变:“Tangential Distortion“
径向畸变:通常,两个系数足以进行校准。对于严重失真,例如在广角镜头中,您可以选择3″“3coefficients””个系数来包含k3。
偏差: 选择Compute Skew复选框时,校准器会估算图像轴偏斜。某些相机传感器包含缺陷,导致图像的x轴和y轴不垂直。您可以使用skew参数对此缺陷进行建模。如果不选中该复选框,则假定图像轴是垂直的,大多数现代相机都是这种情况。
切向畸变: 当镜头和图像平面不平行时,发生切向畸变。切向失真系数模拟了这种类型的失真:
综上所述,我的选项为:
径向畸变:“2coefficients” 因为我的单目摄像头不是广角
偏差:“Skew”因为我的单目摄像头是老旧的那种
切向畸变:”Tangential Distortion”因为我拍照时是用手拿的摄像头很难和标定板平行
关于畸变可参考:
3.然后点击Calibrate等待一段时间即可完成标定
4.点击show Undistorted即可看到无畸变的图像,点击Export Camera Parameters就可以导出数据,最后记得点击Save Session可保存整个工程*.mat
导出数据后可以退出标定应用,在MATLAB主界面中的命令窗口可以查看到如下数据(或在右边的工作区双击“cameraParameters”查看):
>>
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]
>>
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-属性:
CameraIntrinsics
IntrinsicMatrix:[3×3double]
FocalLength:[762.6390758.8221]
PrincipalPoint:[314.3942242.9882]
Skew:0.6420
RadialDistortion:[-0.32410.2864]
TangentialDistortion:[0.0082-5.6938e-04]
ImageSize:[480640]
CameraExtrinsics
RotationMatrices:[3×3×35double]
TranslationVectors:[35×3double]
AccuracyofEstimation
MeanReprojectionError:0.1202
ReprojectionErrors:[54×2×35double]
ReprojectedPoints:[54×2×35double]
CalibrationSettings
NumPatterns:35
WorldPoints:[54×2double]
WorldUnits:'millimeters'
EstimateSkew:1
NumRadialDistortionCoefficients:2
EstimateTangentialDistortion:1
estimationErrors=
cameraCalibrationErrors-属性:
IntrinsicsErrors:[1×1intrinsicsEstimationErrors]
ExtrinsicsErrors:[1×1extrinsicsEstimationErrors]
>>
————————–
4.双目相机标定工具的使用
————————–
打开立体相机校准器
MATLAB工具条:在“app”选项卡上的“图像处理和计算机视觉”部分中,单击“ Stereo Camera Calibrator”图标。
MATLAB命令提示符:输入stereoCameraCalibrator
如下图1为相机镜头1拍摄的图片目录,2为相机镜头2拍摄的图片目录,3为标定板小格子实际边长
其他选项:
径向畸变:“2coefficients” 因为我的单目摄像头不是广角
偏差:“Skew”因为我的双目摄像头是现代摄像头所以这一项不选
切向畸变:”Tangential Distortion”因为我拍照时是用手拿的摄像头很难和标定板平行
然后点击Calibrate等待一段时间即可完成标定,点击Export Camera Parameters就可以导出数据,最后记得点击Save Session可保存整个工程*.mat
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]
>>
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-属性:
ParametersofTwoCameras
CameraParameters1:[1×1cameraParameters]
CameraParameters2:[1×1cameraParameters]
Inter-cameraGeometry
RotationOfCamera2:[3×3double]
TranslationOfCamera2:[-62.0630-1.30489.7289]
FundamentalMatrix:[3×3double]
EssentialMatrix:[3×3double]
AccuracyofEstimation
MeanReprojectionError:0.1107
CalibrationSettings
NumPatterns:93
WorldPoints:[54×2double]
WorldUnits:'millimeters'
estimationErrors=
stereoCalibrationErrors-属性:
Camera1IntrinsicsErrors:[1×1intrinsicsEstimationErrors]
Camera1ExtrinsicsErrors:[1×1extrinsicsEstimationErrors]
Camera2IntrinsicsErrors:[1×1intrinsicsEstimationErrors]
RotationOfCamera2Error:[2.4278e-043.9806e-042.4674e-05]
TranslationOfCamera2Error:[0.19990.13911.0925]
>>
5. 评估校准结果
通过可视化界面可以查看相机和标定板的距离为2500mm(2.5米)左右
如果和你的拍摄时实际情况不符请看第6步
6.改善校准
要改进校准,您可以删除高错误图像对,添加更多图像对或修改校准器设置。
发表评论
要发表评论,您必须先登录。