基于BP神经网络与双重交比的振镜式线结构光标定方法
2026/9/19 22:02:03 网站建设 项目流程

简介:一份基于神经网络的振镜式线结构光三维测量系统标定方法的学术论文,面向三维测量、机器视觉与深度学习交叉领域的研究人员和工程师。该论文针对振镜式系统光平面与镜头相对位置时变、传统标定方法难以适用的问题,提出基于双重交比不变原理,利用棋盘格靶标和电动平移台获取精确标定点坐标,以图像坐标及光平面转角为输入、三维世界坐标为输出,构建神经网络模型完成系统标定,从而简化标定过程,提升标定精度与通用性。资源共1个PDF文件,压缩包约1.8MB,包含论文正文、中英文摘要及基金项目信息,已有198人学习下载。读者可借此系统掌握振镜式线结构光测量标定的方法原理、神经网络建模与训练要点,以及实验验证与数据分析过程,为相关课题研究或工程应用提供参考。

1. 振镜式线结构光系统为什么不能直接套用传统标定

传统线结构光系统靠平移台或旋转台带动激光器或被测物体移动,光平面与相机的相对位置在扫描过程中基本固定,标定核心就是求那个静态光平面方程。振镜式系统完全不同:单轴振镜带动反射镜转动,线激光的出射方向被实时改变,光平面与镜头光轴的夹角在每个转角下都在变,再用单个光平面方程做三角测量,误差会随转角增大而迅速放大。

这篇论文把标定改成函数拟合问题:图像坐标 u、v 加上光平面转角 θ 作为输入,三维世界坐标 X、Y、Z 作为输出,用 BP 神经网络完成映射。标定点通过棋盘格标定板加电动平移台采集,由双重交比不变原理计算出来,网络训练完即可投入测量。适合做线结构光传感器标定、被光平面建模折腾得够呛的工程师参考。

2. 双重交比不变原理与标定点获取的实现细节

2.1 交比不变原理的几何意义

交比不变原理是射影几何里的基本结论:同一直线上四个点 A、B、C、D,经过透视投影后仍然共线,且交比保持不变。数学上写成 CR(A,B;C,D) = (AC·BD)/(BC·AD) = CR(A',B';C',D'),其中 AC、BD 等均为线段长度,在图像平面和世界平面分别测量,比例关系在投影变换前后保持一致。

所谓双重交比,就是把这条原理用两次。第一次利用棋盘格上已知三维坐标的角点,算出激光条纹中心线与棋盘格某行角点连线的交点坐标;第二次在该交点所在的直线上再任取一点,利用交比反算出它的三维世界坐标。这个做法的关键价值在于:不需要知道振镜转轴在世界坐标系下的精确位置,不需要激光平面与靶标有严格的几何约束,只要棋盘格角点能被亚像素提取出来,标定点的图像坐标和世界坐标就能一一对应。

2.2 标定数据采集的硬件配置

标定点获取环节的硬件包括 CCD 相机、线激光器、单轴振镜和一维电动平移台。棋盘格标定板固定在平移台上,平面与移动方向垂直。关闭激光器拍一帧棋盘格图像,以左上角角点为原点建立世界坐标系,此时靶标平面上所有角点的 zw = 0。打开激光器,调节曝光让条纹清晰均匀,把此时的光平面出射角记为 0,然后改变振镜控制电压,依次采集转角为 θ、2θ、3θ…nθ 的条纹图像,n 不小于 6。

论文试验配置比较有参考性,具体参数整理如下:

配置项参数值
棋盘格标定板9×12 格,方格尺寸 10mm×10mm
平移台行程0~75mm,共移动 5 次,每次 15mm
振镜转角每个位置转动 5 次,每次 1.2°
激光条纹图像36 幅
最终标定点数4326

采集时平移台移动次数 m 不小于 4,振镜转角次数 n 不小于 6,目的是让 z 方向和角度方向都有足够采样密度。若转角采样太稀,网络在转角维度上的插值误差会明显增大;若深度位置太少,z 方向的映射关系学不完整。

