相机模型

问题描述

作为一个三维视觉从业人员,你是否被各种各样的相机搞得头昏脑涨?你是否对如何标定这些相机不知所措?今天,就让我们走近科学,走近相机模型。

常见相机分类

Pinhole Camera(针孔相机、平面相机)

Omnidirectional Camera(Panoramic Camera, Spherical Camera, 全向相机)

根据实现方式分为:

Fisheye Camera(Dioptric Camera, 鱼眼相机, 折射相机)

Catadioptric Camera(折反射相机)

常用相机模型

由投影模型和畸变模型两部分构成

投影模型

Pinhole Camera Model: [fu fv pu pv skew=0],只适用于针孔相机;

Kannala-Brandt Camera Model: [fu fv pu pv k1 k2 k3 k4],为解决鱼眼相机建模而提出[1],但适用于所有类型相机;

鱼眼相机的投影方式有很多种,其中最常见的是 Equidistant Projection (这也是为什么有的标定工具直接用 Equidistant 指代 KB Camera Model)。在待标定鱼眼相机投影方式未知的情况下,可以用泰勒级数展开统一建模所有类型的投影函数,又观察到折射角$\theta_d$是入射角$\theta$的奇函数,因此可以舍弃偶次项,只保留奇次项:

Unified Omnidirectional Camera Model (Mei Camera Model): [$\xi$ fu fv pu pv],为解决 catadioptric camera 建模而提出[3],适用于针孔相机和 catadioptric camera,用此类模型近似建模鱼眼相机精度有限;

投影过程[4]:

$\xi$的不同值对应的反射镜面类型:

Scaramuzza Camera Model: [fu fv pu pv a0 a2 a3 a4],在 Unified Omnidirectional Camera Model 的基础上,为了同样适用于鱼眼相机而提出[5],适用于所有类型相机;

和 KB Camera Model 同样的思路,用泰勒级数展开统一建模所有类型的投影过程[6]:

畸变模型

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

radial-tangential: [k1 k2 p1 p2]

相机畸变通常由径向畸变和切向畸变构成, 如下图所示:

径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷, 通常又分为桶性畸变和枕形畸变:

切向畸变又分为薄透镜畸变和离心畸变等,薄透镜畸变则是因为透镜存在一定的细微倾斜造成的;离心畸变的形成原因是镜头是由多个透镜组合而成的,而各个透镜的光轴不在同一条中心线上。

radtan 畸变模型数学表达式:

fov: [$\omega$]

fov 畸变模型数学表达式:

常用标定工具

OpenCV: Pinhole + Radtan , cv::fisheye: Pinhole + Equi , cv::omnidir: Omni + Radtan

Matlab-based toolbox

Kalibr: Kaibr 在 SLAM 领域比较出名,它提供多相机系统、相机-IMU系统互标定的功能

CamOdoCal: Lionel Heng 博士在ETH博士后期间的工作

DSO: Pinhole + Equi / Radtan / FOV

VINS: Pinhole / Omni + Radtan

SVO: Pinhole + FOV , Scaramuzza

注意事项:上一节所述的各种相机模型在不同的标定工具中实现、命名、归类(投影模型 or 畸变模型)或有不同,需要仔细甄别,加以区分,以免混用误用。

参考

Kannala-Brandt Camera Model

Fisheye Lens Projections

Mei Camera Model

Mei Camera Model Projection Formulas

Scaramuzza Camera Model

Scaramuzza Camera Model Formulas