4. 相机模型与成像几何

做3D测量,绕不开相机模型。说白了,相机模型就是一套数学规则,它告诉我们:三维空间里的一个点,是怎么跑到二维图像上的。反过来,我们做标定,就是要把这套规则里的未知参数给算出来。

我个人习惯把相机模型拆成三块来理解:针孔模型(理想成像)、畸变模型(现实偏差)、内参和外参(数学描述)。这三块搞清楚了,标定你就懂了一半。

相机模型知识结构 相机模型 针孔模型 畸变模型 内参 & 外参 相似三角形 倒立实像 径向畸变 切向畸变 fx, fy, cx, cy R, T 矩阵

4.1 针孔模型:最朴素的成像原理

针孔模型是所有相机模型的起点。它假设光线沿直线传播,穿过一个小孔,在后面的成像平面上形成一个倒立的实像。你想想看,这其实就是初中物理的小孔成像。

数学上,针孔模型用相似三角形来描述。假设空间点 P(X, Y, Z) 在图像平面上的投影为 p(x, y),焦距为 f,那么:

x = f * (X / Z)
y = f * (Y / Z)

这个公式看着简单,但它是一切的基础。我在项目中遇到过不少新手,一上来就调畸变参数,结果发现标定总是不收敛。其实根源往往是针孔模型的基本假设没满足——比如相机离物体太近,或者镜头畸变太大,针孔模型已经不太适用了。

我的习惯:在做高精度测量前,先用 Halcon 的 gen_cam_par_area_scan_division 快速估算一下内参,看看 fx 和 fy 是否接近。如果相差超过 5%,说明镜头可能存在较大的畸变,需要更仔细地标定。

4.2 畸变模型:现实世界没有完美的镜头

现实中的镜头不是理想的小孔。光线经过透镜时会发生折射,导致图像变形。这就是畸变。畸变主要分两类:径向畸变和切向畸变。

4.2.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 是像素到图像中心的距离,k1、k2、k3 是径向畸变系数。一般标定只需要 k1 和 k2,k3 用于高畸变镜头。

4.2.2 切向畸变

切向畸变是由于镜头和成像平面不平行造成的。说白了,就是镜头装歪了。它用两个参数 p1、p2 来描述:

x_corrected = x + [2 * p1 * x * y + p2 * (r^2 + 2 * x^2)]
y_corrected = y + [p1 * (r^2 + 2 * y^2) + 2 * p2 * x * y]
我曾经踩过的坑:有一次标定一个工业相机,发现重投影误差总是降不下去。检查了所有参数,最后发现是镜头固定螺丝松了,导致切向畸变特别大。重新拧紧后,误差立刻降了一半。所以,物理安装的稳定性比算法本身更重要。

4.3 内参矩阵:相机自己的“身份证”

内参矩阵描述了相机内部的几何属性。它把相机坐标系下的点映射到像素坐标系。标准形式是:

     [ fx  0  cx ]
K =  [ 0  fy  cy ]
     [ 0   0   1 ]

每个参数的物理意义:

参数 物理意义 单位
fx, fy 焦距在 x 和 y 方向上的像素当量。fx = f / dx,其中 dx 是每个像素的物理宽度。 像素
cx, cy 主点坐标,即光轴与成像平面的交点。理想情况下在图像中心。 像素

你想想看,fx 和 fy 如果不一样,说明像素不是正方形的。这在工业相机里很常见,尤其是 CMOS 传感器。我一般拿到一个新相机,第一件事就是看 fx 和 fy 的比值,如果偏离 1 太多,我会怀疑是不是相机参数设置错了。

4.4 外参矩阵:相机在空间中的“位置和姿态”

外参矩阵描述的是世界坐标系和相机坐标系之间的变换关系。它由两部分组成:

  • 旋转矩阵 R:3x3 矩阵,描述两个坐标系之间的旋转关系。
  • 平移向量 T:3x1 向量,描述两个坐标系原点之间的位移。

外参矩阵的齐次形式是:

[ R  T ]
[ 0  1 ]

它的作用是把世界坐标系下的点 P_w 转换到相机坐标系下:

P_c = R * P_w + T
关键理解:内参是相机“出厂自带”的属性,一般不会变。外参是每次安装或移动相机后都需要重新标定的。在 Halcon 中,camera_calibration 算子会同时输出内参和外参。

4.5 完整的成像过程:从世界到像素

把上面所有步骤串起来,一个三维点是怎么变成像素的?

  1. 世界坐标系 → 相机坐标系:通过外参矩阵 (R, T)。
  2. 相机坐标系 → 归一化图像平面:通过针孔模型,得到 (x, y) = (X/Z, Y/Z)。
  3. 畸变校正:对 (x, y) 应用径向和切向畸变模型。
  4. 归一化平面 → 像素坐标系:通过内参矩阵 K,得到 (u, v)。

这个过程在 Halcon 里对应的是 project_3d_point 算子。我调试标定结果时,经常用它来验证:随便选几个标定板上的点,看投影到图像上的位置和实际检测到的位置是否一致。如果偏差超过 0.5 像素,我会重新检查标定数据。

实用技巧:在 Halcon 中,你可以用 get_calib_data 算子提取标定后的内参和外参,然后用 disp_caltab 把标定板投影到图像上,直观地检查标定质量。这个可视化步骤,我每次标定完都会做一遍。

4.6 本章小结

相机模型是3D测量的数学基础。针孔模型给出了理想成像的几何关系,畸变模型修正了现实镜头的偏差,内参矩阵描述了相机自身的属性,外参矩阵描述了相机在空间中的位置。理解这些参数的物理意义,能帮你更快地定位标定问题,而不是盲目地调参数。