SLAM中的相机模型

在当今技术飞速发展的时代,相机已经成为自动驾驶领域不可或缺的一部分,扮演着极其重要的角色。自动驾驶技术的核心在于精确地感知和理解周围环境,其中,相机作为感知系统的眼睛,为车辆提供了丰富的环境信息。通过捕捉周围的图像,相机帮助自动驾驶系统实现了对道路状况、行人、车辆以及其他障碍物的识别和定位。特别是在同时定位与地图构建(SLAM)技术中,相机不仅能够实时地提供环境图像,还能够通过分析这些图像来帮助车辆理解其在环境中的位置,这对于无人驾驶汽车的导航和路径规划至关重要。

为了让相机能够准确地提供这些关键信息,了解和校准相机的内参变得尤为重要。相机内参包括了影响图像成像的各种因素,如焦距、主点坐标和镜头畸变参数等,这些参数决定了相机如何将三维世界映射到二维图像上。通过对这些内参进行精确的校准,我们可以校正由于镜头畸变等因素导致的图像扭曲,从而提高图像的准确性,这对于提高自动驾驶系统的识别和定位准确性至关重要。内参标定不仅确保了数据的可靠性,也是实现高级视觉算法,如深度估计、物体识别和三维重建等,的基础。因此,相机内参标定是自动驾驶系统开发中的一个重要步骤,它直接影响到自动驾驶汽车的性能和安全性。在自动驾驶技术不断进步的今天,深入理解相机模型和精确校准相机内参,是推动这一领域发展的关键。

本文总结了SLAM领域常见的“相机内参”形式,所谓的“相机内参”将从以下几个方面展开:

  • 分别介绍“相机模型”和“畸变模型”
  • “投影模型”是指在实际使用过程中,以上两者的组合形式、一些实用的去畸变技巧

本文仅做学术讨论,如有问题欢迎留言讨论和指正,希望能对图像数据操作、感知模型训练、SLAM前端处理等不同任务带来启发,下面正式开始!

相机模型

Pinhole

SLAM6_自动驾驶

由两式可得:

SLAM6_人工智能_02

SLAM6_自动驾驶_03

Omnidirectional (omni)

SLAM6_自动驾驶_04

全向模型也叫做统一相机模型 (Unified Camera Model), 由五个参数来描述,就是平时见到的Cata-fisheye-model (MEI)的相机模型,但是如果要完美的表达鱼眼相机,需要配合畸变模型。

所谓的CataCamera实际指的是catadioptric,意思就是在鱼眼相机及镜头的外侧,再加上一个反向正对的折反射镜,对应屈光度相机(dioptric camera,视野小于180):

SLAM6_OpenCV_05

为什么要加一个外部透镜?大大增加视野范围

主要解决的问题:

  • 外部透镜与相机光心未对齐
  • 不同透镜模型(双曲线、抛物线、椭圆、平面、鱼眼镜头)
  • 相机镜头的畸变
  • 过度参数化导致的难以解决的最小化问题

投影过程(简化模型,把折反镜、镜头、相机看作一个东西):

SLAM6_fish_06

标定过程:

  • 人工点选mirror的中心和镜子边界上的一点,或默认使用图片中心,估计主点
  • 人工在鱼眼图中选取棋盘一条直线上的至少3个点,估计focal length
  • 人工在每个图片上框选棋盘格ROI,估计外参
  • 重投影图片,提取亚像素角点
  • 全局优化

Extended Unified Camera Model

SLAM6_人工智能_07

为什么要提出这个模型?只需要比pinhole多2个参数,就可以表达径向畸变

UCM原本是将世界点投影在单位球面上,EUCM在UCM模型的基础上再添加一个系数,用来控制投影的曲面,使其变成一个椭球面

SLAM6_fish_08

可以将UCM重新参数化从:

SLAM6_人工智能_09

Double Sphere

SLAM6_OpenCV_10

从各个模型的精度对比实验中可以发现双球模型的价值:

SLAM6_人工智能_11

在精度表现中,双球模型基本排名第二(橘色),和第一名的KB 8参数模型(绿色)几乎达到了相同的精度,但是在计算时间上DS玩爆KB模型,甚至KB模型还需要估计畸变模型,导致需要估计的参数比DS多,综上得在重投影误差几乎类似的情况下,运行时间最快,是高阶多项式模型较好的替代。

但是内参标定在意的是精度,时间效率不是那么重要,从精度表现上可以很容易明白为什么OpenCV的cv::fisheye采用的是KB模型。

Scaramuzza (OCam)

SLAM6_fish_12

其中黑色的是镜头,plane指的是图中粉红的数字传感器平面,pixel指的是第4个图片中最终看到的图片。

