目录
普通相机模型
普通成像模型
普通相机模型一般通过pin-hole model+径向畸变+切向畸变进行建。
针孔模型与透镜组:
针孔模型即小孔成像模型,近代的摄影术和现代照相机技术即起源于此。早在2400多年前左右的墨子和亚里士多德就发现了小孔成像原理,见图1,中世纪的画家们开始把这种小孔成像的原理应用在了绘画当中见图2。
图2
但是真实的针孔如果设计的过大,会导致成像重影,过小的话不能为快速曝光收集足够的光线。因此人们在小孔成像的基础上对照相暗盒进行改进,在暗盒上加装了固定焦距的镜头来收集更多的光线,这其实也是现代摄像机的雏形,在人们未发现如何将影像固定在底片的技术之前,画师们使用这种设备进行辅助绘画,如图3所示。
图3
理论上说是可能定义一种透镜而不引入任何畸变的,然而在制作工艺上,制作一个“球形”透镜比制作一个数学上理想的透镜更容易,所以实际中透镜的引入其代价就是带来图像的畸变。主要分为两类:
径向畸变
径向畸变主要来源于透镜的形状,沿着透镜半径方向产生畸变,原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲,主要包括桶形畸变和枕形畸变两种。
切向畸变
来自于整个摄像机的组装过程,主要由于透镜本身与感光芯片平面不平行而产生的。
现代手机摄像头的基本组成
该部分主要结合现代手机摄像头的基本原理进一步说明透镜组和焦距等概念。
(1) 镜座:支撑整个镜头模组
(2) 透镜组:凸透镜+凹透镜组成的复杂系统,作用是先汇聚光线,再发散光线,使得光线均匀分布在感光芯片上;另外凸透镜和凹透镜的距离确定了透镜组的焦距:
a) 短焦镜头:广角镜头,看到的范围更广;
b) 长焦镜头:望远镜头,看到的范围更窄,更远。
(3) 光圈:控制进光量,F值=焦距/光圈开口直径,如f=50mm,d=30mm,则光圈表示为F1.8或F/1.8,光圈越大对暗处图像的捕捉能力越强,同时光圈越大,物体景深效果越近。
(4) 对焦马达:当物体在远景和近景的时候,控制镜头组与感光芯片的距离,保持感光芯片上始终可以获得清晰的成像效果。
内参矩阵
不考虑畸变情况下点投影过程:其中相机物理坐标系到成像平面(感光芯片)为透视投影,成像平面到像素坐标系为一个仿射变换(考虑到感光版的横纵向不完全正交的影响;如果确定为90度时,退化为刚体变换;放射变换和刚体变换的区别在于R部分是否为正交矩阵,若是正交矩阵则为刚体变换,若是一般旋转矩阵则表示一般线性变换,线性变换+平移=放射变换)。
其中,f为焦距,单位为m;dX,dY分别为在X、Y方向上的一个像素在相机感光版上的物理长度(即一个像素在感光版上是多少毫米),因此f/dX,f/dY单位为像素,这也是OpenCV库标定函数的内参输出结果;dX,dY,f均不能在标定过程中直接测量(可以查阅camera设计手册得到设计值),只有组合量f/dX,f/dY可被直接标定出来[OpenCV白皮书]。θ角度表示感光板的横边和纵边之间的角度(90度表示无误差)。
OpenCV中内参矩阵中f/dX,f/dY作为整体被标定出来,那么OpenCV中标定得到的内参矩阵的本质特征是什么呢。对公式4-1中内参数矩阵变形,有:
(u,v)为像素坐标,(Xc/Zc, Yc/Zc)是将相机坐标系下的坐标进行归一化,即将3D空间中的点投影到Zc=1的2D平面上,同时也等价于f=1时的感光平面上的坐标,从另一个角度看,内参矩阵也反映了图像像素平面和成像归一化平面之间的单应性关系,该原理在普通摄像头和鱼眼摄像头去畸变的过程中会经常出现。
畸变模型
径向畸变模型
切向畸变模型
其中 (x,y)是理想的无畸变的归一化图像坐标(zc=1时对应的像平面);+hat 为畸变后的归一化图像坐标;r为图像成像点到像平面中心点的距离: r2=x2+y^2,xy分别为像平面下的坐标。二者效果如图所示。
影响较大的为径向畸变,张正友标定法仅仅考虑了该畸变。对于该畸变,光学中心畸变为0,随着向边缘移动,畸变越来越严重,可以用r=0附近泰勒级数展开的前几项定量描述(即在r=0附近使用多项式表示x与x hat比例这个复杂函数),因为函数必须是关于r径向对称,所以只使用泰勒展开的偶次幂项。原因如下图所示。
图 x=1时,横轴为r,纵轴为x_hat。
随着向图像边缘移动,x_hat同x偏离越来越大
张氏标定法
张正友标定法,相比较于使用昂贵设备(如两个或者三个正交平面)的经典技术相比,供了一种相对较为灵活方面的相机校准方法。只需要使用平面标靶物即可完成相机内参标定、畸变系数标定、标靶物与相机坐标系的外参估计三个任务。
张正友标定法主要应用在普通相机(FOV<120度,相比较鱼眼镜头无明显畸变)标定。基本思想是:首先假设畸变不存在,进行内参矩阵和外参矩阵求解;然后假设内参矩阵和外参矩阵无误差,根据点的投影结果和实际检测结果建立约束关系求解畸变参数,至此求解到内参数、畸变和外参数的closed-form solution;最后根据内参、畸变、外参的初始值,建立重投影误差优化目标,使用L-M方法迭代优化。
未完待续。。
鱼眼模型
基于针孔相机模型的镜头存在一个缺陷,光线始终沿直线传播使得镜头难以捕捉位于边缘的物体。如图4.2-1左边所示,对于同样长度的红色箭头,越靠近边缘的经过镜头成像后就变得越长,而实际上我们底片的尺寸是有限的,所以极端接近边缘的物体普通的镜头就无法成像记录了。然而当人们在水中向上看时,能一眼看到整个水面上的半球形空间,整个空间的影像都背扭曲、压缩到了一个半顶角约为48°的锥形内(由光线空气-水中的折射角度确定),如图4.2-2所示。在这个锥形空间内部,是来自水面上的空间的光线,在这个锥形外部,是来自水面下景色的反射。也就是说,在水中向上看时,一个圈之外,只能看到水底的景色;所有水面上的景色,都被压缩在一个圈内。鱼眼镜头也是人们根据这种特性发明的,鱼眼镜头的前镜片直径很短,且呈抛物状向前部凸出,与鱼的眼睛十分相似。因此鱼眼镜头的名称不应当理解为鱼眼看到的世界景象,而是因为外形和鱼眼相似而得名,同时鱼眼图片和人眼在水里仰视天空看到的景象比较一致,网上用一些“鱼在水中观察水面事物”的图片来说明鱼眼成像,笔者认为是不准确的。
在水里仰视看到的景象
透镜组
鱼眼镜头一般是由十几个不同的透镜组合而成的,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。
为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数来设计。根据投影函数的不同,鱼眼相机的设计模型大致能被分为五种:透视投影(即针孔相机模型)、等积投影、等距投影、体视投影、正交投影[参考论文]。图4.2-4左图为各种投影模型的像点r同入射角度的关系,右图为等距投影示意图。
左:对于(1)透视投影,当入射角接近90度时,像点r的值接近于+∞;2345的投影方式可保证r在一定范围内,在感光芯片制作上也是合理的
右图描述了鱼眼镜头成像和小孔成像的区别。O1XcYcZc为相机坐标系,O2-xy为像平面坐标系。对于现实中的一点P,入射角度为θ,如果按照针孔模型,则成像点为p^’,但是对于鱼眼相机,入射光线PO1经过镜头后会发生折射,因此P的成像点为p。
r和f的进一步说明
图2-4中的图取自论文,是一种通用描述,r和f的含义取决于所分析的投影平面是哪个,按照前述内参矩阵的说明,当投影平面为f=1时的归一化平面时,内参矩阵可直接建立图片像素和投影平面坐标的关系,因此,下文分析中,均设f=1,这与内参矩阵的含义是自洽的。
鱼眼相机标定中使用较多的是等距投影模型(OpenCV中使用的也是),下面以等距投影模型为例分析投影及去畸变过程。
等距投影模型(OpenCV::fisheye)
等距投影模型和去畸变算法过程,参考了很多博客发现很多都是错误的,没有讲清楚θ_d和θ角度的关系,成像平面和像素平面的关系以及推导过程中焦距f如何处理,最终笔者参考论文[][]和OpenCV去畸变的源码,整理如下。
鱼眼图像去畸变过程
去畸变过程为已知畸变图的像素坐标,反求无畸变(假设透视投影)情况下的物体点像素坐标, 基本思想为根据畸变像素点归一化平面成像点rdθ_dθra,b至此得到了无畸变情况下归一化平面像点坐标,根据内参矩阵的单应性关系映射至像素平面即完成去畸变图像的求解。
去畸变核心为已知θ_d求θ,是一个一元高次方程求解问题,常用二分法、不动点迭代、牛顿迭代法,本文不再详细介绍。图中蓝色部分为去畸变过程。源码参考OpenCV xx.cpp