相机分类
- Dioptric cameras: 通过透镜来实现, 主要是折射,fov:0~180°
- Catadioptric cameras: 使⽤⼀个标准相机加⼀个⾯镜(Shaped mirror)
- 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仅仅和焦距有关吗?不是,和投影⽅式也有关。为什么不同焦距的鱼眼镜头可以达到同样的视角? - 知乎
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
相机标定
ethz-asl/kalibr: The Kalibr visual-inertial calibration toolbox
OpenCV
CamOdoCal
Kalibr
- 该库也实现了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中采用的畸变模型。
数据采集注意事项:
- 采集图⽚:
按照先⽔平⽅向采两到三组(⽐如在标定板顶端采集⼀组,然后相机移动到标定
板中间再采集⼀组,最后移动到标定板底端再采集⼀组),然后四个⾓各采⼀组,上下各采
⼀组(相机与标定板顶端或者底端⼤概30°⾓),然后在标定板中⼼由近到远再采⼀组,最后
任意位置采集⼏张照⽚,每组⼤概56张图⽚,图⽚总数量保持在5070左右较好。
如果使⽤的是棋盘格,在采集过程中,图⽚中要包含完整的棋盘格;如果使⽤的
是Aprilgrid标定板,也应该尽量包含完整的标定板图像。建议使⽤棋盘格,因为在标定效果
不理想的情况下,可以使⽤matlab剔除误差较⼤的图⽚。