4. 相机模型与成像几何:针孔模型、畸变模型、内参与外参的物理意义
做3D测量,绕不开相机模型。说白了,相机模型就是一套数学规则,它告诉我们:三维空间里的一个点,是怎么跑到二维图像上的。反过来,我们做标定,就是要把这套规则里的未知参数给算出来。
我个人习惯把相机模型拆成三块来理解:针孔模型(理想成像)、畸变模型(现实偏差)、内参和外参(数学描述)。这三块搞清楚了,标定你就懂了一半。
4.1 针孔模型:最朴素的成像原理
针孔模型是所有相机模型的起点。它假设光线沿直线传播,穿过一个小孔,在后面的成像平面上形成一个倒立的实像。你想想看,这其实就是初中物理的小孔成像。
数学上,针孔模型用相似三角形来描述。假设空间点 P(X, Y, Z) 在图像平面上的投影为 p(x, y),焦距为 f,那么:
x = f * (X / Z)
y = f * (Y / Z)
这个公式看着简单,但它是一切的基础。我在项目中遇到过不少新手,一上来就调畸变参数,结果发现标定总是不收敛。其实根源往往是针孔模型的基本假设没满足——比如相机离物体太近,或者镜头畸变太大,针孔模型已经不太适用了。
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
camera_calibration 算子会同时输出内参和外参。
4.5 完整的成像过程:从世界到像素
把上面所有步骤串起来,一个三维点是怎么变成像素的?
- 世界坐标系 → 相机坐标系:通过外参矩阵 (R, T)。
- 相机坐标系 → 归一化图像平面:通过针孔模型,得到 (x, y) = (X/Z, Y/Z)。
- 畸变校正:对 (x, y) 应用径向和切向畸变模型。
- 归一化平面 → 像素坐标系:通过内参矩阵 K,得到 (u, v)。
这个过程在 Halcon 里对应的是 project_3d_point 算子。我调试标定结果时,经常用它来验证:随便选几个标定板上的点,看投影到图像上的位置和实际检测到的位置是否一致。如果偏差超过 0.5 像素,我会重新检查标定数据。
get_calib_data 算子提取标定后的内参和外参,然后用 disp_caltab 把标定板投影到图像上,直观地检查标定质量。这个可视化步骤,我每次标定完都会做一遍。
4.6 本章小结
相机模型是3D测量的数学基础。针孔模型给出了理想成像的几何关系,畸变模型修正了现实镜头的偏差,内参矩阵描述了相机自身的属性,外参矩阵描述了相机在空间中的位置。理解这些参数的物理意义,能帮你更快地定位标定问题,而不是盲目地调参数。