目录

一 Steger 亚像素中心线提取

1.1 构造高斯导数卷积核

1.2 Hessian 矩阵与法线方向

1.3 亚像素偏移

二、相机标定

2.1 标定参数文件格式

三、光平面标定与三维重建


      线结构光三维测量是一种主动视觉技术,通过线激光器向物体表面投射一个光平面(俗称“光刀”),该平面与物体表面相交形成一条变形的激光条纹。摄像机从另一个角度拍摄条纹图像,由于物体表面的高度起伏,条纹在图像中产生偏移。利用摄像机内外参数以及激光平面的空间方程,可以从图像中条纹的亚像素位置反推出物体表面的三维世界坐标,从而实现单帧三维轮廓的快速获取。

本文基于一套完整的 C++ 实现,系统性地讲解如何整合大恒工业相机Steger 中心线提取相机标定与坐标转换,构建一个实时、可用的线结构光三维测量前端。

一 Steger 亚像素中心线提取

        Steger 算法是线结构光中心提取的“黄金标准”。其核心思想是利用Hessian 矩阵确定条纹的法线方向,并在法线方向上对灰度进行二阶泰勒展开,求出亚像素精度的极值点。

1.1 构造高斯导数卷积核

首先计算图像的一阶偏导 Ix, Iy 和二阶偏导 Ixx, Iyy, Ixy。为避免噪声,使用高斯平滑后的导数核:

  • 一阶导数核:
    g′(x)=−x⋅e−x2/(2σ2)

  • 二阶导数核:
    g′′(x)=(x2−σ2)⋅e−x2/(2σ2)

代码中 createGaussianDerivativeKernel 和 createGaussianSecondDerivativeKernel 生成一维核,再通过 filter2D 与图像卷积得到各阶导数(Ixy 由 Ix 对 y 导得)。

1.2 Hessian 矩阵与法线方向

对于每个像素 (r,c),Hessian 矩阵为:

计算其特征值 λ1,λ2(λ1≥λ2​)。激光条纹在图像中表现为暗背景上的亮线(或反之),因此中心点处 Hessian 矩阵的一个特征值为负(亮线)或正(暗线),其绝对值较大。代码中通过 mode 参数选择提取亮线(max_eig < 0)或暗线。

特征向量中绝对值较大的分量对应法线方向 
𝑛=(𝑛𝑥,𝑛𝑦)。

1.3 亚像素偏移

沿法线方向的一阶导数为 Ixnx+Iyny​,二阶方向导数为:

Hnn=Ixxnx2+2Ixynxny+Iyyny2

则亚像素偏移量为:

t=−Ixnx+Iyny/Hnnt

最终中心点坐标为 (c+tnx,  r+tny),仅当 ∣tnx∣≤0.5 且 ∣tny∣≤0.5 时保留(保证偏移不超过半个像素,即仍在当前像素邻域内)。

二、相机标定

2.1 标定参数文件格式

我们使用一个纯文本文件 camera_calibration.txt 存储标定数据,格式如下(依次为):

内参矩阵 K(9个浮点数,行优先)
畸变系数 k1 k2 p1 p2 k3
旋转向量 r1 r2 r3
平移向量 t1 t2 t3

三、光平面标定与三维重建

设激光平面在世界坐标系下的方程为:

AXw+BYw+CZw+D=0(6.3-1)

其中 (A,B,C) 为平面的法向量,D 为常数项。该平面参数可通过 激光平面标定 获得:在相机视野内放置一块已知高度的标定板(或使用多个不同姿态的平面靶标),拍摄激光条纹图像,提取条纹中心点并记录对应的世界坐标(通过标定板位姿已知),然后利用最小二乘法拟合所有点满足的平面方程,得到 A,B,C,D。若法向量已单位化,则 D 的几何意义为原点沿法向的有符号距离。

相机外参给出了世界坐标系到相机坐标系的旋转矩阵 R 和平移向量 t(列向量),使得空间点 Xw=(Xw,Yw,Zw)T 在相机坐标系下的坐标为:

Xc=RXw+t(6.3-2)

对于图像中提取的亚像素中心点 (u,v),先通过内参矩阵 K 和畸变系数 distCoeffs进行去畸变,得到归一化相机坐标 (xn,yn),即该点对应的光线在相机坐标系下的方向向量为:

𝑑𝑐𝑎𝑚=(𝑥𝑛,  𝑦𝑛,  1)𝑇(6.3-3)

将该方向向量转换到世界坐标系:

dw=RTdcam(6.3-4)

因为旋转矩阵 R 为正交阵,RT=R−1。同时,相机光心在世界坐标系中的位置可由外参推导:

Cw=−RTt(6.3-5)

于是,从光心 CwCw​ 出发,沿世界方向 dwdw​ 的光线可参数化表示为:

Xw(λ)=Cw+λdw,λ>0(6.3-6)

将该式代入平面方程 (6.3-1):

A(Cw,x+λdw,x)+B(Cw,y+λdw,y)+C(Cw,z+λdw,z)+D=0

整理后解得参数 λ:

λ=−ACw,x+BCw,y+CCw,z+D/Adw,x+Bdw,y+Cdw,z(6.3-7)

若分母绝对值小于某个极小阈值(如 ^{10^{-6}}),表明光线与平面平行,此时无交点,该像素点视为无效点。将 λ 代回 (6.3-6) 即可得到该点在三维空间中的世界坐标 (Xw,Yw,Zw)。

该方法将图像中每个亚像素中心点独立地映射到三维空间,形成单帧点云。所有点均落在同一激光平面上,因此得到的 ZwZw​ 坐标理论上应相等(平面方程决定),实际测量中由于噪声和标定误差会略有波动,但整体反映了物体在该激光切片上的轮廓高度信息。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构