直接上干货!今天咱们用Matlab整一波单目相机标定,手把手带你处理棋盘格数据。别慌,代码都是带详细注释的,小白也能直接抄作业
·
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);
标定完别急着关窗口!注意看弹出的结果窗口,这里能看到:
- 内参矩阵(焦距、主点坐标)
- 畸变系数(径向畸变k1,k2和切向畸变p1,p2)
- 外参中的旋转矩阵和平移向量
重点关注重投影误差,这个值越小越好。通常要低于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('矫正后图像');

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

几个避坑指南:
- 棋盘格数量建议9x6以上
- 拍摄时要有俯仰、倾斜等多种角度
- 环境光照要均匀,避免反光
- 标定板要完全出现在画面中
至于双目标定,原理其实差不多,主要多了基线距离计算和左右相机坐标对齐。不过Matlab的stereoCameraCalibrator工具已经能可视化操作,这里就不展开代码了。
更多推荐
所有评论(0)