前言
印象中之前使用python和matlab都做过相机标定工作,只是没有记录,最近使用matlab工具箱记录下操作步骤。
操作步骤
1.打印一张棋盘格,把它贴在一个平面上,作为标定物,同时记录棋盘格的实际大小。
2.通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
3.从照片中提取棋盘格角点。
4.估算理想无畸变的情况下,五个内参和六个外参。
在假设透镜畸变为零的情况下,求解内外参。
利用非线性最小二乘极小化(Levenberg-Marquardt)同时估计包括畸变系数在内的所有参数。
使用第一步的解作为内、外参数的初始估计。然后将畸变系数的初始估计值设为零。
5.应用最小二乘法估算实际存在径向畸变下的畸变系数
具体操作步骤
step1:启动matlab,在APPS中搜索camera calibrator;
step2: 加载标定板拍摄图片;
step3: 输入棋盘格每格的尺寸大小,单位是mm;
step4: 选择需要计算的参数,点击Calibration,开始标定;
step5: 得到标定结果(平均误差小于0.5即可,如果大于0.5,多采一些图,再次标定);
step6: 查看标定结果和生成程序;
标定结果
cameraParams =
cameraParameters with properties:
Camera Intrinsics
IntrinsicMatrix: [3×3 double]
FocalLength: [1.3097e+03 1.3180e+03]
PrincipalPoint: [671.4361 399.7834]
Skew: 1.9323
RadialDistortion: [-0.4668 0.1950 -0.0949]
TangentialDistortion: [-0.0026 -6.1137e-04]
ImageSize: [720 1280]
Camera Extrinsics
RotationMatrices: [3×3×145 double]
TranslationVectors: [145×3 double]
Accuracy of Estimation
MeanReprojectionError: 0.0598
ReprojectionErrors: [54×2×145 double]
ReprojectedPoints: [54×2×145 double]
Calibration Settings
NumPatterns: 145
WorldPoints: [54×2 double]
WorldUnits: 'millimeters'
EstimateSkew: 1
NumRadialDistortionCoefficients: 3
EstimateTangentialDistortion: 1
estimationErrors =
cameraCalibrationErrors with properties:
IntrinsicsErrors: [1×1 intrinsicsEstimationErrors]
ExtrinsicsErrors: [1×1 extrinsicsEstimationErrors]
自动生成matlab脚本;
% Auto-generated by cameraCalibrator app on 12-Dec-2022
%-------------------------------------------------------
imageFileNames = {'/home/xxx/workspace/utils/camera_calib/output_20221212T103356_camera_calib_fov60/TFL_20221212T103406_00000.png',...
'/home/xxx/workspace/utils/camera_calib/output_20221212T103356_camera_calib_fov60/TFL_20221212T103545_00001.png',...
'/home/xxx/workspace/utils/camera_calib/output_20221212T103356_camera_calib_fov60/TFL_20221212T103549_00002.png',...}
% Define images to process
% Detect checkerboards in images
[imagePoints, boardSize, imagesUsed] = detectCheckerboardPoints(imageFileNames);
imageFileNames = imageFileNames(imagesUsed);
% Read the first image to obtain image size
originalImage = imread(imageFileNames{1});
[mrows, ncols, ~] = size(originalImage);
% Generate world coordinates of the corners of the squares
squareSize = 100; % in units of 'millimeters'
worldPoints = generateCheckerboardPoints(boardSize, squareSize);
% Calibrate the camera
[cameraParams, imagesUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ...
'EstimateSkew', true, 'EstimateTangentialDistortion', true, ...
'NumRadialDistortionCoefficients', 3, 'WorldUnits', 'millimeters', ...
'InitialIntrinsicMatrix', [], 'InitialRadialDistortion', [], ...
'ImageSize', [mrows, ncols]);
% View reprojection errors
h1=figure; showReprojectionErrors(cameraParams);
% Visualize pattern locations
h2=figure; showExtrinsics(cameraParams, 'CameraCentric');
% Display parameter estimation errors
displayErrors(estimationErrors, cameraParams);
% For example, you can use the calibration data to remove effects of lens distortion.
undistortedImage = undistortImage(originalImage, cameraParams);
% See additional examples of how to use the calibration data. At the prompt type:
% showdemo('MeasuringPlanarObjectsExample')
% showdemo('StructureFromMotionExample')
参考
1. Matlab工具箱标定_qingfengxiaosong的博客
完