一、标定基础:相机模型与成像原理

做机器视觉这些年,我越来越觉得标定就像盖楼打地基。地基没打好,上面算法再花哨也白搭。今天咱们就从最基础的相机模型聊起,把成像这事儿彻底说透。

1.1 相机模型:从三维世界到二维图像

说白了,相机就是个把三维世界“压扁”成二维图像的设备。这个过程涉及几个坐标系之间的转换,我习惯把它们分成四步走:

  1. 世界坐标系:你放标定板的地方,单位是毫米
  2. 相机坐标系:以相机光心为原点,Z轴朝前
  3. 图像坐标系:在成像平面上,单位还是毫米
  4. 像素坐标系:最终你看到的图像,单位是像素

这四步转换,每一步都有对应的参数。我刚开始学的时候总觉得参数太多记不住,后来发现其实就两类:内参和外参。

参数类型 包含内容 物理意义
内参 焦距、主点、畸变系数 相机本身的固有属性
外参 旋转矩阵、平移向量 相机在世界坐标系中的位姿

我的经验:内参一般标定一次就能用很久,除非你动了镜头或相机。外参每次重新安装都得重新标,这个别偷懒。

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 标定的核心目标与数学本质

说了这么多,标定到底要干什么?我总结了三件事:

  1. 求内参:知道相机本身的参数
  2. 求外参:知道相机在空间中的位置
  3. 去畸变:把变形的图像校正回来

数学本质上,标定就是一个参数优化问题。我们通过拍摄已知尺寸的标定板,建立从世界坐标到像素坐标的映射关系,然后用最小二乘法求解最优参数。

HALCON 里标定的流程大致是:

1. 准备标定板(HALCON 自带描述文件)
2. 拍摄多张不同位姿的标定板图像
3. 提取角点坐标
4. 调用 calibrate_cameras() 求解参数
5. 验证标定精度

这里有个容易忽略的点:标定板位姿要覆盖整个视场。我见过有人只拍正对着的几张,结果边缘区域畸变校正效果很差。

我的习惯:至少拍 15-20 张,覆盖视场的四个角和中心区域。标定板倾斜角度控制在 30 度以内,太斜了角点提取会失败。

1.5 知识体系总览

为了让你对整个标定基础有个全局认识,我画了张图:

标定基础知识体系 相机模型与成像 针孔模型 畸变模型 标定目标 世界→相机→图像→像素 径向畸变 + 切向畸变 求内参·求外参·去畸变 核心公式:s·[u,v,1]^T = K·[R|t]·[X,Y,Z,1]^T 本质:通过已知标定板,优化求解相机内外参数 标定 = 参数优化问题

这张图把标定基础的核心脉络理清楚了。从相机模型出发,分支出针孔模型、畸变模型和标定目标,最终汇聚到同一个结论:标定本质上就是个参数优化问题。

1.6 本章小结

嗯,这一章的内容就这些。记住三件事:

  • 相机成像涉及四个坐标系的转换
  • 针孔模型是基础,畸变模型是修正
  • 标定的核心就是求解内外参数并去畸变