我们知道,摄像头在进行图像拍摄时,最理想的位置是能垂直与拍摄平面的,这样能保证图像能按照原来的几何比重重现。然而在智能驾驶汽车的实际应用中,受到智能车车体结构的限制,车体控制要求摄像头有一定的预瞄距离,摄像头的水平和垂直扫射面通常是成扇形扩张的,且摄像头与地面一般成一定角度安装。这种角度的存在会在图像边缘处造成一定的成像畸变。畸变的结果是在后期图像处理过程中产生一系列如下的类似问题:
1)垂直线被拍摄成斜线导致斜率计算错误;
2)远处的弯道可能由于畸变被压缩导致曲率计算错误等等;
3)对于旁车道车辆状态在识别过程中产生严重的畸变,在后期处理的时候会存在匹配不上的问题;
诸如上面各类问题都是可能存在在整个图像感知中,如果畸变处理不得当会对整个图像质量和后续神经网络识别造成较大的风险。为了满足智能车的实时控制需求,一般需要在实际应用场景中针对摄像头图像畸变提出相应的矫正算法。
智能汽车主要的畸变种类
相机畸变包含径向畸变、切向畸变、离⼼畸变、薄棱镜畸变等,智能汽车上的相机畸变主要有径向畸变和切向畸变。
径向畸变分为桶形畸变和枕型畸变。
通常我们智能泊车系统一般采用的环视摄像头由于采用广角拍摄,其对应的畸变类型通常是径向畸变。径向畸变产⽣的主要原因是镜头径向曲率的不规则变化,它会导致图像的扭曲变形,这种畸变的特点是以主点为中⼼,沿径向移动,离的距离越远,产⽣的变形量就越⼤。对于⼀个矩形的严重径向失真需要被较正成理想线性镜头的图像才可以进入后端处理过程。
而行车系统一般采用的前视、侧视、后视摄像头由于采用一般的CMOS工艺摄像头进行拍摄,且由于前侧视摄像头安装过程中可能不能保证透镜与成像面严格平行,同时也可能是由于制造上的缺陷使透镜不与成像平面平行,从而产生切向畸变,这种现象通常发⽣于成像仪被粘贴在摄像机的时候。
径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5*1的矩阵,依次包含k1、k2、p1、p2、k3,经常被定义为Mat矩阵的形式。
对于畸变矫正来说,这5个参数就是相机标定中需要确定的相机的5个畸变系数。参数k1、k2、k3被称为径向畸变参数,其中k3是可选参数。对于畸变严重的相机(如⻥眼相机),可能还会有k4、k5、k6。切向畸变可以用两个参数p1 和 p2 来表示:至此,得到了共五个参数:K1、K2、K3、P1、P2,这五个参数是消除畸变所必须的,称为畸变向量,也叫相机外参数。
因此,求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真,下图显示根据镜头畸变系数校正后的效果:
通过5个畸变系数找到这个点在像素平面上的正确位置公式如下:
畸变后的点可以通过内参矩阵投影到像素平面,得到该点在图像上的正确位置(u,v):
图像畸变矫正方法
与相机模型方法论不同,图像去畸变是为了补偿透镜缺陷,对原始图像进行径向/切向去畸变,之后在使用该相机模型。处理图像畸变的方法主要涉及选择何种相机模型进行图像投影。
典型相机模型投影方式有球面模型和柱面模型。
1、鱼眼相机成像畸变矫正
通常类似鱼眼镜头会产生极大的形变,比如普通相机成像过程中,直线投影到像平面上还是一定大小的直线,但是鱼眼相机拍摄的图到像平面上则会变成非常大且长的直线,甚至部分场景下直线检测会被投影到无穷大,因此针孔模型无法为鱼眼镜头建模。
为了将尽可能大的场景投影到有限的图像平面内,鱼眼镜头一版由十几个不同的透镜组合而成,在成像过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。
研究表明鱼眼相机成像时遵循的模型近似为单位球面投影模型。这里我们为了更好的适配相机针孔模型的推导过程,常用的方法是采用投影到球面相机模型过程来进行。
对于鱼眼相机成像过程的分析可以分成两步:
三维空间点线性投影到一个球面上,当然这个球面是我们假设的虚拟球面,将其球心看成与相机坐标原点重合。
单位球面上的点投影到像平面上,这个过程是非线性的。
如下图表示了一种智驾系统中从鱼眼相机拍摄变换到球面相机的图像处理过程。假设相机坐标系下的点为X=(x,y,z),像素坐标为x=(u,v)。那么它的投影过程表示如下:
1)第一步是用摄像机采集世界坐标系下的三维点,并将图像坐标系下的成像点投影到归一化单位球面坐标上;
2)将相机坐标中心沿着z轴偏离个单位,得到如下:
3)考虑单位球面,将球面进行归一化为1个单位:
4)将球面投影模型变换到针孔模型上,得到相应的主点坐标,以该主点坐标可以建立对应的标准的相机坐标系模型:
2、柱面坐标投影
对于诸如前视、侧视摄像头这样的终端来说,通常捕获的图像主要产生的是切向畸变。切向畸变通常推荐采用柱面相机模型,其优点是指用户可以获得诸如鱼眼相机的全景图中360度范围内任意切换视线,也可以在一个视线上改变视角,来取得接近或远离的效果,同时,柱面全景图像也较为容易处理,因为可以将圆柱面沿轴切开并展开在一个平面上,传统的图像处理方法常常可以直接使用,柱面全景图并不要求照相机的标定十分准确。用户在水平方向上有360度的视角,在垂直方向上也可以做一定的视角变化,但是角度范围则受到限制,由于柱面模型的图像质量均匀,细节真实度更高,应用范围比较广泛。
总体来说,柱面全景图显著优点归纳为以下两点:
1)它的单幅照片的获取方式比立方体形式和球面形式的获取方式简单。普通车载相机(如前视、侧视摄像头)基本就可以获取到原始图像。
2)柱面全景图容易展开为一个矩形图像,可以直接用计算机常用的图像格式进行存储和访问。柱面形式的全景图在垂直方向允许参与者视线的转动角度小于180度,但是绝大多数应用中,水平方向的360度环视场景足以表达空间信息。
这里我们重点讲下如何利用柱面相机对原图像进行畸变矫正处理的算法,实际上这是个从获得虚拟相机到原相机映射关系的过程。这里的虚拟相机是指针对真实图像到生成柱面图的映射关系。
如下图表示了一种智驾系统中从普通车载相机拍摄变换到柱面相机的图像处理过程。其中,获得虚拟相机图⽚的实质就是求虚拟相机到原相机的映射关系,通⽤的过程如下:
首先,对于前/侧视原始视频图像可以设置为目标图像dst img;其中该目标图上的主点(u,v)为基础点进行2D到3D的逆投影变换到目标相机坐标图上,该目标相机可重构出世界坐标系下的该点位置(x,y,z);随后,在三维坐标系下通过投影变换算法得到虚拟相机下对应的原始相机图像Src Camera;在对该原始相机图像进行3D到2D的投影变换就可以得到对应的矫正后的图像Src img(u’,v’),该图像可通过重构的方式恢复出虚拟相机下的原始图像dst img。
从柱面相机模型可以看出柱面相机模型到针孔相机模型的变换公式如下:
如上公式中,其中u,v表示针孔相机平面主点(也叫像素坐标系中的坐标),fx、fy、cx、cy表示由于制造或安装误差产生的两个坐标轴偏斜参数。该主点乘以圆柱坐标系下的半径距离则可以得到相应的投影在柱面坐标上。
ρ来进行多项式近似,柱⾯相机2D->3D空间的过程中是不确定ρ的,当Tdst=Tsrc时,ρ取不同值时,从3D空间->侧视/前视相机2D求得的虚拟相机的映射是相同的;若Tdst!=Tsrc, 得到的虚拟相机的图像随ρ的不同⽽变化。对于给定的柱⾯图2D位置(u,v),在给定ρ的条件下,由如上公式可以计算dst camera柱面坐标系下的3D的相机坐标xc , yc, zc。
Φ用来进行多项式近似,Φ是入射光线和图像平面的夹角,这个值和鱼眼相机的参数很像。
接下来是相机变换过程,总结起来包括如下过程。
首先设置虚拟相机图像分辨率为想要获取的鸟瞰IPM图的分辨率;其中虚拟相机图像的主点为IPM图分辨率的中心(一般假设不设置偏移)。其次,设置虚拟相机的fx、fy以及相机位置,其中高度设置为1,与fx、fy设置方式相对应,可以根据需求修改y的偏移量。由此,则可以根据目标相机dst camera的外参(R,T)dst,把dst camera相机坐标(xc,yc,zc)dst转化为观测坐标系vcs坐标,随后再结合src camera的外参(R,T)src,将VCS坐标转化为src camera相机坐标(xc,yc,zc)src 。
总结
由于车载相机通常搭载不同的成像镜头,这种多元件的构造结构使得对于车载相机的折射关系分析不能简单采用原来的针孔相机模型进行适配。特别是对于鱼眼相机来说,由于需要扩大可视范围,这种折射率所带来的图像畸变更是明显。本文我们重点介绍了适配于智能驾驶系统各类不同视觉传感器的去畸变方法,主要通过投影方式将世界坐标系下的图像投影到虚拟球面坐标系和虚拟柱面坐标系下,从而依靠2D—>3D的相机变换来去除畸变。部分算法在长期实践基础上相对于经典去畸变算法有所改进。
领取专属 10元无门槛券
私享最新 技术干货