参数错一点点,像素错多少。这一页把误差分成两类,给出两条式子, 然后把"看到什么症状去查哪个自由度"变成一张可以照着查的表。
假设焦距 933 像素、图像 1920×1080、目标在 3 米处:
| 误差来源 | 大小 | 像素偏移 |
|---|---|---|
| 相机转了,绕竖直轴 | 0.5° | 8.15 px |
| 相机装偏了,垂直于光轴 | 1 cm | 3.11 px |
| 相机和雷达时间差,车速 10 m/s | 33 ms | 102.68 px |
这三个数不是量出来的,是算出来的。算法只有两条式子,而且它们完全不同。
角度类:Δu = fx · Δθ
不出现距离 Z,所以【跟目标多远无关】
位移类:Δu = fx · Δt / Z
除以 Z,所以【越远越小】
时间差:等价于一个位移 Δt = v · Δt
所以它也是位移类,只是那个位移往往很大
公式里面真正进入像素的,是方向,也就是 X 除以 Z。
旋转改变的是方向,所以它跟距离无关。平移改变的是位置,要再除以 Z,所以它随距离衰减。
一句话:方向不带距离,位置才带。
| 误差 | 3 米处 | 50 米处 |
|---|---|---|
| 转 0.5° | 8.15 px | 8.15 px,不变 |
| 偏 1 cm | 3.11 px | 0.19 px,掉到 1/16 |
| 时间差 33 ms | 102.68 px | 6.16 px,也掉到 1/16 |
近处:时间 > 旋转 > 平移
远处:旋转 > 时间 > 平移
所以"哪个误差最要命"这个问题,没有距离就没有答案。 近处看位移类,远处看角度类,也就是标定。
光看大小不够,还要看它在画面上长什么样。形状只有两类,而且指向完全不同的自由度。
| 自由度 | 画面上的效果 | 中心 |
|---|---|---|
| 偏航、俯仰 | 整幅画面一起平移 | 跟着动 |
| 横向平移 | 整幅画面一起平移 | 跟着动 |
| 时间差 | 整幅画面一起平移 | 跟着动 |
| 绕光轴旋转 | 原地旋转 | 不动 |
| 焦距误差 | 等比缩放 | 不动 |
| 沿光轴平移 | 缩放 | 不动 |
| 畸变欠补偿 | 越往外弯得越多 | 不动 |
整幅平移类:中心也错,全画面一样。
绕中心类:中心永远对,越靠边越错。
所以第一个问题不是"差多少像素",是"中心的框准不准"。
用那条熟式子看:u − cx = fx · tanθ。焦距错了一点,等于乘错了一个比例尺。
中心的光线 tanθ = 0,乘什么都是 0,所以中心不动
边缘的光线最斜,乘出来误差最大
而"乘一个常数"是等比缩放,所以【直线还是直的】
这条性质很有用:焦距错不弯直线,畸变错才弯直线。 前者是一个常数因子,后者是一个随半径变化的因子。 把图形放大一倍,直线还是直线;把图形按半径不均匀拉伸,直线就弯了。
| 看到的现象 | 指向 |
|---|---|
| 整幅平移,各处一样,与距离无关 | 偏航或俯仰 |
| 整幅平移,近处多远处少 | 横向平移 |
| 中心对,越靠边越错,直线仍直 | 焦距,或者沿光轴平移 |
| 中心对,越靠边越错,直线弯了 | 畸变 |
| 画面整体歪了,中心不动 | 绕光轴旋转 |
| 静止时准,运动时偏 | 时间同步 |
| 整幅像是被放大了一点点 | 焦距 |
焦距误差和畸变欠补偿,在现象上几乎一样:都是中心对、边缘错、不随距离变。
因为它们在标定里是强耦合的:把焦距调大一点、把畸变系数调小一点, 在标定点上的结果几乎不变。
光看重投影误差的数字,分不开这两个。
| # | 实验 | 分开什么 |
|---|---|---|
| ① | 拍一条直线,看它直不直 | 常数倍是焦距,变倍是畸变 |
| ② | 把标定板挪到画面边缘,重算重投影误差 | 边缘误差大说明标定没覆盖到那儿;边缘也小说明标定没问题,是使用方式错了 |
| ③ | 看四个角是不是一样差 | 一样差是径向,某个方向差得多是切向 |
它是拿标定板上那些角点算出来的。如果标定板只铺了画面中心, 那 0.3 像素只证明了中心很好,边缘从来没被约束过。
所以看到"边缘差 20 像素"和"报告 0.3 像素"同时出现,不必惊讶。 它们说的是两件事:一处是范围内的,一处是范围外的。
这也意味着区分两种完全不同的病:
| 病 | 症状 | 修法 |
|---|---|---|
| 精度不够 | 中心也不好 | 改善标定质量 |
| 覆盖不够 | 中心好,边缘差 | 扩大靶标覆盖范围 |
同一份误差,能不能被发现,取决于画面里有没有一个已知的参照。
鱼眼和广角的像圈边界是天然的参照物:它的位置就是这颗镜头最大视场角对应的像素位置。
投一条角度正好等于最大视场角的光线,它必须落在边界上。偏了就是偏了,而且能看出偏哪边。
满幅的普通镜头没有这个福利,只能自己去找直线和直角当参照。
误差只有两类:整幅平移,和绕中心。第一类看中心准不准就能分,第二类看边缘。
大小取决于两个变量:焦距和距离。角度类只跟焦距有关,位移类还要除以距离。
诊断的顺序是:先看形状定类别,再看是否随距离变,最后用三个实验把耦合的那两个分开。