用一次高精度参照物标定,把 LiDAR 的测距误差校掉,之后每次只靠 LiDAR 测距就能获得接近标定法的精度。

这在工程上是完全可行的,下面给出具体的数学模型和实现建议。


1. 为什么可行:标定法“教会”系统什么是准确

假设你已有系统内参 fx,fyf_x, f_y(来自 AVCameraCalibrationData,误差通常在 1% 以内)。
标定时,用户放置参照物,你得到:

  • 参照物真实长度 LmmL_{mm}
  • 参照物在图像中的像素长度 LpxL_{px}
  • 同一区域内 LiDAR 深度图的平均深度 DlidarD_{lidar} (米)

标定法计算的精确比例尺:
ktrue=LmmLpx(mm/px)k_{true} = \frac{L_{mm}}{L_{px}} \quad (\text{mm/px})

如果 LiDAR 完全准确,理论比例尺应为:
klidar=Dlidar1000fx(mm/px,假设 fyfx)k_{lidar} = \frac{D_{lidar} \cdot 1000}{f_x} \quad (\text{mm/px,假设 } f_y \approx f_x)
(严谨写应该是 D1000fx\frac{D \cdot 1000}{f_x},单位 mm/px)

由于 LiDAR 不准,ktruek_{true}klidark_{lidar} 会有一个比值:
α=ktrueklidar=Lmm/LpxDlidar1000/fx\alpha = \frac{k_{true}}{k_{lidar}} = \frac{L_{mm} / L_{px}}{D_{lidar} \cdot 1000 / f_x}

这个 α\alpha 就是你一次标定得到的深度校正系数


2. 后续如何自动测量

之后每次拍摄,你不再需要参照物。只要从 LiDAR 获取缺陷区域的平均深度 DlidarD'_{lidar},就可以算出校正后的比例尺:
k=αDlidar1000fxk' = \alpha \cdot \frac{D'_{lidar} \cdot 1000}{f_x}
缺陷面积(使用平坦缺陷假设的快速算法):
Adefect=N(k)2(mm2)A_{defect} = N \cdot (k')^2 \quad (\text{mm}^2)
或用逐像素积分更精确。

如果缺陷不在同一平面上,可逐像素使用深度值,并对每个像素的 ZZ 都乘以校正系数 α\alpha,即
A=(αZ(u,v))2fxfyA = \sum \frac{(\alpha \cdot Z(u,v))^2}{f_x \cdot f_y},其中 ZZ 为米。


3. 这个方案依赖的前提

前提 满足程度
LiDAR 误差主要是固定的尺度偏差(对所有距离成比例或有一固定偏置) 大概率满足:iPhone LiDAR 的系统误差常表现为整体偏大/偏小一个比例,尤其在平整表面
标定时的表面材质与后续被测缺陷材质类似 影响较大:玻璃、黑色塑料等会导致 LiDAR 空洞,此时校正系数无意义
拍摄角度基本不变(或可接受透视误差) 和你的标定法要求一致

如果满足以上条件,这种方法通常能把误差从标定前的 5%–10% 降到 1%–3%,非常接近纯标定法的水平。


4. 进阶:如果不想依赖 LiDAR 的一致性,还可做什么?

  • 分段校准:让用户在不同距离(如 20cm、40cm、60cm)各标定一次,你保存一组 α\alpha 值,后续根据深度自动插值。
  • 自动检测是否需要重新标定:当 LiDAR 空洞比例过高时,提示用户使用纯标定法。
  • 场景记忆:用户可保存“桌面场景”“墙面场景”等标定数据,切换场景后可快速调用对应的 α\alpha

UI 上可提供“智能标定模式”:首次提示用户放参照物,之后自动运行;同时保留手动标定法作为备选。


5. 总结

“一次标定 + LiDAR 测距”可以让 LiDAR 机型既享受自动化便利,又获得接近标定法的高精度,前提是 LiDAR 的误差形式稳定且不出现大量空洞。 对于你的 App 来说,这可以作为第三种测量模式,进一步提升用户体验。