从普通相机模型到鱼眼畸变模型--标定与去畸变

这篇博客详细介绍了相机模型的发展,从经典的针孔模型到现代手机摄像头的构成,探讨了透镜组的径向畸变和切向畸变现象。文章还深入解析了内参矩阵、张氏标定法以及鱼眼模型,特别是鱼眼镜头的等距投影模型,并阐述了鱼眼图像的去畸变过程。内容涵盖了相机标定、投影函数和图像处理技术。
摘要由CSDN通过智能技术生成

普通相机模型

普通成像模型

普通相机模型一般通过pin-hole model+径向畸变+切向畸变进行建。

针孔模型与透镜组:

针孔模型即小孔成像模型,近代的摄影术和现代照相机技术即起源于此。早在2400多年前左右的墨子和亚里士多德就发现了小孔成像原理,见图1,中世纪的画家们开始把这种小孔成像的原理应用在了绘画当中见图2。
在这里插入图片描述
图2

但是真实的针孔如果设计的过大,会导致成像重影,过小的话不能为快速曝光收集足够的光线。因此人们在小孔成像的基础上对照相暗盒进行改进,在暗盒上加装了固定焦距的镜头来收集更多的光线,这其实也是现代摄像机的雏形,在人们未发现如何将影像固定在底片的技术之前,画师们使用这种设备进行辅助绘画,如图3所示。
图 2 左:暗盒设备;右:暗盒内的景象
图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θra,b至此得到了无畸变情况下归一化平面像点坐标,根据内参矩阵的单应性关系映射至像素平面即完成去畸变图像的求解。
去畸变核心为已知θ_d求θ,是一个一元高次方程求解问题,常用二分法、不动点迭代、牛顿迭代法,本文不再详细介绍。图中蓝色部分为去畸变过程。源码参考OpenCV xx.cpp
在这里插入图片描述

### 回答1: 梯形畸变图片矫正是一种常见的图像处理技术,用于纠正由于使用广角镜头或摄像机放置角度不当等原因造成的图像失真问题。MATLAB是一种强大的科学计算和图像处理软件,可以用来进行梯形畸变图片矫正。 MATLAB提供了一些图像处理工具箱和函数,可以很方便地实现梯形畸变图片矫正。具体的步骤如下: 1. 读取图像:使用imread函数将待矫正的图片读取到MATLAB中。 2. 提取关键点:根据梯形畸变的程度,选取图片中的关键点。一般来说,需要选择图片中的四个角点。 3. 计算矫正矩阵:使用imrect函数选择图片中的四个角点,然后使用fitgeotrans函数计算出矫正矩阵。矫正矩阵可以将原始图像的坐标转化为矫正后图像的坐标。 4. 应用矫正矩阵:使用imwarp函数和所得到的矫正矩阵,对原始图像进行矫正。 5. 显示和保存矫正后的图像:使用imshow函数显示矫正后的图像,并使用imwrite函数将其保存到磁盘上。 通过以上步骤,我们可以使用MATLAB对梯形畸变图片进行矫正。然而,这只是一种简单的方法,对于复杂的畸变问题,可能需要更高级的算法和技术来进行矫正。 ### 回答2: 梯形畸变是指图片中的直线(如建筑物、道路)由于相机拍摄角度的不同而呈现出倾斜、变形的现象。为了纠正这种畸变,可以使用Matlab进行梯形畸变图片矫正。 在Matlab中,首先需要获取图片中的梯形形状。可以使用角点检测算法(如Harris角点检测)来找到图片中的四个角点。角点通常位于梯形的四个边角处。 接下来,使用透视变换(perspective transformation)来矫正图片中的梯形畸变。透视变换是一种将一个平面上的点映射到另一个平面上的点的变换。通过将四个角点映射到一个规则的矩形上,可以实现梯形畸变的矫正。 在Matlab中,可以使用imwarp函数来进行透视变换。该函数需要指定源图像、目标图像以及源图像的四个角点和目标图像的四个对应点。通过将源图像映射到目标图像,就可以实现梯形畸变的矫正。 最后,可以使用imshow函数来显示矫正后的图片,以便进行比较和评估。如果需要保存矫正后的图片,可以使用imwrite函数将其保存为其他格式(如JPEG或PNG)。 综上所述,使用Matlab进行梯形畸变图片矫正的过程包括获取角点、进行透视变换和显示/保存矫正后的图片。通过这些步骤,可以有效地纠正梯形畸变,使直线在图片中呈现出垂直或水平的状态。 ### 回答3: Matlab梯形畸变图片校正是一种图像处理技术,可以用来矫正因相机角度或透视变换引起的图像梯形畸变问题。 首先,我们需要确定输入图像中的四个角点。使用Matlab的图像处理工具箱中的函数,例如`corner`或`imfindcircles`,可以检测出这些角点。这些角点可以是物体边界的四个顶点,或者可以预先标记在图像上的人工选择的点。 接下来,我们需要计算原始图像中的四个角点与矩形边界的映射关系。我们可以使用`imcrop`函数来选择原始图像中的感兴趣区域,然后利用`cp2tform`函数来计算矩形边界和原始图像角点之间的关系。 然后,我们可以利用计算得到的映射关系对整个图像进行矫正。使用`imtransform`函数可以对原始图像进行重新映射操作,以消除梯形畸变。这个函数需要使用前面计算得到的映射关系作为输入参数。 最后,我们可以通过将校正后的图像与原始图像进行对比,或者使用`imshow`函数来显示校正后的图像,以确保校正效果达到了预期。 总之,Matlab梯形畸变图片矫正是一种有效的图像处理技术,可以帮助我们消除因相机角度或透视变换引起的图像梯形畸变问题。通过确定角点、计算映射关系和进行图像重映射,我们可以得到校正后的图像,使之更符合我们的期望。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值