3. 镜头畸变原理
在机器视觉测量与识别任务中,镜头畸变是影响系统精度的首要物理因素。Halcon 的标定流程本质上是在求解镜头畸变模型参数,因此理解畸变的数学来源与成像表现,是正确配置标定板、选择标定算法、评估标定结果的前提。本章从几何光学出发,系统拆解三类畸变的成因、数学模型与工程影响。
3.1 畸变的物理来源与数学模型
理想透镜满足小孔成像模型,即物点、光心、像点三点共线。实际镜头由多组球面透镜构成,光线经过不同折射面时偏离理想路径,导致像点位置偏移。这种偏移在数学上可分解为径向分量、切向分量与薄棱镜分量。
3.1.1 径向畸变(Radial Distortion)
径向畸变是影响最大的畸变成分,源于透镜曲率不完美。光线离光轴越远,折射偏差越大,表现为像点沿径向向内或向外移动。向内收缩称为桶形畸变(常见于广角镜头),向外扩张称为枕形畸变(常见于长焦镜头)。其数学模型采用奇次多项式展开:
x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)
其中 r^2 = x^2 + y^2,x、y 为归一化像平面坐标
Halcon 的 CalibData 中默认使用三个径向系数 k1、k2、k3。对于普通工业镜头,k3 通常不显著;但对于畸变较大的广角镜头或鱼眼镜头,必须启用 k3 才能收敛到亚像素精度。
3.1.2 切向畸变(Tangential Distortion)
切向畸变源于镜头组装时透镜组光轴与图像传感器平面不垂直,或各透镜光轴不完全共线。它导致像点在切线方向产生偏移,数学模型为:
x_distorted = x + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_distorted = y + [p1*(r^2 + 2*y^2) + 2*p2*x*y]
其中 p1、p2 为切向畸变系数。切向畸变通常比径向畸变小一个数量级,但在高精度测量(如 0.01mm 级)中不可忽略。Halcon 标定时默认估计 p1、p2,若镜头质量较好且安装规范,这两个系数会接近零。
3.1.3 薄棱镜畸变(Thin Prism Distortion)
薄棱镜畸变由镜头内部光学元件轻微倾斜或胶合面不均匀引起,等效于在光路中插入一块极薄的楔形棱镜,使整个像面产生线性平移和微小旋转。其数学模型为:
x_distorted = x + s1*r^2 + s2*r^4
y_distorted = y + s3*r^2 + s4*r^4
在 Halcon 的相机模型中,薄棱镜畸变通常不单独建模,而是被切向畸变系数部分吸收。只有在使用高畸变镜头且标定板覆盖全视场时,才需要启用扩展模型。实际工程中,薄棱镜畸变的影响往往小于传感器安装误差,因此多数标定流程将其忽略。
3.2 畸变对测量与识别的影响分析
畸变的影响并非均匀分布,而是随视场位置和测量任务类型而变化。下表总结了不同任务场景下的畸变敏感度:
| 任务类型 | 畸变敏感区域 | 典型误差量级 | Halcon 处理策略 |
|---|---|---|---|
| 二维尺寸测量 | 视场边缘 | 0.1% ~ 1% 视场宽度 | 标定后校正,或限制 ROI 在中心区域 |
| 二维码/条码识别 | 整体均匀 | 边缘码点误读率上升 | 校正后解码,或使用畸变不敏感算法 |
| 三维重建/双目视觉 | 全视场 | 深度误差随畸变放大 | 必须精确标定,否则极线约束失效 |
| 高精度定位(贴片机) | 边缘与对角线 | 亚像素偏差导致贴装偏移 | 逐像素校正,配合标定板全视场覆盖 |
3.2.1 对测量任务的影响机制
在二维尺寸测量中,畸变导致像点坐标偏离理想位置,直接破坏像素当量(mm/pixel)的一致性。例如,一个 12mm 镜头在 2/3 英寸传感器上,视场边缘的径向畸变可达 0.5%,意味着边缘处 100mm 的实际长度可能被测量为 99.5mm。更严重的是,畸变是非线性的,不能通过简单的比例系数修正。
Halcon 的校正流程通过标定获得畸变系数后,生成校正映射表(map),将畸变图像重采样为理想图像。校正后的图像中,像素当量在全视场保持一致,测量精度可提升至 0.01mm 量级。
3.2.2 对识别任务的影响机制
对于二维码、字符识别(OCR)或物体分类任务,畸变的影响表现为特征点位置偏移。以 DataMatrix 码为例,码点间距在边缘区域被压缩或拉伸,导致网格定位失败。Halcon 的 find_data_code_2d 算子内部会尝试估计畸变,但若畸变过大(如鱼眼镜头),识别率会显著下降。
对于基于形状匹配的识别(find_shape_model),畸变导致模板与搜索图像之间的几何对应关系破坏。Halcon 允许在创建模板时指定 metric 参数为 'ignore_local_polarity' 或使用 'use_polarity',但最可靠的方式仍是先校正图像再匹配。
3.3 畸变校正的工程流程
在 Halcon 中,畸变校正通常与相机标定同步完成。标准流程如下:
- 采集标定板图像:至少 10~15 张不同位姿(倾斜、旋转、平移)的图像,覆盖视场各区域。
- 提取标定板角点:使用
find_calib_object算子自动检测标定板标记点。 - 设置初始参数:通过
set_calib_data_cam_param指定初始焦距、像元尺寸、图像尺寸。 - 执行标定:调用
calibrate_cameras求解内参(焦距、畸变系数)和外参(位姿)。 - 评估结果:检查重投影误差(
get_calib_data获取),通常要求平均误差 < 0.1 像素。 - 生成校正映射:使用
change_radial_distortion_image或gen_radial_distortion_map生成校正图像。
// Halcon 标定核心代码片段
* 创建标定数据模型
create_calib_data ('calibration_object', 'camera', 1, 1, CalibDataID)
* 设置相机初始参数(面阵相机,焦距 12mm,像元 3.45um)
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', [0.012, 0, 0.00000345, 0.00000345, 640, 480, 0, 0])
* 设置标定板描述文件
set_calib_data_calib_object (CalibDataID, 0, 'calplate.cpd')
* 对每张图像提取标记点并关联
for I := 1 to 15 by 1
read_image (Image, 'calib_' + I$'02d')
find_calib_object (Image, CalibDataID, 0, 0, I-1, [], [])
endfor
* 执行标定
calibrate_cameras (CalibDataID, Error)
* 获取畸变系数
get_calib_data (CalibDataID, 'camera', 0, 'k1', K1)
get_calib_data (CalibDataID, 'camera', 0, 'k2', K2)
get_calib_data (CalibDataID, 'camera', 0, 'p1', P1)
get_calib_data (CalibDataID, 'camera', 0, 'p2', P2)
3.4 典型场景案例:高精度 PCB 定位
某电子制造产线使用 Halcon 对 PCB 板上的 Mark 点进行定位,以引导贴片机完成元件贴装。系统采用 500 万像素相机搭配 16mm 镜头,视场为 40mm × 30mm。未校正前,边缘区域 Mark 点定位误差达到 ±0.05mm,超出工艺要求(±0.02mm)。
通过 Halcon 标定后,获取的畸变系数为:k1 = -0.0823,k2 = 0.0157,p1 = 0.0004,p2 = -0.0003。重投影误差为 0.06 像素。校正后,边缘区域定位误差降至 ±0.008mm,满足工艺要求。
值得注意的是,该案例中切向畸变系数很小,说明镜头安装质量良好。若 p1、p2 绝对值大于 0.001,应检查镜头接口是否松动或传感器是否倾斜。
3.5 常见误区与复盘
k3 或薄棱镜系数,虽然能降低训练数据上的重投影误差,但会引入过拟合,导致校正后的图像在未采样区域出现波浪形畸变。应通过交叉验证选择模型复杂度。
.cpd 与实际板尺寸不符)。