“智能汽车生态群"加微信Time-machine-(备注公司+姓名)
AVM(Around View Monitor),中文:全景环视系统。在自动驾驶领域,AVM属于自动泊车系统的一部分,是一种实用性极高、可大幅提升用户体验和驾驶安全性的功能。AVM已经是一种较为成熟的技术,中高端车型均有部署,但详细讲述AVM系统算法的技术博文并不多。作者在工作中搭建了一套AVM算法框架,有一些效果还不错的demo。撰写本文,主要是想将AVM算法框架中每个算子讲述清楚,与大家共同进步。本博文的风格为理论与实践结合,含有部分代码,适合有一些计算机视觉基础的同学。
关键词:相机联合标定、去畸变、投影变换、鸟瞰图、图像融合、光流、真实感3D模型、纹理映射。
AVM系统概述
AVM汽车环视影像系统如图所示,由安装在前保险杠、后备箱、后视镜上的四个外置鱼眼相机构成。该系统包含的算子按照先后顺序:去畸变、四路鱼眼相机联合标定、投影变换、鸟瞰图微调、拼接融合、3D模型纹理映射等。四路鱼眼捕捉到的图像信息通过上述算子,生成一个2D、3D的全景图。AVM算法又分为离线阶段和在线阶段两部分,在线阶段是对离线阶段的简化,更加适合于工程实现。下面我们来一一讲述。
avm系统示意图
离线阶段算法pipeline
先来粗略浏览下AVM算法Pipeline包含那些算子:
-
2D AVM
2D AVM Pipeline
-
3D AVM
3D AVM Pipeline
1.基于畸变表的鱼眼相机去畸变
1.1鱼眼相机畸变模型
我们知道普通相机和广角相机的投影方式一般为透视投影,即通过三角形相似原理,将相机坐标系下三维世界中的物体投影到平面上,这是基于理想的透视投影模型(无畸变)。但实际情况是我们得到的最终图像与理想的透视投影模型有一些区别,即径向畸变(桶形、枕型)、切向畸变。因此相机标定中都会对畸变做矫正。
鱼眼相机的投影方式有很多种假设,例如等距投影、等立体角投影、正交投影、体视投影、线性投影。但是真实的鱼眼相机镜头并不完全遵循上述的这些模型假设。因此Kannala-Brandt提出了一种一般形式的估计,适用于不同类型的鱼眼相机:
,这个也是纳入opencv中的鱼眼相机畸变模型。对照下图: 为光线入射角,
为出射光线在相机归一化平面上或者在相机成像平面上与O之间的距离(在opencv中
表示光线在相机归一化平面上的成像位置)。
鱼眼相机模型
相机去畸变通常使用张正友老师的棋盘格标定方法,首先通过矩阵推导得到一个比较好的初始解,然后通过非线性优化得到最优解,包括相机的内参、外参、畸变系数,然后对鱼眼图像做去畸变处理。内参即:
相机内参矩阵
然而,张正友标定法并不适用于我们的场景。
1.2基于厂家畸变表的鱼眼图像去畸变
由于张正友老师的棋盘格标定法是在图像的全局进行拟合得到一个全局的最优解,因此需要保证多次拍摄到的标定板的棋盘格可以覆盖整个图像区域。而我们假设的场景为要求汽车整车上流水线进行标定,即相机已经安装在车上。很显然,由于车身遮挡的原因,很难保证上述条件。另外,棋盘格标定法并不适用于批量生产。因此,我们选择了基于厂家提供的畸变表对鱼眼相机图像进行去畸变。相机厂家都有专业的光学工程师,大厂提供的畸变表通常情况下比较准确。当然,也有一些在畸变表的基础上进行优化的方法,例如[2]中采用最小重投影的方法计算出最优的相机主点位置,然后使用畸变表进行去畸变处理。在其他场景中,还有些同学先标定出相机的内参,然后将内参与畸变表联合使用。下面我们来讲述基于畸变表的去畸变方法:
厂家提供的畸变表
上面的表格展示了相机畸变表的一部分,厂家给出了入射角
从 到 的光线在焦距为f的相机真实成像平面上成像点距离成像平面中心的真实距离,单位为mm。如果想用opencv提供的API做去畸变处理,需要使用厂家提供的焦距f,将换算到相机的归一化平面上去(即除以f)。然后通过多项式拟合的方法,计算出 这几个畸变参数,例如可以使用python的curve_fit库进行多项式拟合。调用Opencv API,m_distortion_coeffs即为多项式拟合的畸变参数。