2.3 标定点坐标的计算步骤

对棋盘格图像用 Harris 算子做亚像素角点提取,得到角点 A_i、B_i、C_i 的图像坐标,其三维世界坐标由标定板物理尺寸直接给出。对线结构光图像,用灰度重心法提取条纹中心线,再通过最小二乘拟合得到中心线方程 D1D2D3。联立中心线方程与棋盘格某行角点所在直线方程,求出交点 D1 的图像坐标,然后套用一次交比不变原理得到 D1 的三维世界坐标。

单次计算出的 D1' 误差往往偏大,论文的处理办法是取棋盘格同一行的多个角点轮流作为 A_i、B_i、C_i 反复计算,把多次结果平均,从而把角点检测和条纹提取的随机误差压下去。下面用 Python 代码演示交比计算的核心逻辑。

import numpy as np def compute_cross_ratio(p1, p2, p3, p4): # 计算共线四点 A,B,C,D 的交比 CR(A,B;C,D) # p1..p4 为 numpy 数组,坐标为 [x, y] ac = np.linalg.norm(p3 - p1) bd = np.linalg.norm(p4 - p2) bc = np.linalg.norm(p3 - p2) ad = np.linalg.norm(p4 - p1) return (ac * bd) / (bc * ad) # 图像平面上:棋盘格行线与激光条纹中心线交于 D1 A_img = np.array([120.3, 340.1]) # 棋盘格角点 A B_img = np.array([260.4, 342.0]) # 棋盘格角点 B C_img = np.array([398.6, 343.8]) # 棋盘格角点 C D1_img = np.array([180.2, 341.1]) # 条纹中心线与该行直线的交点 # 计算图像平面上 CR(A,B;C,D1) cr = compute_cross_ratio(A_img, B_img, C_img, D1_img) print(cr) # 该值应与世界坐标系下对应四点的交比一致

这段代码只完成了交比计算的一半。得到图像平面的交比值 CR 后,还需要把它代入世界坐标系下的直线方程,利用 A、B、C 三个角点的已知三维坐标反解 D1 的三维坐标,不能用单一交比值直接线性外推。工程实现时,我一般先把三个世界角点拟合成一条空间直线,再把 CR 映射到该直线的参数 t 上,最后插值出交点坐标。

3. BP 神经网络映射模型的构造与训练

3.1 输入输出维度的设计依据

振镜式线结构光系统的成像模型由透视投影方程描述,中间耦合了相机内参、外参、振镜坐标系到世界坐标系的转换矩阵,参数多且相互关联。传统做法是用优化算法求解这些参数,但目标函数非凸,初始值敏感,迭代过程容易落入局部极小值。BP 神经网络是典型的多层前馈网络,不关心参数的具体物理含义,只拟合输入到输出的映射关系。

输入层设计为 3 个节点:图像坐标 u、v 和光平面转角 θ。输出层为 3 个节点:X、Y、Z。这里的关键是 θ 必须参与输入。如果没有 θ,网络只能表达一个固定光平面下的映射,振镜一转就失效;加入 θ 后,整个扫描空间的坐标关系被压缩到一个网络里,测量时任意转角都能给出预测。相机内参畸变也不需要单独标定,畸变影响已经被标定点的图像坐标隐含地带入训练样本,网络自己学掉了。

3.2 网络结构、激活函数与训练参数

隐含层选单层,节点数按经验公式 n = sqrt(m + t) + a 计算,m 与 t 分别是输入输出节点数,a 取 1 到 10 之间的常数,论文最终确定为 10。隐含层激活函数用 Sigmoid,输出层用 Purelin 线性函数,输出层保持线性是为了让网络的预测值不落在有界区间内,否则坐标会被截断。训练算法用 Levenberg-Marquardt,它结合了高斯-牛顿法和梯度下降法的特点,收敛快,适合 4326 个样本这种中小规模回归问题。目标误差设为 1e-4,最大迭代 1000 次,实际 571 步完成训练。

下面是直接用 MATLAB 神经网络工具箱复现的代码。

