三维数据采集与标定:相机标定、立体视觉标定、结构光/激光三角测量原理及Halcon标定流程
三维视觉测量的精度上限,往往不是由硬件分辨率决定,而是由标定质量决定。在Halcon环境下开展三维测量与缺陷检测,首先需要建立从二维像素坐标到三维空间坐标的可靠映射关系。本章围绕相机标定、立体视觉标定、结构光/激光三角测量原理以及Halcon标定流程展开,帮助读者建立从原理到落地的完整认知链路。
4.1 相机标定的核心原理与Halcon实现
相机标定解决的是"像素坐标与世界坐标之间的映射关系"问题。在Halcon中,标定过程基于针孔成像模型,并引入透镜畸变模型进行修正。针孔模型将三维空间点投影到二维图像平面,其数学表达式为:
s * [u, v, 1]^T = K * [R | T] * [X, Y, Z, 1]^T
其中,K为内参矩阵(包含焦距f、主点坐标cx、cy),R和T为外参(旋转矩阵和平移向量),s为尺度因子。Halcon使用标定板(通常为圆点阵列或棋盘格)作为已知尺寸的参照物,通过多角度采集图像,利用最小二乘优化求解内参、外参和畸变系数。
- 创建标定模型:使用
create_calib_data创建标定数据模型,设置相机数量和标定板数量。 - 设置标定板描述:通过
set_calib_data_calib_object加载标定板描述文件(.cpd),该文件包含标定板的物理尺寸和特征点布局。 - 采集标定图像:移动标定板,覆盖视场的不同位置和角度,采集15~25张图像。注意标定板应占据视场的1/3~1/2,且姿态要多样化(倾斜、旋转、前后移动)。
- 检测标定板特征:使用
find_calib_object自动检测标定板上的特征点(圆点中心或棋盘格角点)。 - 执行标定:调用
calibrate_cameras求解相机参数,输出内参、外参和畸变系数。 - 验证精度:检查重投影误差(通常应小于0.1像素),若误差过大,需检查图像质量或标定板状态。
| 标定参数 | 含义 | Halcon变量 | 典型值/范围 |
|---|---|---|---|
| 焦距 f | 镜头焦距(像素单位) | Focus | 1000~5000 px |
| 主点 cx, cy | 光轴与图像平面交点 | PrincipalPoint | 图像中心附近 |
| 径向畸变 k1, k2 | 镜头桶形/枕形畸变 | Kappa | -0.1~0.1 |
| 切向畸变 p1, p2 | 镜头与传感器不平行 | — | 通常较小 |
| 外参 R, T | 相机与标定板相对位姿 | Pose | 每张图像不同 |
disp_calib_object可视化检测结果,确认特征点定位准确。
4.2 立体视觉标定:双目/多目系统的位姿求解
立体视觉标定在单相机标定基础上,进一步求解两个或多个相机之间的相对位姿关系(旋转矩阵R和位移向量T)。该过程的核心是极线几何:空间中一点在左右相机成像平面上的投影点满足极线约束,通过本质矩阵E或基础矩阵F描述。Halcon的calibrate_stereo算子同时优化所有相机的内参和相对外参,使重投影误差最小化。
立体标定的关键步骤包括:
- 同步采集:左右相机需同步触发,确保同一时刻采集同一场景的标定板图像。
- 联合优化:Halcon将左右相机的内参、外参以及相对位姿作为整体优化变量,避免分步标定带来的误差累积。
- 极线校正:标定完成后,使用
gen_binocular_rectification_map生成校正映射,使左右图像行对齐,从而将立体匹配简化为水平搜索。
4.3 结构光/激光三角测量原理
结构光三维测量通过投射已知图案(如激光线、条纹、编码点阵)到物体表面,利用相机观察图案的形变来计算深度。激光三角测量是最常见的实现方式:激光器投射一条线到物体表面,相机从另一角度观察该线,物体高度变化导致激光线在图像中的位置偏移,通过三角几何关系计算深度。
Halcon中,激光三角测量通过calibrate_sheet_of_light实现光平面标定。该过程需要:
- 光平面标定:使用特制标定块(通常为阶梯状或斜面),在不同高度采集激光线图像,拟合光平面方程。
- 高度映射:建立像素行坐标与高度Z之间的映射关系,生成查找表。
- 三维重建:对物体扫描时,提取激光线中心,结合光平面方程计算每个像素对应的三维坐标。
| 方法 | 精度 | 速度 | 适用场景 | Halcon支持 |
|---|---|---|---|---|
| 激光三角 | 高(μm级) | 快 | 在线检测、轮廓测量 | sheet_of_light |
| 条纹投影 | 中高 | 中 | 面扫描、复杂曲面 | structured_light |
| 编码结构光 | 中 | 慢 | 静态场景、高分辨率 | structured_light |
4.4 Halcon标定流程实战:从图像采集到三维重建
下面以一个典型的激光三角测量缺陷检测项目为例,展示Halcon标定的完整流程。项目背景:检测PCB板焊点高度,精度要求±10μm,视场尺寸为50mm×50mm。
- 硬件配置:500万像素工业相机(2448×2048),16mm镜头,红色激光器(波长660nm),工作距离200mm,基线距离80mm。
- 标定步骤:
- 使用Halcon标定板(HC-50-30,圆点间距3.75mm)进行单相机标定,获取内参和畸变系数。
- 将激光器固定,投射激光线到标定块(已知高度差为5mm的阶梯块),采集10组不同高度的激光线图像。
- 调用
calibrate_sheet_of_light,输入标定块高度值和激光线像素坐标,拟合光平面方程。 - 生成高度映射查找表,验证标定精度:对标定块已知高度进行测量,计算误差。
- 结果:重投影误差0.08像素,高度测量误差±8μm,满足±10μm的精度要求。
- 复盘:标定过程中发现激光线在标定块边缘处有轻微弯曲,原因是标定块表面存在倒角。解决方案:在标定块上标记有效区域,仅使用中间80%的激光线数据进行拟合。
在Halcon中,标定流程的代码框架如下:
* 创建标定模型
create_calib_data ('calibration_object', 1, 1, CalibHandle)
set_calib_data_calib_object (CalibHandle, 0, 'hc-50-30.cpd')
* 设置相机初始参数
set_calib_data_cam_param (CalibHandle, 0, 'area_scan_division', [0, 0, 0, 0, 0, 0, 0, 0])
* 采集并检测标定板
for I := 1 to 20 by 1
read_image (Image, 'calib_' + I$'02d')
find_calib_object (Image, CalibHandle, 0, 0, I, [], [])
endfor
* 执行标定
calibrate_cameras (CalibHandle, Errors)
* 获取标定结果
get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParam)
* 保存标定结果
write_cam_par (CameraParam, 'camera_params.dat')
get_calib_data检查每张图像的标定误差,剔除误差过大的图像后重新标定,可显著提升整体精度。