1. 广角相机成像原理

广角相机成像步骤与普通相机基本一致, 主要的区别在于镜头聚光的部分, 广角相机为了获得更大的FOV, 有三种镜头聚光方式:

  1. Dioptric cameras: 通过透镜来实现, 主要是折射
  2. Catadioptric cameras: 使用一个标准相机加一个面镜(Shaped mirror)
  3. Polydioptric camera: 通过多个相机重叠视野




广角视频矫正代码Python_广角视频矫正代码Python


广角相机引入了很多模型, 为了防止混乱, 我们先总结一下, 我们通常会讨论两种模型: 相机模型和畸变模型.

2. 相机模型

相机模型指的是相机坐标系到理想图像平面(通常也称为Normalize 平面)的投影模型. 设相机坐标系下的点为


, 投影到normalize平面的点为


, 相机模型是指:



注意: 广义上相机模型包括投影成像, 畸变, 内外参等全部模型, 这里讨论的相机模型仅指的透镜/面镜的投影模型.

2.1 针孔相机模型(Pinhole)

针孔相机模型利用透镜进行聚光成像的相机使用的模型, 该模型非常简单:



2.2 全向模型(Omnidirectional)

全向模型利用面镜(mirror)反射进行成像的相机使用的模型. 该模型带有一个参数


.


首先将相机坐标系的点归一化到半径为1的球面上:



然后再投影到图像平面上



其逆变换推导出来如下:



最后,注意下当


时, 全向模型就退化为了针孔模型.


3. 畸变模型

畸变模型指的理想图像平面到真实图像平面的变换模型, 也就是Normalize平面上的畸变模型.

理想的针孔成像模型确定的坐标变换关系均为线性的,而实际上,现实中使用的相机由于镜头中镜片因为光线的通过产生的不规则的折射,镜头畸变(lens distortion)总是存在的,即根据理想针孔成像模型计算出来的像点坐标与实际坐标存在偏差。

3.1 radtan畸变模型

普通相机畸变通常包括径向畸变和切向畸变, 如下图所示.


广角视频矫正代码Python_Unified_02


径向畸变表式沿半径方向的偏移量, 径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷, 通常又分为桶性畸变和枕形畸变, 分别代表


往外偏和往里偏.


广角视频矫正代码Python_Unified_03


径向畸变的数学转换为:



切向畸变又分为薄透镜畸变和离心畸变等,薄透镜畸变则是因为透镜存在一定的细微倾斜造成的;离心畸变的形成原因是镜头是由多个透镜组合而成的,而各个透镜的光轴不在同一条中心线上。切向畸变可以用如下数学表达式来描述:



结合径向和切向畸变, 像平面点的转换关系为:



这就是OpenCV calibration使用的畸变模型, 由于参数过多导致数值求解不稳定, 通常只使用


, 其他参数设为0. 简化后的模型就是常用的radtan畸变模型:



3.2 鱼眼畸变模型

鱼眼镜头的畸变模型有很多种:


广角视频矫正代码Python_相机径向畸变和切向畸变_04


其中使用最多的是Equidistant模型, 即


, 对实际的鱼眼镜头来说,它们不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala提出了一种鱼眼相机的一般多项式近似模型。通过前面的四个模型,可以发现



的奇函数,而且将这些式子按泰勒级数展开,发现


可以用


的奇次多项式表示,即



畸变投影模型为:



opencv中的fisheye::calibrate就是用的该畸变模型. 也叫作kannala-brandt模型.

3.3 FOV畸变模型

FOV畸变模型转换关系如下:



4. Unified Projection Model

在鱼眼相机中通常会看到Unified Projection Model或者MEI model, 其实就是Omnidirectional相机模型+radtan畸变模型. 前面提到了Omnidirectional模型涵盖了Pinhole模型, 所以MEI model可以表示鱼眼和非鱼眼相机.


广角视频矫正代码Python_广角视频矫正代码Python_05