3D线扫测量系统标定与坐标工程 - 第2节

2. 3D线扫相机成像原理

激光三角法是线结构光三维测量的核心物理基础。它利用激光器投射一条线状光条到被测物体表面,通过相机从另一角度拍摄光条图像,根据光条在图像中的偏移量,结合激光器与相机的几何关系,解算出物体表面的深度信息。

2.1.1 基本几何模型

典型的激光三角法测量系统由激光器、镜头和相机传感器组成。激光器以固定角度投射一条线激光,相机光轴与激光平面之间存在一个夹角(通常称为三角角或基线角)。当物体表面高度变化时,光条在相机像平面上的位置会发生横向偏移,偏移量与高度变化成近似线性关系。

核心公式(简化直射式):
Δx = (b · Δh) / (Z₀ - Δh) · (f / sinθ)
  • Δx — 像平面上的光条偏移量(像素)
  • Δh — 物体表面高度变化
  • b — 激光器与相机光心的基线距离
  • Z₀ — 参考平面到相机光心的距离
  • f — 镜头焦距
  • θ — 激光平面与相机光轴的夹角
激光三角法几何原理(直射式) 激光器 相机 镜头 激光平面 参考平面 物体表面 基线 b θ Δh 光轴 像平面 Δx 偏移 当物体高度变化 Δh,光条在像平面上的位置偏移 Δx,通过几何关系可反解出 Δh

2.1.2 直射式与斜射式对比

根据激光器与相机光轴的相对位置关系,激光三角法可分为直射式和斜射式两种典型结构。

对比项 直射式 斜射式
激光入射方向 垂直于参考平面 与参考平面成一定角度
测量灵敏度 中等,与三角角正相关 较高,可调节入射角增大灵敏度
遮挡问题 较少,适合深孔/陡坡 较严重,易产生阴影区
标定复杂度 较低,几何关系简单 较高,需精确标定入射角
典型应用 3C电子、PCB检测 高精度轮廓、表面粗糙度测量
工程建议:在3D线扫相机手眼标定中,绝大多数工业场景采用直射式结构,因为其标定模型更简洁、遮挡更少,便于后续手眼矩阵的求解。斜射式多用于实验室级高精度测量。

2.2 线结构光轮廓提取

相机采集到包含线激光的图像后,需要从图像中精确提取激光条纹的中心位置,才能用于后续的三维重建。轮廓提取的精度直接决定了最终点云的质量。

2.2.1 提取流程

  1. 图像预处理:去噪(高斯滤波、中值滤波)、ROI裁剪、背景抑制。
  2. 激光条纹分割:通过阈值法或自适应阈值法将激光条纹从背景中分离。
  3. 亚像素中心提取:在条纹横截面上,使用灰度重心法、Steger法或高斯拟合法定位光条中心。
  4. 轮廓坐标输出:将中心点像素坐标按行/列组织成轮廓数组。

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} 像素")
线结构光轮廓提取流程 原始图像 预处理 条纹分割 亚像素中心提取 子步骤:去噪 → ROI裁剪 → 阈值分割 → 灰度重心/Steger/高斯拟合 输出:每行激光中心的亚像素坐标 (u, v) 输出:轮廓点集 (N × 2)

2.3 相机与激光的几何关系

要利用提取到的激光轮廓进行三维重建,必须建立相机坐标系与激光平面坐标系之间的精确几何变换关系。这是手眼标定之前的关键前置步骤。

2.3.1 坐标系定义

  • 相机坐标系 (C):以相机光心为原点,Z轴沿光轴指向场景,X、Y轴与像平面平行。
  • 激光平面坐标系 (L):以激光器出光点为原点,激光平面法向量为Z轴,激光线方向为X轴。
  • 世界坐标系 (W):通常与标定板或参考平面固连,用于统一所有坐标变换。

2.3.2 激光平面标定

激光平面标定的目标是求解激光平面在相机坐标系下的方程。常用方法包括:

  1. 交比不变法:利用标定板上的已知特征点,通过交比不变性计算激光平面上的点。
  2. 锯齿靶标法:使用已知高度的锯齿块,拍摄多帧图像拟合激光平面。
  3. 主动视觉法:通过移动标定板或机械臂,采集多个位姿下的激光条纹进行平面拟合。
常见陷阱:激光平面标定精度直接影响后续三维重建的精度。标定时应确保激光条纹在标定板上清晰、均匀,避免过曝或欠曝。建议使用漫反射陶瓷标定板,减少镜面反射干扰。

2.3.3 从像素到三维点的映射

当激光平面方程已知后,对于图像中任意一个激光中心点 (u, v),可通过以下步骤得到其三维坐标:

  1. 利用相机内参将像素坐标 (u, v) 转换为归一化相机坐标 (xₙ, yₙ, 1)。
  2. 构造从相机光心出发的射线:P = λ · (xₙ, yₙ, 1)。
  3. 将射线方程代入激光平面方程:A·X + B·Y + C·Z + D = 0,求解 λ。
  4. 得到该点在相机坐标系下的三维坐标 (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) 交比不变法 / 锯齿靶标法
手眼矩阵 相机坐标系到机器人基坐标系的变换 手眼标定(后续章节详解)