一个由于相机畸变参数导致的奇妙现象
Intro
假设现有多视角相机3个, 空间某点 X 在第1,2个相机的投影分别为 x1 和 x2, X不在第3个相机的视野范围内, 故在相机3的像上应该没有对应点.
然而, 当我们按照相机参数把 X 投影到第3个相机时, 奇妙的事情发生了, 由X投影到图像得到的坐标居然在图像的范围内!
那么, 问题出在哪里?
A Demo
以下是我们项目中实际使用的相机的内参.图像尺寸为 1920×1080.
f=1061
cx=960
cy=540
畸变参数为:
k = [-0.33, 0.12, -0.022]
那么, 实际的畸变系数为:
kk=1−0.33r2+0.12r4−0.022r6(1)
由于相机镜头畸变, 导致坐标从相机坐标系
通过内参转换到uv坐标系
时, 要乘以系数kk.
若仅考虑x轴方向, 则
u=f⋅(kk⋅x)+cx(2)
为简化问题, 我们仅考虑 r=x 的情况, 将式(1)代入式(2), 得到
u=1061⋅[1−0.33x2+0.12x4−0.022x6]⋅x+960(3)
以上, 得到了uv坐标系
与相机坐标系
的坐标换算关系. 已知图像宽度1920, 也就是u∈[0,1920].
式(3)的函数图像如下图
图1 图像uv坐标与相机坐标关系图
当 u=0 时, 3个实根为 (−1.64,−1.38,2.23);
当 u=1920 时, 3个实根为 (−2.23,1.38,1.64).
从图和根之间大小关系可知, 当 u∈[0,1920] 时, x 的范围大致为 [−2.23,+2.23] (其中有些小区间不严格满足).
再根据 焦距 f 和 cx 可知, 当x<1060960≈1 时, 点才在实际图像范围内. 但由于畸变参数的影响, 当 x∈[−2.23,+2.23] 都能使得到的像点在图像成像/视野范围内.
Summary
以上的例子已经很具体的说明了「鬼影」的成因.
回到问题的本质, 其实还是由于相机畸变模型本身存在的缺陷导致的. 径向畸变的第二和三个参数分别是距离的4次方和6次方的系数, 当距离增大时, 这些项急剧地变化, 导致算出来地相机畸变补偿系数严重偏离真实的值. 相机的畸变模型应用范围是局限相机成像范围内的, 当脱离了这个前提, 事情就开始变得丑陋了.
畸变对于投影相机模型来说, 是一个外挂的存在, 破坏了原本流畅美丽的投影关系变换. 对于计算基础矩阵以及进行 Triangulation 等任务也非常头疼, 事先把图像的畸变校正掉, 会省去自己很多的麻烦.
Appendix
图2 相机畸变系数曲线图.
当x在相机视野范围内时, 曲线变化较平缓, 当x逐渐远离相机视野时, 曲线变化剧烈, 畸变系数已经不能反应实际的畸变情况
Reference