matlab单目相机标定代码 棋盘标定法,图像去畸变 包含棋盘内外参数,重投影误差散点图,重投影误差柱状图,角点提取,重投影误差分布,矫正前后图像 代码标注清晰,而且附带图像,适合初学者 双目相机可以标定内外参数,无代码

先准备20张不同角度的棋盘格照片(建议实际拍摄时棋盘占画面1/3以上)。把图片存到'imgs'文件夹后,直接运行这段角点提取代码:

% 读取所有棋盘图像
imageDir = fullfile('imgs');
imgs = imageDatastore(imageDir);

% 检测角点
[imagePoints, boardSize] = detectCheckerboardPoints(imgs.Files);

% 可视化第5张图的角点检测结果
I = readimage(imgs,5);
imshow(I); hold on;
plot(imagePoints(:,1,5), imagePoints(:,2,5), 'gx', 'LineWidth',2);
title('角点提取效果示例');

!角点提取效果示例

绿色叉号就是算法找到的角点,边缘清晰的话基本都能识别

接下来是重头戏——相机标定。设置棋盘格实际物理尺寸(这里假设每个方格30mm):

squareSize = 30; % 单位毫米
worldPoints = generateCheckerboardPoints(boardSize, squareSize);

% 执行标定
params = estimateCameraParameters(imagePoints, worldPoints);

标定完别急着关窗口!注意看弹出的结果窗口,这里能看到:

  1. 内参矩阵(焦距、主点坐标)
  2. 畸变系数(径向畸变k1,k2和切向畸变p1,p2)
  3. 外参中的旋转矩阵和平移向量

重点关注重投影误差,这个值越小越好。通常要低于0.5像素:

% 绘制误差分布
figure;
subplot(1,2,1);
showReprojectionErrors(params);
title('重投影误差散点');

subplot(1,2,2);
histogram(params.ReprojectionErrors(:),50);
title('误差分布直方图');

!误差分析

左图是每个角点的误差分布,右图显示大部分误差集中在0.2像素左右

最后来个直观的去畸变效果对比:

% 原始图像
origImg = imread(fullfile('imgs','test.jpg'));
figure;
imshow(origImg);
title('原始图像');

% 去畸变处理
undistImg = undistortImage(origImg, params);
figure;
imshow(undistImg);
title('矫正后图像');

!去畸变对比

注意看图中门框线条的变化,矫正后明显更笔直

几个避坑指南:

  1. 棋盘格数量建议9x6以上
  2. 拍摄时要有俯仰、倾斜等多种角度
  3. 环境光照要均匀,避免反光
  4. 标定板要完全出现在画面中

至于双目标定,原理其实差不多,主要多了基线距离计算和左右相机坐标对齐。不过Matlab的stereoCameraCalibrator工具已经能可视化操作,这里就不展开代码了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