从原理到实践:基于Matlab的单目相机标定全流程解析
1. 单目相机标定的核心原理单目相机标定是计算机视觉中最基础也最重要的环节之一。简单来说标定的目的就是确定相机如何将三维世界中的点映射到二维图像上。这个过程有点像给相机做体检通过一系列测量和计算我们能够精确掌握相机的视力状况。在实际操作中我习惯把相机成像过程想象成一个翻译官的工作。这个翻译官需要把三维世界的语言XYZ坐标转换成二维图像的语言uv像素坐标。这个转换过程涉及四个关键坐标系世界坐标系物体在真实世界中的位置相机坐标系以相机为中心建立的坐标系图像坐标系成像平面上的物理坐标毫米单位像素坐标系最终图像上的像素位置我曾经在一个工业检测项目中遇到过这样的问题相机拍摄的圆形标记在图像中变成了椭圆形。这就是典型的坐标系转换问题通过标定我们就能准确计算出这种形变的规律。2. 理想成像模型详解2.1 坐标系转换全流程让我们用一个实际的例子来说明这个转换过程。假设我们要拍摄一个放在桌子上的咖啡杯世界坐标系到相机坐标系的转换刚体变换 这个步骤就像确定咖啡杯相对于相机的位置和角度。数学上用一个3×3的旋转矩阵R和3×1的平移向量t来表示% MATLAB示例代码 R [1 0 0; 0 1 0; 0 0 1]; % 旋转矩阵 t [0; 0; 1]; % 平移向量 P_camera R * P_world t;相机坐标系到图像坐标系的转换透视投影 这个过程遵循小孔成像原理可以用相似三角形来解释。在实际项目中我发现很多初学者容易混淆焦距f的单位这里要特别注意f的单位是毫米。图像坐标系到像素坐标系的转换 这个步骤需要考虑传感器的物理特性。比如我常用的某款工业相机每个像素的物理尺寸是3.45μm×3.45μm。转换公式为u x/dx u0 v y/dy v0其中(u0,v0)是主点坐标dx和dy是每个像素的物理尺寸。2.2 内参矩阵与外参矩阵把上述转换过程整合起来就得到了相机的内参矩阵K和外参矩阵[R|t]K [fx 0 cx; 0 fy cy; 0 0 1];其中fxf/dxfyf/dy(cx,cy)是主点坐标。我在实际项目中发现很多消费级相机的fx和fy非常接近可以近似认为相等。3. 相机畸变模型解析3.1 径向畸变详解在实际工作中我遇到最多的就是径向畸变问题。记得有一次做无人机视觉导航拍回来的图像边缘弯曲严重这就是典型的桶形畸变。径向畸变可以用多项式模型来描述x_corrected x*(1 k1*r^2 k2*r^4 k3*r^6) y_corrected y*(1 k1*r^2 k2*r^4 k3*r^6)其中r是点到图像中心的距离。对于大多数普通镜头k3的影响可以忽略不计。3.2 切向畸变分析切向畸变在工业相机中更为常见特别是当镜头安装不够平行时。它的数学模型是x_corrected x [2*p1*x*y p2*(r^22*x^2)] y_corrected y [p1*(r^22*y^2) 2*p2*x*y]我曾经处理过一个案例相机的切向畸变系数特别大后来发现是镜头安装时出现了倾斜。调整后重新标定问题就解决了。4. Matlab标定实战全流程4.1 标定板准备技巧根据我的经验标定板的选择直接影响标定结果。我推荐使用棋盘格标定板因为它特征明显检测稳定。几个实用建议标定板要平整可以贴在玻璃或亚克力板上格子数量建议在8×6到10×7之间物理尺寸要精确测量误差控制在0.1mm内拍摄时标定板要占图像面积的1/3到1/2我曾经试过自己打印标定板结果因为纸张伸缩导致标定误差很大。后来改用专业标定板问题就解决了。4.2 拍摄标定图像的注意事项拍摄标定图像是一门艺术经过多次实践我总结出以下要点拍摄15-20张不同角度和位置的图像标定板要覆盖整个视场特别是边缘区域包含标定板倾斜、旋转的各种姿态确保图像清晰不模糊光照均匀避免反光和阴影% 加载图像示例代码 imageDir fullfile(toolboxdir(vision), visiondata, calibration, mono); imageFiles imageSet(imageDir).ImageLocation;4.3 Matlab标定工具使用详解Matlab的Camera Calibrator工具非常强大但有几个关键点需要注意启动工具在APP选项卡中找到Camera Calibrator导入图像后务必准确输入每个格子的物理尺寸工具会自动检测棋盘格但需要人工检查是否正确标定完成后查看重投影误差建议控制在0.1像素以内可以导出cameraParams对象包含所有标定参数% 导出标定结果示例 save(cameraParams.mat, cameraParams);5. 标定结果验证与应用5.1 标定质量评估方法判断标定结果是否可靠我通常看三个指标重投影误差理想值0.1像素参数的标准差反映参数的稳定性畸变校正效果肉眼观察边缘直线是否变直我曾经遇到过一个案例重投影误差很小但实际使用时效果很差。后来发现是因为拍摄的标定图像姿态变化不够丰富。5.2 实际应用案例将标定结果用于实际项目时有几个实用技巧保存标定结果时建议同时保存原始图像对于需要高精度的应用建议定期重新标定温度变化大的环境要考虑热胀冷缩对标定的影响% 使用标定结果校正图像示例 [undistortedImage, newOrigin] undistortImage(originalImage, cameraParams);6. 常见问题排查指南6.1 标定失败原因分析根据我的经验标定失败通常有以下几种原因标定板检测失败可能是对比度不足或图案不清晰参数异常可能是拍摄姿态不够多样化误差过大可能是标定板尺寸输入错误6.2 提高标定精度的技巧使用更高精度的标定板增加标定图像数量建议20-30张确保标定板覆盖整个视场在不同光照条件下分别标定使用多阶段标定法先标定内参再标定外参在实际项目中我发现温度变化会对标定结果产生影响。特别是在室外环境中建议在操作温度下重新标定。