一、标定基础:相机模型与成像原理
做机器视觉这些年,我越来越觉得标定就像盖楼打地基。地基没打好,上面算法再花哨也白搭。今天咱们就从最基础的相机模型聊起,把成像这事儿彻底说透。
1.1 相机模型:从三维世界到二维图像
说白了,相机就是个把三维世界“压扁”成二维图像的设备。这个过程涉及几个坐标系之间的转换,我习惯把它们分成四步走:
- 世界坐标系:你放标定板的地方,单位是毫米
- 相机坐标系:以相机光心为原点,Z轴朝前
- 图像坐标系:在成像平面上,单位还是毫米
- 像素坐标系:最终你看到的图像,单位是像素
这四步转换,每一步都有对应的参数。我刚开始学的时候总觉得参数太多记不住,后来发现其实就两类:内参和外参。
| 参数类型 | 包含内容 | 物理意义 |
|---|---|---|
| 内参 | 焦距、主点、畸变系数 | 相机本身的固有属性 |
| 外参 | 旋转矩阵、平移向量 | 相机在世界坐标系中的位姿 |
我的经验:内参一般标定一次就能用很久,除非你动了镜头或相机。外参每次重新安装都得重新标,这个别偷懒。
1.2 针孔模型:最经典的成像模型
针孔模型是理解成像的基础。你想想看,光线通过一个小孔投射到后面的平面上,就形成了倒立的像。这个模型虽然简单,但足够描述大多数工业相机的工作方式。
数学上,针孔模型可以写成:
s * [u, v, 1]^T = K * [R|t] * [X, Y, Z, 1]^T
其中:
- s 是尺度因子
- [u, v] 是像素坐标
- K 是内参矩阵
- [R|t] 是外参矩阵
- [X, Y, Z] 是世界坐标
这个公式看着复杂,其实核心就一句话:世界坐标经过旋转平移,再经过内参投影,就变成了像素坐标。
关键点:针孔模型假设光线是直线传播的,但实际镜头总会引入畸变。这就是为什么我们需要畸变模型来修正。
1.3 畸变模型:现实总是不完美的
我在项目中遇到过最头疼的问题,就是畸变导致的测量误差。明明标定板摆得端端正正,拍出来边缘却是弯的。这就是镜头畸变在作怪。
常见的畸变有两种:
- 径向畸变:光线通过镜头边缘时弯曲,表现为“桶形”或“枕形”
- 切向畸变:镜头与成像平面不平行,表现为“梯形”
HALCON 里处理畸变用的是 Brown 模型,数学表达如下:
x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*x*y + p2*(r^2 + 2*x^2)
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + p1*(r^2 + 2*y^2) + 2*p2*x*y
其中 k1、k2、k3 是径向畸变系数,p1、p2 是切向畸变系数。r 是点到图像中心的距离。
避坑指南:我曾经只用 k1 和 k2 做标定,结果高精度测量时误差总是超限。后来加上 k3 才解决问题。如果你的镜头畸变比较大,建议把 k3 也标上。
1.4 标定的核心目标与数学本质
说了这么多,标定到底要干什么?我总结了三件事:
- 求内参:知道相机本身的参数
- 求外参:知道相机在空间中的位置
- 去畸变:把变形的图像校正回来
数学本质上,标定就是一个参数优化问题。我们通过拍摄已知尺寸的标定板,建立从世界坐标到像素坐标的映射关系,然后用最小二乘法求解最优参数。
HALCON 里标定的流程大致是:
1. 准备标定板(HALCON 自带描述文件)
2. 拍摄多张不同位姿的标定板图像
3. 提取角点坐标
4. 调用 calibrate_cameras() 求解参数
5. 验证标定精度
这里有个容易忽略的点:标定板位姿要覆盖整个视场。我见过有人只拍正对着的几张,结果边缘区域畸变校正效果很差。
我的习惯:至少拍 15-20 张,覆盖视场的四个角和中心区域。标定板倾斜角度控制在 30 度以内,太斜了角点提取会失败。
1.5 知识体系总览
为了让你对整个标定基础有个全局认识,我画了张图:
这张图把标定基础的核心脉络理清楚了。从相机模型出发,分支出针孔模型、畸变模型和标定目标,最终汇聚到同一个结论:标定本质上就是个参数优化问题。
1.6 本章小结
嗯,这一章的内容就这些。记住三件事:
- 相机成像涉及四个坐标系的转换
- 针孔模型是基础,畸变模型是修正
- 标定的核心就是求解内外参数并去畸变