第3个表达的是:真实的数字传感器平面的“像素”不是理论上的“正方形且线性“的排列,但是在数字转换的时候会强行按照正方形且线性地排列,导致本来透镜看到的正圆,被数字转换强行转成了一个椭圆。笔者理解,这个弯曲的过程其实也可以包含镜头和成像平面没有对齐的情况,总而言之,这个拉伸矩阵的本质是仿射变换,矫正由于镜头和成像平面由于物理位置未对齐、信号转换过程等原因引起的畸变

SLAM6_人工智能_13

SLAM6_人工智能_14

SLAM6_自动驾驶_15

B-spline

SLAM6_人工智能_16

标定精度实验1, 对比2个相机同时垂直于玻璃、水平于玻璃放置,分别使用普通模型和B-spline模型,可以看到在垂直于玻璃时,玻璃带来的影响类似,故误差分布相似;另一种情况,B-spline更能标定出玻璃带来的影响。

SLAM6_人工智能_17

标定精度实验2,对比不同相机,分别使用普通模型和B-spline模型,可以看到B-spline的误差分布更小

SLAM6_人工智能_18

畸变模型

Radial-Tangential (radtan)

SLAM6_OpenCV_19

大家最熟悉、最常用、配合pinhole的畸变模型,分成径向畸变和切向畸变

一般k3可以不用估计,切向畸变一般也很小,根据需要可以估计

  • 径向畸变
    分为枕形畸变(长焦镜头)和桶形畸变(广角镜头)
    光学镜头在生产制造过程中,很难保证厚度均匀,离中心越远,光线弯曲程度越高

SLAM6_fish_20

 

切向畸变

相机感光成像平面没有完全和透镜平行

SLAM6_OpenCV_21

两者结合的公式:

Equidistant (equi)

SLAM6_fish_22

其实一共有4种投影模型,但是都是奇函数,所以都可以用泰勒展开来表达,等距模型是为了简化采用的最简单的一种

当然畸变参数是可以增加的,阶数越高,精度越高,计算越慢。

SLAM6_人工智能_23

Field-of-View  (fov)

SLAM6_OpenCV_24

这个模型只是理想模型,这个角度是理论的视场角,但是真实的光学器件可能不完全遵循这个模型,比如制造偏差、硬件误差等

投影模型

模型组合

相机模型 + 畸变模型;一些应用举例

  • pinhole + radtan: cv::pinhole (OpenCV [4] ), VINS, ORB-SLAM
  • pinhole + equi (Kannala-Brandt [8] ): cv::fisheye (OpenCV), DSO
  • pinhole + FOV: atan (SVO, DSO, Kalibr)
  • omni + rantan: MEI (VINS Cata), cv::omnidir (OpenCV)
  • Scaramuzza: SVO, NASA, Matlab

去畸变方式

Pinhole

SLAM6_人工智能_25

SLAM6_OpenCV_26

那为什么去完畸变之后边界的图像会被拉扯得特别严重?

鱼眼镜头会把光线进行折射(粉色),使得可以看到更广泛的视野,对于世界下的同一条直线(绿色),针孔按照相似三角形原理在图像上的投影更长(蓝色),所以在鱼眼原图越靠近边缘的地方,去完畸变拉扯现象越严重

SLAM6_人工智能_27

Panoramic

全景图片可以在保留原始大FOV的前提下,尽量减小畸变。但是图像内容也会变得比较奇怪,e.g. 相机在道路中间,道路会变成两半。

SLAM6_人工智能_28

Cubemap

由于鱼眼图片直接投影成pinhole边缘区域会出现拉伸现象,为了有效缓解这个问题,可以将整个原图的像素投影在一个立方体的5个面上(后面是看不到东西的),除了前面和投影到pinhole没什么区别,其他面就是把外参多转90度。   

这样做会在不同面的接缝处产生突然弯折的现象。

SLAM6_自动驾驶_29

Cylindrical

圆柱面的投影会在有效降低拉伸现象的同时,最大保留原始FOV。可以想像这个相机坐标系下的单位球就是地球,这个圆柱投影就是“墨卡托投影”,会生成一张“世界地图”。

SLAM6_自动驾驶_30

以下为畸变示意图,请主要关注左侧车辆的形状变化,从左至右分别为广角原图(形变)、pinhole投影(拉伸现象)、cylindrical投影(较为自然)

SLAM6_OpenCV_31

参考资料

[1] ETH Kalibr: https://github.com/ethz-asl/kalibr

[2] ETH CamOdoCal: http://github.com/hengli/camodocal

[3] ROS camera_calibration: http://wiki.ros.org/camera_calibration

[4] OpenCV: http://opencv.org

[5] Matlab Ocam calibration toolbox: http://sites.google.com/site/scarabotix/ocamcalib-toolbox