3D线扫相机手眼标定采集求解与验证实战 - 第2节
2.1 激光三角法原理
激光三角法是线结构光三维测量的核心物理基础。它利用激光器投射一条线状光条到被测物体表面,通过相机从另一角度拍摄光条图像,根据光条在图像中的偏移量,结合激光器与相机的几何关系,解算出物体表面的深度信息。
2.1.1 基本几何模型
典型的激光三角法测量系统由激光器、镜头和相机传感器组成。激光器以固定角度投射一条线激光,相机光轴与激光平面之间存在一个夹角(通常称为三角角或基线角)。当物体表面高度变化时,光条在相机像平面上的位置会发生横向偏移,偏移量与高度变化成近似线性关系。
核心公式(简化直射式):
Δx = (b · Δh) / (Z₀ - Δh) · (f / sinθ)
Δx = (b · Δh) / (Z₀ - Δh) · (f / sinθ)
- Δx — 像平面上的光条偏移量(像素)
- Δh — 物体表面高度变化
- b — 激光器与相机光心的基线距离
- Z₀ — 参考平面到相机光心的距离
- f — 镜头焦距
- θ — 激光平面与相机光轴的夹角
2.1.2 直射式与斜射式对比
根据激光器与相机光轴的相对位置关系,激光三角法可分为直射式和斜射式两种典型结构。
| 对比项 | 直射式 | 斜射式 |
|---|---|---|
| 激光入射方向 | 垂直于参考平面 | 与参考平面成一定角度 |
| 测量灵敏度 | 中等,与三角角正相关 | 较高,可调节入射角增大灵敏度 |
| 遮挡问题 | 较少,适合深孔/陡坡 | 较严重,易产生阴影区 |
| 标定复杂度 | 较低,几何关系简单 | 较高,需精确标定入射角 |
| 典型应用 | 3C电子、PCB检测 | 高精度轮廓、表面粗糙度测量 |
工程建议:在3D线扫相机手眼标定中,绝大多数工业场景采用直射式结构,因为其标定模型更简洁、遮挡更少,便于后续手眼矩阵的求解。斜射式多用于实验室级高精度测量。
2.2 线结构光轮廓提取
相机采集到包含线激光的图像后,需要从图像中精确提取激光条纹的中心位置,才能用于后续的三维重建。轮廓提取的精度直接决定了最终点云的质量。
2.2.1 提取流程
- 图像预处理:去噪(高斯滤波、中值滤波)、ROI裁剪、背景抑制。
- 激光条纹分割:通过阈值法或自适应阈值法将激光条纹从背景中分离。
- 亚像素中心提取:在条纹横截面上,使用灰度重心法、Steger法或高斯拟合法定位光条中心。
- 轮廓坐标输出:将中心点像素坐标按行/列组织成轮廓数组。
2.2.2 常用中心提取算法对比
| 算法 | 精度 | 速度 | 抗噪性 | 适用场景 |
|---|---|---|---|---|
| 灰度重心法 | 亚像素(0.1~0.3 pixel) | 极快 | 中等 | 实时在线检测 |
| Steger法 | 高(0.05~0.1 pixel) | 较慢 | 强 | 高精度离线测量 |
| 高斯拟合法 | 较高(0.1~0.2 pixel) | 中等 | 较强 | 激光条纹较宽的场景 |
灰度重心法代码示例(Python/OpenCV):
import cv2
import numpy as np
def gray_centroid(row_profile):
"""
对单行灰度剖面计算亚像素中心
row_profile: 1D numpy array, 灰度值
返回: 亚像素坐标 (float)
"""
x = np.arange(len(row_profile))
total_intensity = np.sum(row_profile)
if total_intensity == 0:
return -1
centroid = np.sum(x * row_profile) / total_intensity
return centroid
# 示例:对图像第100行提取中心
image = cv2.imread('laser_frame.png', cv2.IMREAD_GRAYSCALE)
row_data = image[100, :]
center_x = gray_centroid(row_data)
print(f"第100行激光中心: {center_x:.2f} 像素")
2.3 相机与激光的几何关系
要利用提取到的激光轮廓进行三维重建,必须建立相机坐标系与激光平面坐标系之间的精确几何变换关系。这是手眼标定之前的关键前置步骤。
2.3.1 坐标系定义
- 相机坐标系 (C):以相机光心为原点,Z轴沿光轴指向场景,X、Y轴与像平面平行。
- 激光平面坐标系 (L):以激光器出光点为原点,激光平面法向量为Z轴,激光线方向为X轴。
- 世界坐标系 (W):通常与标定板或参考平面固连,用于统一所有坐标变换。
2.3.2 激光平面标定
激光平面标定的目标是求解激光平面在相机坐标系下的方程。常用方法包括:
- 交比不变法:利用标定板上的已知特征点,通过交比不变性计算激光平面上的点。
- 锯齿靶标法:使用已知高度的锯齿块,拍摄多帧图像拟合激光平面。
- 主动视觉法:通过移动标定板或机械臂,采集多个位姿下的激光条纹进行平面拟合。
常见陷阱:激光平面标定精度直接影响后续三维重建的精度。标定时应确保激光条纹在标定板上清晰、均匀,避免过曝或欠曝。建议使用漫反射陶瓷标定板,减少镜面反射干扰。
2.3.3 从像素到三维点的映射
当激光平面方程已知后,对于图像中任意一个激光中心点 (u, v),可通过以下步骤得到其三维坐标:
- 利用相机内参将像素坐标 (u, v) 转换为归一化相机坐标 (xₙ, yₙ, 1)。
- 构造从相机光心出发的射线:P = λ · (xₙ, yₙ, 1)。
- 将射线方程代入激光平面方程:A·X + B·Y + C·Z + D = 0,求解 λ。
- 得到该点在相机坐标系下的三维坐标 (Xc, Yc, Zc)。
三维重建核心公式:
# 已知:相机内参 K, 激光平面系数 (A, B, C, D)
# 输入:像素坐标 (u, v)
# 输出:相机坐标系下三维点 (Xc, Yc, Zc)
def pixel_to_3d(u, v, K, plane_coeff):
fx, fy = K[0,0], K[1,1]
cx, cy = K[0,2], K[1,2]
A, B, C, D = plane_coeff
# 归一化坐标
xn = (u - cx) / fx
yn = (v - cy) / fy
# 求解 λ
denom = A * xn + B * yn + C
if abs(denom) < 1e-12:
return None # 射线与平面平行
lam = -D / denom
# 三维点
Xc = lam * xn
Yc = lam * yn
Zc = lam
return (Xc, Yc, Zc)
2.3.4 几何关系总结
| 要素 | 描述 | 标定方式 |
|---|---|---|
| 相机内参 | 焦距、主点、畸变系数 | 张正友标定法 |
| 激光平面方程 | 相机坐标系下的平面系数 (A,B,C,D) | 交比不变法 / 锯齿靶标法 |
| 手眼矩阵 | 相机坐标系到机器人基坐标系的变换 | 手眼标定(后续章节详解) |