此示例说明如何评估使用cameraCalibrator应用程序或estimateCameraParameters函数估计的相机参数的准确性。
1.概述
相机标定是使用特殊校准图案的图像估计相机参数的过程。参数包括相机内在参数、畸变系数和相机外在参数。相机标定后,有几种方法可以评估估计参数的准确性:
- 绘制相机的相对位置和标定模板
- 计算重投影误差
- 计算参数估计误差
2.相机标定
使用一组棋盘格图案估计相机参数。
% Create a set of calibration images.
images = imageDatastore(fullfile(toolboxdir('vision'), 'visiondata', ...
'calibration', 'mono'));
imageFileNames = images.Files;
% Detect calibration pattern.
[imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames);
% Generate world coordinates of the corners of the squares.
squareSize = 29; % millimeters
worldPoints = generateCheckerboardPoints(boardSize, squareSize);
% Calibrate the camera.
I = readimage(images, 1);
imageSize = [size(I, 1), size(I, 2)];
[params, ~, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ...
'ImageSize', imageSize);
3.外参
通过绘制相机的相对位置和校准图案,您可以快速发现标定中的明显错误。使用showExtrinsics函数可以在相机坐标系中绘制标定图案的位置,或者在图像坐标系中绘制相机的位置。寻找明显的问题,例如图案在相机后面,或相机在图案后面。还要检查图案是否离相机太远或太近。
figure;
showExtrinsics(params, 'CameraCentric');
figure;
showExtrinsics(params, 'PatternCentric');
4.重投影误差
重投影误差提供了准确度的定性度量。重投影误差是在标定图像中检测到的模式关键点与投影到同一图像中的相应世界点之间的距离。showReprojectionErrors函数提供了每个标定图像中平均重投影误差的可视化。如果整体平均重投影误差太高,请考虑排除误差最大的图像并重新标定。
5.估计误差
估计误差代表每个估计参数的不确定性。estimateCameraParameters函数可选择返回estimationErrors输出,其中包含与每个估计的相机参数对应的标准误差。返回的标准错误σ(与相应参数的单位相同)可用于计算置信区间。例如 +/-1.96σ对应于 95% 的置信区间。换句话说,给定参数的实际值在 1.96σ 其估计为 95%。
5.如何提高校准精度
特定的重投影或估计误差是否可接受取决于您的特定应用的精度要求。但是,如果您确定您的标定精度不可接受,有几种方法可以改进它:
- 修改标定设置。尝试使用 3 个径向畸变系数,估计切向畸变或偏斜。
- 拍摄更多标定图像。图像中的图案必须处于不同的 3D 方向,并且其位置应确保在视野的所有部分都有关键点。特别是让关键点靠近图像的边缘和角落非常重要,以便更好地估计失真系数。
- 排除重投影错误高的图像并重新标定。
参考目录