net = feedforwardnet(10, 'trainlm'); % 10 个隐节点,LM 算法 net.layers{1}.transferFcn = 'logsig'; % 隐含层 Sigmoid 激活 net.layers{2}.transferFcn = 'purelin'; % 输出层线性激活 net.trainParam.epochs = 1000; % 最大训练次数 net.trainParam.goal = 1e-4; % 训练目标误差 % 输入按列组织为 3 x N 矩阵:u, v, theta X_train = [u_train'; v_train'; theta_train']; % 目标按列组织为 3 x N 矩阵:X, Y, Z Y_train = [x_train'; y_train'; z_train']; [net, tr] = train(net, X_train, Y_train); save('galvo_calib_net.mat', 'net');

训练完成后的网络权重和阈值就是标定结果。测量时把当前条纹中心点的像素坐标和振镜转角拼成 (u, v, θ) 送入网络,输出即为系统世界坐标系下的三维坐标。这里要提醒一点:feedforwardnet 默认数据按列组织,行代表维度,列代表样本,第一次用很容易把转置搞反,训练前先用 size() 仔细确认矩阵方向。

3.3 数据归一化与训练集划分

图像坐标 u、v 通常是几百到几千像素,光平面转角只有几度到几十度,三维坐标是毫米量级,三个输入的量纲差异很大。如果直接喂给 Sigmoid,输入稍大就会进入饱和区,梯度消失,训练基本不收敛。常见做法是用 mapminmax 把输入输出统一映射到 [-1, 1],训练完成后再反归一化回物理单位。

[X_norm, ps_in] = mapminmax(X_train, -1, 1); [Y_norm, ps_out] = mapminmax(Y_train, -1, 1); net = train(net, X_norm, Y_norm); % 测试时同样先归一化输入,再反归一化输出 Y_pred = sim(net, X_test_norm); Y_pred_real = mapminmax('reverse', Y_pred, ps_out);

提示:ps_in 和 ps_out 必须跟着网络一起保存,现场推理时要用同一组参数做变换,不能用新的均值方差重新归一化。

样本分配上,论文从 4326 个点中随机抽 300 个做测试集,其余做训练集。随机抽样这一步值得坚持:如果按采集顺序切分,训练集和测试集可能来自同一个平移台位置,误差会被低估。更好的做法是手动打乱后按转角分层抽样,保证每个转角下都有训练样本和测试样本。

4. 标定试验、精度验证与误差来源分析

4.1 网络预测精度评估

训练完成后,测试集 300 个样本的预测值与真实值对比,前几个样本的典型结果如下。

样本预测 X(mm)真实 X(mm)预测 Y(mm)真实 Y(mm)预测 Z(mm)真实 Z(mm)
137.42137.39727.06727.06619.93920.000
2128.494128.525-9.098-9.14579.93380.000
381.83681.82625.09725.0590.0950.000
437.50337.49452.90552.88120.06220.000
553.46453.46914.32414.299-0.0460.000
631.62631.5922.7142.66479.95980.000

全部测试样本统计后,X、Y、Z 三个方向的均方根误差分别为 0.018mm、0.013mm 和 0.104mm。X 和 Y 方向误差明显小于 Z 方向,这符合线结构光系统的几何特性:Z 方向对应激光照射深度,条纹中心提取误差和平移台定位误差都会沿深度方向放大。测试集误差只能说明插值能力,真正反映标定质量还要靠独立物体验证。

4.2 标准球验证结果

论文用直径 20mm 的陶瓷标准球做独立评估,把标准球放在标定空间内 10 个不同位置,扫描得到点云后用 Geomagic 拟合球体。

序号拟合直径(mm)拟合 RMSE(mm)
119.9650.096
219.9780.101
319.9820.138
419.9850.119
519.9860.125
619.9920.128
720.0100.112
820.0240.132
920.0570.117
1020.0610.145

