3、相机成像模型:针孔相机模型原理,内参矩阵K,畸变模型(径向、切向),OpenCV与Halcon的畸变参数表示差异
3.1 针孔相机模型原理
针孔相机模型是计算机视觉中最基础、最常用的成像几何模型。它描述了三维空间中的点如何通过一个理想的小孔投影到二维成像平面上。尽管真实相机存在透镜和机械误差,但针孔模型为标定、三维重建和手眼变换提供了简洁的数学框架。
模型的核心假设是:所有光线都通过一个无限小的“针孔”(光心),并在后方的成像平面上形成倒立的实像。为简化计算,通常将成像平面虚拟到光心前方(正像平面),从而消除倒立关系。
关键坐标系链: 世界坐标系 → 相机坐标系 → 图像物理坐标系 → 图像像素坐标系。每一步变换都对应一个矩阵运算。
3.2 内参矩阵 K
内参矩阵 K 描述了相机内部光学与传感元件的固有属性,它将相机坐标系下的三维点映射到图像像素坐标系。K 是一个 3×3 的上三角矩阵,包含以下参数:
| 参数 | 符号 | 含义 | 单位 |
|---|---|---|---|
| 焦距(x方向) | fx | 镜头物理焦距在像素宽度上的等效值 | 像素 |
| 焦距(y方向) | fy | 镜头物理焦距在像素高度上的等效值 | 像素 |
| 主点(x方向) | cx | 光轴与成像平面交点的像素列坐标 | 像素 |
| 主点(y方向) | cy | 光轴与成像平面交点的像素行坐标 | 像素 |
| 倾斜因子 | s | 像素坐标系x轴与y轴的不垂直度(通常近似为0) | — |
内参矩阵 K 的标准形式:
K = [ f_x s c_x ]
[ 0 f_y c_y ]
[ 0 0 1 ]
在大多数现代相机中,s ≈ 0,像素为正方形(fx ≈ fy),但工业相机或非正方形像元传感器需要分别标定。
3.3 畸变模型:径向畸变与切向畸变
真实相机由于透镜制造工艺和装配误差,成像点会偏离理想针孔位置,产生光学畸变。畸变主要分为两类:
3.3.1 径向畸变(Radial Distortion)
由透镜表面曲率引起,光线在透镜边缘弯曲更严重。表现为图像点沿径向方向向内(桶形畸变)或向外(枕形畸变)偏移。径向畸变是畸变的主要成分,通常用泰勒级数展开的前几项描述:
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 甚至更高阶项。
3.3.2 切向畸变(Tangential Distortion)
由透镜与成像平面不平行(装配倾斜)引起。表现为图像点沿切线方向偏移,数学模型为:
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]
其中 p1、p2 为切向畸变系数。
⚠ 畸变校正顺序: 在实际标定流程中,先校正切向畸变,再校正径向畸变。OpenCV 和 Halcon 内部均遵循此顺序,但参数表示方式不同,详见 3.4 节。
3.4 OpenCV 与 Halcon 的畸变参数表示差异
OpenCV 和 Halcon 虽然都基于相同的物理畸变模型,但在参数向量定义、系数符号约定和存储顺序上存在关键差异。下表总结了核心区别:
| 对比项 | OpenCV | Halcon |
|---|---|---|
| 畸变参数向量 | distCoeffs = [k1, k2, p1, p2, k3, k4, k5, k6] |
CameraParam = [k1, k2, p1, p2, k3](标准模型) |
| 径向畸变阶数 | 支持 k1~k6(最多6阶),常用 k1,k2,k3 | 标准模型仅 k1,k2,k3;另有 division 模型 |
| 切向畸变 | p1, p2 与 OpenCV 定义一致 | p1, p2 与 Halcon 定义一致 |
| 参数顺序 | 先径向(k1,k2),再切向(p1,p2),再高阶径向(k3~k6) | 先径向(k1,k2,k3),再切向(p1,p2) |
| 归一化坐标系 | 归一化图像平面(焦距=1) | 归一化图像平面(焦距=1) |
| 畸变应用方向 | 从畸变点 → 理想点(校正方向) | 从理想点 → 畸变点(投影方向) |
| 内参与畸变存储 | 分开存储:cameraMatrix + distCoeffs | 合并存储:CameraParam 包含内参 + 畸变系数 |
🔧 实际工程注意事项:
- 符号约定:OpenCV 的 k1 为正时对应枕形畸变,Halcon 的 k1 为正时对应桶形畸变。跨平台移植时需取反。
- 参数长度:OpenCV 的 distCoeffs 长度可变(4、5、8、12、14),Halcon 标准模型固定为 5 个参数。
- 校正函数:OpenCV 使用
cv::undistort()或cv::initUndistortRectifyMap();Halcon 使用change_radial_distortion_cam_par()生成映射。
3.5 畸变校正流程对比
无论是 OpenCV 还是 Halcon,畸变校正的完整流程都遵循以下步骤:
- 标定获取参数:使用棋盘格或圆点标定板,通过多幅图像计算内参矩阵 K 和畸变系数。
- 生成映射表:根据 K 和畸变系数,计算每个像素从畸变图像到校正图像的坐标映射。
- 重映射:使用双线性插值或最近邻插值,将畸变图像像素填充到校正图像中。
- 验证:检查校正后图像中直线是否笔直,棋盘格角点是否对齐。
💡 性能建议: 在实时手眼标定或在线检测场景中,建议预先计算并保存映射表(remap map),避免每帧重复计算畸变系数。OpenCV 的
initUndistortRectifyMap() 和 Halcon 的 gen_radial_distortion_map() 均支持此优化。
3.6 本章小结
- 针孔相机模型通过内参 K 和外参 [R|t] 将世界点映射到像素坐标,是标定与三维重建的数学基础。
- 内参矩阵 K 包含焦距、主点和倾斜因子,是相机固有的不可变属性。
- 畸变模型分为径向畸变(k1,k2,k3)和切向畸变(p1,p2),校正时先切向后径向。
- OpenCV 与 Halcon 在畸变参数顺序、符号约定和存储方式上存在差异,跨平台移植时必须手动转换。
- 理解这些差异是后续手眼标定中正确传递相机参数的前提,也是避免标定结果异常的关键。