返回专辑
·Johan·3 分钟阅读

重投影误差:单位是像素

BA 最小化加权像素 reproj;Huber/Cauchy 核和外点权重要配合,RMS 小不代表 3D 结构对——错配点也能低 cost。

重投影误差:单位是像素

1. 先看单位,再看数字

光束法平差日志均方根零点三——听起来很好,直到发现有人把角度当像素,或物点用毫米、平移用米。重投影误差的契约是像素:投影函数把三维点投到图像平面,与观测的差以像素计。单位混用时代价仍可小,但位姿和地图解释全错。看平差日志第一步永远是确认单位是像素,第二步才是看数值好不好。

2. 目标函数

最小化带鲁棒核的加权重投影平方和。投影即 OpenCV 投影点函数;鲁棒核常用 Huber 或 Cauchy。OpenCV 无完整光束法平差,但位姿解算细化和 g2o、Ceres 最小化同一重投影:

python
proj, _ = cv2.projectPoints(obj_pts, rvec, tvec, K, dist)
err = np.linalg.norm(proj.reshape(-1, 2) - img_pts, axis=1)
rms = np.sqrt(np.mean(err**2))  # 单位:像素

单目光束法平差时三维点坐标也要优化(除锚点);纯位姿平差假设地图固定——可观性和收敛域不同。Ceres 和 g2o 的边都在最小化同一量,只是稀疏结构和自动求导不同。

3. 权重与信息矩阵

二维信息矩阵典型对角、方差零点五到二像素。视场边缘点权低(畸变大);远点不确定大,权低;多相机各用各的方差。卷帘快门行方向噪声更大时可各向异性加权——行方向方差大、列方向方差小。不同相机、不同区域共用同一权重会让边缘和中心点同等拉扯,地图在视场边缘常歪。

4. 鲁棒核必开

纯平方损失会被外点拉偏——回环错配、二维三维语义错配、重复纹理误匹配都能内点多但地图歪。Huber 阈值常设一到二像素;Cauchy 更激进压外点。报告时分开鲁棒代价和内点原始均方根,别只报一个数。代价降但地图歪,常见原因是错误回环;低均方根错度量,常见原因是内参错或错配。

大场景导出轨迹到 Colmap 或 g2o;局部位姿解算细化是迷你平差。回环要本质矩阵加正深度验证,不能单靠重投影低就接受。

5. 留出与卡方

报告内点率、鲁棒权重分布、各相机各区域均方根。留出视角不参与平差的重投影才是泛化指标——训练视角均方根低只说明过拟合观测。图优化边卡方和 OpenCV 投影误差应同量级;差一个数量级通常是单位或内参用错。

6. 案例:低均方根错度量

某次单目同时定位与建图报告重投影均方根零点四像素,但度量留出漂移百分之二。根因是焦距少了一位小数——在错误内参下重投影仍小,因为优化把三维点拧来拟合错投影。修正内参后均方根升到零点八像素,但度量对了。低均方根不是度量真理的充分条件;上线要看留出视角和 temporal 一致性。

7. 与回环和现场

回环边是外点重灾区,鲁棒核和几何验证缺一不可。现场 log 内点数和重投影均方根时,异常先查单位(像素对归一化坐标)再查算法。我会把 Huber 阈值和内点均方根分开打 log,避免运维只看一个「误差小」。

8. 验收

  • 内点率加鲁棒权重分布
  • 各相机各区域均方根(像素,注明单位)
  • 留出视角重投影(不参与平差)
  • 图优化卡方与 OpenCV 投影交叉验证
  • 回环:本质矩阵加正深度加时间一致性

重投影是二维可观测的代理。像素对了,还要度量留出和时间一致才放心上线。

← 全部文章

johan's blog