10 次测量平均直径 20.004mm,与标准值只差 0.004mm,整体拟合 RMSE 为 0.032mm。直径误差范围在 -0.035mm 到 +0.061mm 之间,最大偏差出现在第 10 个位置,位于测量范围边缘,说明网络在训练样本稀疏区域的泛化能力会下降。这个精度水平对于一般工业零件的尺寸检测完全够用。

4.3 误差来源的层次分析

误差首先来自标定器件本身的制造和定位精度:棋盘格标定板光学打印尺寸偏差小于 0.006mm,电动平移台重复定位精度 3μm,这两项在数据采集阶段就混入训练样本。其次是振镜转角误差:振镜控制电压与反射镜转角只是近似线性,线性度偏差会直接加在 θ 输入上,网络把这个偏差当作真实转角学习,最终反映到预测坐标上。

条纹中心线提取精度是另一个重要误差源。灰度重心法对条纹亮度和宽度比较敏感,如果被测表面反光不均匀,中心位置会出现系统性偏移。论文中使用了两次交比不变原理,棋盘格角点提取误差会沿着两次交比计算逐步累积,这也是 z 方向误差偏大的直接原因之一。

4.4 与数学建模标定法的对比

论文引言部分梳理的已有方法各有局限:龚晓亮的方法只能标定若干确定角度下的光平面,通用性差;Chi S. 的共面法假设所有光平面交于振镜转轴轴线,装配误差一上来这个前提就不成立;Yu C. 的螺旋理论方法要求初始光平面与转轴相交,还得知道转轴上控制点的三维坐标,现场操作非常严格。这些方法共同的问题是依赖系统装配精度,标定过程繁琐,换一个振镜或相机就要重新推导模型。

神经网络方法把标定问题从参数估计变成函数拟合,不需要知道振镜转轴位置,不需要单独标定相机内参,畸变影响也被网络一并吸收。这种黑箱思路在机器人视觉里并不陌生,和手眼标定里用神经网络直接映射机械臂末端位姿到相机坐标的做法同源。代价是放弃了物理模型的可解释性,换来了更简单的部署流程和基本相当的精度。

5. 现场标定的工程化要点与边界条件

5.1 数据采集的几何约束

最容易犯的错误是棋盘格平面与平移台移动方向不垂直。靶标平面一旦带俯仰角,每个平移位置的局部世界坐标系就会旋转,整个训练集的三维坐标系统性扭曲,网络学到的映射自然偏掉。我一般会在每个平移台位置提取棋盘格全部角点,拟合角点平面,检查平面法向量与平移台运动方向的夹角,控制在 0.1° 以内再继续采集。

5.2 条纹中心线提取方法的选择

灰度重心法适合条纹亮度均匀的场景,对强反光和漫反射不均的表面不够稳。更常见的做法是先阈值分割剔除背景,再逐行计算灰度重心;如果条纹在曲面边缘明显弯曲,改用 Steger 算法,通过 Hessian 矩阵求条纹法向,沿法向精化中心位置。平面类零件用灰度重心法加最小二乘直线拟合就够了,自由曲面零件建议直接上 Steger。

5.3 网络超参数的调整顺序

复现这套方法时,我一般把调参顺序固定为:先保证标定点数量超过 3000 且覆盖完整测量空间,再调整隐含层节点数,从 8 个开始逐步增加到 15,观察测试集 RMSE 是否进入平台期。如果训练到最大迭代次数仍未达到目标误差,优先检查输入输出有没有归一化,其次检查是否有个别样本的坐标明显偏离拟合平面。隐含层节点不是越多越好,节点太多会把条纹提取噪声一起学进去,泛化反而变差。

5.4 泛化边界与残差校正

网络预测精度只在数据采集空间内部有保证。一旦测量目标超出平移台行程或振镜转角范围,输出会迅速发散。被测物体表面法向与棋盘格平面夹角过大时,激光条纹在物体表面的散射形态改变,中心提取精度下降,也会拉低测量精度。对于要求更高的场景,可以在 BP 网络后面串一个高斯过程回归校正层,用 BP 输出与真实坐标的残差训练第二个模型,实测能把 Z 方向 RMSE 再降 20%~30%,而且不需要重新采集标定数据。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询