OpenCV 尺度与公差:怎样判断测量是否可信
检测到一枚长度 200 px 的螺钉,就能判断它符合 20 mm 规格吗?还缺至少两件事:这次拍摄下的像素尺度,以及“20 mm 附近多大的偏差被接受”的配方。更早的分割、截断和方向问题也可能使这个数值没有判定意义。
本文对应 ScrewMetrology 6782dfd 的尺度、公差与评价实现,实验使用 C++17 / OpenCV 5.0.0。返回系列导读。
1. 两点尺度解决的是受限条件下的换算
选择两个参考点,其像素距离是 d,已知物理距离是 L,则:
1 | mm_per_px = L / d |
项目要求参考点有限且在图像内、距离至少 1 px、毫米距离为正,加载文件时会重新计算尺度并检查一致性。过短参考距离会放大选点误差。
适用前提是固定拍摄设置、同一测量平面和近似正视。分辨率相同只是必要条件,不能自动证明焦距、距离、裁切和工件平面都相同。单个比例系数不会修正镜头畸变和透视变化。
1.1 在合成图上验证换算链路
完成导读的构建后,在项目根目录执行:
1 | build/screw_metrology calibrate-scale \ |
200 px 对应 20 mm,得到 0.1 mm/px。这是人为规定的合成尺度,验证软件换算和判定流程;它不是一次实物标定,也不能证明相机测量达到某个毫米精度。
2. 公差判定之前先检查前提
项目先选择有效亚像素尺寸,否则逐项使用像素结果,再按以下顺序检查:
1 | 是否为单规格模式? |
--mode single 表示使用者确认按单规格检验,不是自动识别了工件型号。配方上下界包含边界。至少一项必需尺寸缺失时保持 NOT_EVALUATED,即使其他项已经越界,也不声称完成了整份配方的检验。
| 状态 | 含义 | 常见原因 |
|---|---|---|
OK |
所有配置项均可测且在范围内 | all_configured_limits_passed |
NG |
判定前提满足,存在越界项 | 某尺寸 out_of_range |
NOT_EVALUATED |
无法完成可靠判定 | 无配方、尺度不适用、几何不可靠、尺寸缺失 |
混料展示模式、没有配方和无尺度不是同一个问题。检查 reasons,避免把所有未判定都通过放宽尺寸上下界“修好”。
3. 不可测字段为什么保留 null
头杆结构不明显时,头长、头宽或杆宽可能不可测。如果把缺失转换为 0,一个只设置上限的配方就可能错误通过。输出中的 null 保留信息缺失,毫米换算也应继续保留缺失。
同样,分辨率不一致会使尺度失效;无尺度时仍然可以输出像素测量和质量信息。展示有结果与检验有结论是两个层次。
4. 用失败样例检查判定的边界
1 | build/screw_metrology measure --input data/synthetic/edge_cases/truncated.png \ |
截断目标可能仍有可见长度,粘连目标可能仍有稳定旋转框,但都应结合 reliable、quality_issues 和 reasons 检查未判定行为。没有目标时应输出空对象集合,坏图应记录错误;不能把二者当作“零尺寸合格”。
5. 三类评价分别回答三个问题
5.1 定位评价:是否找到正确工件
真实 MVTec 数据使用旋转框 IoU≥0.5 降序一对一匹配,统计 TP、FP、FN:
1 | precision = TP / (TP + FP) |
仓库 2026-10-03 冻结报告的 384 张图像有 4427 条标注,TP=3743、FP=750、FN=684,对应 83.31% 精确率和 84.55% 检出率。官方数据页面与实际包的标注数量差异在报告中保留说明。
中心与方向误差只统计成功匹配目标;方向按 180° 周期计算并排除近圆真值框。这些数字不能描述漏检目标的定位误差,更不能替代毫米精度。
5.2 尺寸评价:与几何真值相差多少
用独立几何真值计算有符号误差、MAE 和最大误差:
1 | eᵢ = measurementᵢ − truthᵢ |
合成图可以提供精确几何真值,方便检查旋转、离散轮廓、亚像素及降级路径。报告应说明哪些字段和样例缺失,不能只统计成功细化的尺寸再宣称整体精度。
5.3 重复性评价:相同条件下波动多大
项目的 30 次固定形状叠加模拟噪声实验测的是模拟重复性。真实相机还会受到照明、装夹、焦距、操作者及温漂影响。小标准差不表示没有系统偏差,也不表示真实重复性或 GR&R 已经验证。
6. 从像素到毫米的误差传播
设尺度 k=L/d、像素尺寸为 p,毫米结果 M=kp。在变量独立且误差较小时,一阶近似为:
1 | Var(M) ≈ k² Var(p) + p² Var(k) |
这个式子用于理解影响,不是完整不确定度报告。尺度与像素测量可能相关,透视和畸变可能产生位置相关的系统误差。增加像素结果的小数位并不能降低参考距离误差。
若物理尺度随位置变化,下一步应考虑相机标定和测量平面映射;如果需要把视觉结果交给机械臂,再考虑手眼标定。它们不能被一个 mm_per_px 替代。