相机标定整理

相机分类

  1. Dioptric cameras: 通过透镜来实现, 主要是折射,fov:0~180°
  2. Catadioptric cameras: 使⽤⼀个标准相机加⼀个⾯镜(Shaped mirror)
  3. Polydioptric camera: 通过多个相机重叠视野

相机模型

相机模型可解释为投影模型+畸变模型。

其中,相机模型指的是相机坐标系到理想图像平⾯(通常也称为Normalize 平⾯)的投影模型。

相机模型

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

常见投影模型

pinhole camera model (pinhole)

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

(intrinsics vector: [fu fv pu pv])

介绍(光学研究者⾓度):针孔相机与昆虫复眼 - 知乎

需要注意,实际相机还是凸透镜,只不过简化成⼩孔

omnidirectional camera model (omni)

(intrinsics vector: [xi fu fv pu pv]) 通常⽤于鱼眼相机模型:鱼眼镜头是怎么「鱼眼」的? - 知乎

相机fov仅仅和焦距有关吗?不是,和投影⽅式也有关。为什么不同焦距的鱼眼镜头可以达到同样的视角? - 知乎

参考:VIO标定(二)广角相机模型 - 知乎

double sphere camera model (ds)

(intrinsics vector: [xi alpha fu fv pu pv])
通常⽤于Catadioptric cameras
参考:鱼眼SLAM论文整理(1) - 知乎

Unified Camera Model (ucm)

(intrinsics vector: [alpha beta fu fv pu pv])
通常⽤于Catadioptric cameras
参考:鱼眼SLAM论文整理(1) - 知乎, Single View Point Omnidirectional Camera Calibration from Planar Grids | IEEE Conference Publication | IEEE Xplore

extended unified camera model (eucm)

(intrinsics vector: [alpha beta fu fv pu pv])
通常⽤于Catadioptric cameras
参考:鱼眼SLAM论文整理(1) - 知乎

常见畸变模型

radial-tangential (radtan)

⾮鱼眼相机常⽤(distortion_coeffs: [k1 k2 r1 r2 k3])

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

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

径向畸变的数学转换为:

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

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

这就是OpenCV calibration使用的畸变模型, 由于参数过多导致数值求解不稳定, 通常只使用 [公式], 其他参数设为0. 简化后的模型就是常用的radtan畸变模型:

equidistant (equi)

(distortion_coeffs: [k1 k2 k3 k4])

等距投影对应的畸变模型(后⾯鱼眼相机会讲到)
鱼眼相机
其⼀种⽐较好的实现(变种)是KB模型

fov (fov)

(distortion_coeffs: [w])
针孔相机的畸变模型
参考:[鱼眼SLAM论文整理(1) - 知乎

鱼眼相机

鱼眼投影⽅式

● 斯涅⽿窗投影
● 等积投影:测量全天云量覆盖情况,科研
● 等距投影:军事领域,科研
● 体视投影:科研较少
● 正交投影

对应畸变模型

其中使用最多的是Equidistant模型, 即$r_d = f \theta_d$, 对实际的鱼眼镜头来说,它们不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala提出了一种鱼眼相机的一般多项式近似模型。通过前面的四个模型,可以发现 $\theta_d$是 $\theta$的奇函数,而且将这些式子按泰勒级数展开,发现 $\theta_d$可以用 $\theta$的奇次多项式表示,即

[公式]

畸变投影模型为:

[公式]

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

参考:鱼眼镜头是怎么「鱼眼」的? - 知乎VIO标定(二)广角相机模型 - 知乎

常见鱼眼相机模型

Unified Camera Model (MEI)

● Omnidirectional相机模型+radtan畸变模型.
● Omnidirectional模型涵盖了Pinhole模型,(pinhole模型是Omni模型的⼀种特殊情况)
● MEI model可以表⽰鱼眼和⾮鱼眼相机
● ref: Single View Point Omnidirectional Camera Calibration from Planar Grids | IEEE Conference Publication | IEEE Xplore

Kannala-brandt (KB)

● opencv中的fisheye::calibrate就是⽤的该畸变模型
● pinhole camera model + equidistant 畸变模型(KB属于equidistant的⽐较好的实现)
● 直接采⽤了9参数模型,CamOdoCal库及OpenCV采⽤的是8参数模型,将其中的k1 固定
为1。但是!需要注意的是:在OpenCV中,其标定接⼝所返回的k1 k2 k3 k4 实际上对应
的k2 k3 k4 k5.
● 参考论⽂:A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses | IEEE Journals & Magazine | IEEE Xplore

相机标定

  1. ethz-asl/kalibr: The Kalibr visual-inertial calibration toolbox

  2. OpenCV

    1. OpenCV: 针孔模型
    2. OpenCV: Fisheye camera model Kanala-brandt模型
    3. OpenCV: Omnidirectional Camera Calibration - Mei模型
  3. CamOdoCal

    1. hengli/camodocal: CamOdoCal: Automatic Intrinsic and Extrinsic Calibration of a Rig with Multiple Generic Cameras and Odometry
  4. Kalibr

    1. 该库也实现了Pinhole、Kannala-brandt及MEI模型(代码注释中注明参考了CamOdoCal库的实现),同时支持与不同畸变模型的组合,可参照其wiki说明:https://github.com/ethz-asl/kalibr/wiki/supported-models。其中omni对应的是Mei投影模型,Spherical对应的是Kanala-brandt投影模型. 其畸变模型radial-tangential对应的是标准的径向和切向畸变模型,equidistant为Kanala-brandt论文A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses中采用的畸变模型。

数据采集注意事项:

  1. 采集图⽚:

按照先⽔平⽅向采两到三组(⽐如在标定板顶端采集⼀组,然后相机移动到标定
板中间再采集⼀组,最后移动到标定板底端再采集⼀组),然后四个⾓各采⼀组,上下各采
⼀组(相机与标定板顶端或者底端⼤概30°⾓),然后在标定板中⼼由近到远再采⼀组,最后
任意位置采集⼏张照⽚,每组⼤概56张图⽚,图⽚总数量保持在5070左右较好。

如果使⽤的是棋盘格,在采集过程中,图⽚中要包含完整的棋盘格;如果使⽤的
是Aprilgrid标定板,也应该尽量包含完整的标定板图像。建议使⽤棋盘格,因为在标定效果
不理想的情况下,可以使⽤matlab剔除误差较⼤的图⽚。

参考链接

  1. VIO标定(二)广角相机模型 - 知乎