SLAM|1. 相机投影及相机畸变

一个能思考的人,才真是一个力量无边的人。------巴尔扎克

本章主要内容:

1.针孔相机模型

2.相机成像的几个坐标系图像

3.畸变及相机标定

本节主要介绍在照相机拍摄过程中,现实物体如何跟照片上的像素关联起来,具体涉及相机成像的物理过程和坐标系转换。

1.1 针孔相机模型

针孔相机模型是目前大多数相机的成像模型,其成像原理为小孔成像,回顾一下按照光线在同一介质中按直线传播的原理,在小孔另一面,会形成倒立按比例缩小的实像。

如果不借助其他东西,这个成像过程会遵循如下原理:小孔越小,成像越好,但会越暗。如下图,小孔直径从2mm变到0.35mm过程,图像越来越清晰,但也越来越暗。

我们想要的照片,是既要清晰,又要有足够的亮度,即让足够的光线进来,捕获到更多的环境细节,为了解决这个问题,现代相机会使用透镜来聚集光线,在保证有较大进光面的同时,让光线也能汇聚到较小范围。

关于透镜,有两个概念:聚焦与失焦

聚焦:从物体不同部分射出的光线,通过镜头之后,聚焦在底片的一个点上,使影像具有清晰的轮廓与真实的质感,这个过程称为聚焦。

失焦:即接收的点的信息未聚焦到一起会导致成像模糊。

注意:物体"聚焦"有特定距离(景深),在景深内可清晰成像,景深外成像模糊。

加入透镜之后,成像规律会有一点变化,此时当物体离透镜不同距离时,会形成不同的像。当物体处于凸透镜的 2 倍焦距之外,会形成倒立的、缩小的实像。一倍焦距到二倍焦距之间,则会形成倒立的、放大的实像。成像物体则在一倍焦距内,成正立的、放大的虚像。

一般地,相机成像时,物体在透镜的二倍焦距之外。而对于投影仪,则会把成像物体放在一倍焦距到二倍焦距之间。对于放大镜,成像物体则在一倍焦距内。

最后,将成像处实像,用感光元件接收后,就形成了拍摄的照片。在比较早的年代,感光元件使用胶片,胶片的原理是通过光产生化学反应来记录。而到了数码时代,感光元件则使用了CCD或者CMOS,其原理是将光转化为模拟电信号来记录。

电子感光元件也叫图像传感器(sensor),分为两种:一种是广泛使用的 CCD(电荷耦合)元件,另一种是 CMOS(互补金属氧化物半导体)器件。其产生的模拟信号,首先经过模拟信号放大器进行信号放大,进而经过数模转换电路(DAC)变为数字图像,数字图像再经过 ISP(Image Signal Processor)图像处理器进行数字图像处理,最后数字图像经过压缩编码算法,存储到 SD 卡中成为一个照片文件。

  1. CCD
    CCD 全称 Charge Coupled Device,它使用一种高感光度的半导体材料制成,由许多感光单位组成,通常以百万像素为单位。当 CCD 表面受到光线照射时,每个感光单位会将电荷反映在组件上,即把光转换为电荷,所有的感光单位所产生的信号加在一起,就构成了一幅完整的画面。
  2. CMOS
    CMOS 全称 Complementary Metal-Oxide Semiconductor,它主要是利用硅和锗这两种元素所做成的半导体,使其在 CMOS 上共存着 N 极和 P 极的半导体,这两个互补效应所产生的电流即可被处理芯片记录为影像。
    两者最主要的区别在于:CCD 传感器的图像质量优于 CMOS 传感器,而 CMOS 传感器在成像速度、功耗、价格等方面优于 CCD 传感器。

1.2 相机成像的几个坐标系

要把相机拍摄的照片与实际物体关联起来,就要建立三维世界到二维图像平面的映射关系,这个过程主要通过几个坐标系之间的转换来实现。

1.2.1成像坐标系之间的关系

相机成像的坐标系主要有四个,分别是世界坐标系,相机坐标系,图像坐标系与像素坐标系。世界坐标系下物体的光线(世界坐标系),通过透镜(相机坐标系),投射到感光原件上(图像坐标系),最后计算机在像素坐标系(离散化过程)上做处理。

世界坐标系:用于表示空间物体的绝对坐标,使用(Xw,Yw,Zw)表示,世界坐标系可通过旋转和平移得到相机坐标系。

相机坐标系:以相机的光心为坐标系原点,Xc.Yc轴平行于图像坐标系的x,y轴,相机的光轴为Zc轴,坐标系满足右手法则,相机的光心可理解为相机透镜的几何中心。

图像物理坐标系:坐标原点在CCD图像平面的中心x,y轴分别平行于图像像素坐标系的(u,v)轴,坐标用(x,y)表示。

图像像素坐标系:表示三维空间物体在图像平面上的投影,像素是离散化的,其坐标原点在CCD图像平面的左上角,u轴平行于CCD平面水平向右,v轴垂直于u轴向下,坐标使用(u,v)来表示。图像宽度W,高度H。

1.2.2 坐标计算

三维坐标投影到成像平面的坐标(完成三维到二维点的映射),可以通过相似三角形得出,对于相机坐标系下的P(X,Y,Z),成像坐标为:
f Z = − X ′ X = − Y ′ Y \frac{f}{Z}=-\frac{X^{\prime}}{X}=-\frac{Y^{\prime}}{Y} Zf=−XX′=−YY′

为了方便运算,取对称的镜像进行计算,效果等价。

f Z = X ′ X = Y ′ Y \frac{f}{Z}=\frac{X^{\prime}}{X}=\frac{Y^{\prime}}{Y} Zf=XX′=YY′

可得:
X ′ = f X Z X^{\prime}=f \frac{X}{Z} X′=fZX
Y ′ = f Y Z Y^{\prime}=f \frac{Y}{Z} Y′=fZY

计算机中的图像,是一个个像素构成,且其并不是图像中心为坐标原点,而是一般把左上角规定为坐标原点,要在计算机中处理图像信息,需要在得到成像平面上的坐标后,把成像坐标,转为像素坐标。

其中O1是投影后的坐标系原点,位于图像中心,而在计算机图像处理库中(如OpenCV),则是定义的左上角O0为图像坐标系原点,横坐标轴为u轴,向右,纵坐标轴为v轴,向下。

相机内感光原件(如cmos)是一个一个小格子拼接而成的,可以认为是离散的,这个小格子可能不是正方形,要将投影坐标P'转化为像素坐标,需要经历如下过程:

计算P'到图像中心的像素距离
u ′ = X ′ α x = f α x X Z = f x X Z u^{\prime}=\frac{X^{\prime}}{\alpha_{x}}=\frac{f}{\alpha_{x}} \frac{X}{Z}=f_{x} \frac{X}{Z} u′=αxX′=αxfZX=fxZX
v ′ = Y ′ α y = f α y Y Z = f y Y Z v^{\prime}=\frac{Y^{\prime}}{\alpha_{y}}=\frac{f}{\alpha_{y}} \frac{Y}{Z}=f_{y} \frac{Y}{Z} v′=αyY′=αyfZY=fyZY

其中f为成像焦距,αx与αy为u,v方向像素的长度。

最后转为O0下的坐标

实现摄像机下三维世界的点到像素平面二维图像平面的点的映射,f为单位米转化为像素的数量,非线性变换如下
u = u ′ + c x = f x X Z + c x u=u^{\prime}+c_{x}=f_{x} \frac{X}{Z}+c_{x} u=u′+cx=fxZX+cx
v = v ′ + c y = f y Y Z + c y v=v^{\prime}+c_{y}=f_{y} \frac{Y}{Z}+c_{y} v=v′+cy=fyZY+cy

引入齐次坐标,改为线性变换,以方便运算

$\left(\begin{array}{ccc}

u \

v \

1

\end{array}\right)=\frac{1}{Z}\left(\begin{array}{ccc}

f_{x} & 0 & c_{x} \

0 & f_{y} & c_{y} \

0 & 0 & 1

\end{array}\right)\left(\begin{array}{c}

X \

Y \

Z

\end{array}\right)=\frac{1}{Z} K P \$

其中
K = ( f x 0 c x 0 f y c y 0 0 1 ) K=\left(\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right) K= fx000fy0cxcy1

就是通常所说的相机内参矩阵

通过内参矩阵K,就可以将相机坐标系的下三维的坐标点转换为图像上的二维像素坐标。而对于世界坐标系上的坐标,转换到相机坐标系中则涉及的是不同坐标系中坐标转换,这个会在第二章中进行讲解。

1.3 图像畸变

如果相机成像过程没有畸变,则一个正方形投影成像后,还是一个正方形,但实际情况往往不是这样。大家拍照中可能也会发现,在拍一个人时,可能会把一个脸不大的人,脸拍出来却比较大,这时候不一定是你拍照技术的问题,有可能是因为相机畸变。相机成像过程的图像畸变主要是镜片加工与安装的缺陷造成的。

相机畸变主要由于相机镜头的光学性质造成的。相机镜头中的光线经过折射、反射等多个光学过程,导致不同位置的物体在图像中呈现出不同的形变。这种形变被称为畸变。畸变可以分为两种:径向畸变和切向畸变。

1.3.1 径向畸变

径向畸变来自透镜形状不规则以及建模的方式,导致镜头不同部分焦距不同。光线在远离透镜中心的地方偏折更大(向外偏移远离中心为枕型畸变,左图)或更小(向中心靠拢为桶形畸变,右图)。

下图显示矩形网格因径向畸变而产生的位移。越远离光轴中心的地方,矩形网格上的点偏移越大。

对于径向畸变,常用如下公式进行修正
x corrected = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y corrected = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) 其中: r 2 = x 2 + y 2 \begin{array}{l} x_{\text {corrected }}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right) \\ y_{\text {corrected }}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right) \end{array} \\ \text { 其中: } r^{2}=x^{2}+y^{2} xcorrected =x(1+k1r2+k2r4+k3r6)ycorrected =y(1+k1r2+k2r4+k3r6) 其中: r2=x2+y2

k1,k2,k3称为径向畸变校正系数。

1.3.2 切向畸变

切向畸变来自于整个摄像机的组装过程。由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的,如下图所示。

切向图像畸变使用如下公式进行修正
x corrected = x + [ 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] y corrected = y + [ p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ] 其中 : r 2 = x 2 + y 2 \begin{aligned} x_{\text {corrected }} & =x+\left[2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right)\right] \\ y_{\text {corrected }} & =y+\left[p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x y\right] \end{aligned} \\ 其中: r^{2}=x^{2}+y^{2} xcorrected ycorrected =x+[2p1xy+p2(r2+2x2)]=y+[p1(r2+2y2)+2p2xy]其中:r2=x2+y2

其中 p1,p2为切向畸变系数。

将径向畸变与切向畸变校正,结合在一起,便是常用的畸变校正过程。
x corrected = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] y corrected = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ] 其中 : r 2 = x 2 + y 2 \begin{array}{l} x_{\text {corrected }}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)+\left[2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right)\right] \\ y_{\text {corrected }}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)+\left[p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x y\right] \end{array} \\ 其中: r^{2}=x^{2}+y^{2} xcorrected =x(1+k1r2+k2r4+k3r6)+[2p1xy+p2(r2+2x2)]ycorrected =y(1+k1r2+k2r4+k3r6)+[p1(r2+2y2)+2p2xy]其中:r2=x2+y2

等式右边的(x, y)为得到的图像中的理想点,但是存在畸变,于是把其带入等式右边,经过径向和切向变换后,得到左边的畸变校正后的实际点坐标(xcorrected, ycorrected),取出对应颜色值作为(x, y)的颜色值即可。通过去畸变,可以完成图像的矫正,如下图:

1.4* 鱼眼相机模型

鱼眼镜头一般是由十几个不同的透镜组合而成的,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。下图表示出了鱼眼相机的一般组成结构。最前面的两个镜头发生折射,使入射角减小,其余的镜头相当于一个成像镜头,这种多元件的构造结构使对鱼眼相机的折射关系的分析变得相当复杂。

1.4.1*鱼眼相机成像模型

研究表明鱼眼相机成像时遵循的模型可以近似为单位球面投影模型。可以将鱼眼相机的成像过程分解成两步:第一步,三维空间点线性地投影到一个球面上,它是一个虚拟的单位球面,它的球心与相机坐标系的原点重合;第二步,单位球面上的点投影到图像平面上,这个过程是非线性的。下图表示出了鱼眼相机的成像过程。

我们知道,普通相机成像遵循的是针孔相机模型,在成像过程中实际场景中的直线仍被投影为图像平面上的直线。但是鱼眼相机如果按照针孔相机模型成像的话,投影图像会变得非常大,当相机视场角达到180°时,图像甚至会变为无穷大。所以,鱼眼相机的投影模型为了将尽可能大的场景投影到有限的图像平面内,允许了相机畸变的存在。并且由于鱼眼相机的径向畸变非常严重,所以鱼眼相机主要的是考虑径向畸变,而忽略其余类型的畸变。

1.4.2* 鱼眼相机投影函数

为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数来设计。根据投影函数的不同,鱼眼相机的设计模型大致能被分为四种:等距投影模型、等立体角投影模型、正交投影模型和体视投影模型。下面的四种鱼眼相机的投影模型反映出了空间中的一点P是如何投影到球面上,然后到图像平面上成像的。

1、等距投影模型

上述式子中,rd表示鱼眼图像中的点到畸变中心的距离,是鱼眼相机的焦距,是入射光线与鱼眼相机光轴之间的夹角,即入射角。

2、等立体角投影模型

3、正交投影模型

4、体视投影模型

本章小结

本节以针孔相机模型作为基本模型,简要介绍了相机成像原理,相机模型中的几个坐标系及相机的畸变及相机标定的方法。最后鱼眼相机模型作为扩展介绍。

通过相机标定,可以获得相机内参及畸变系数,这解决了相机坐标系,图像坐标系,像素坐标系之间的转换过程,属于投影过程。而世界坐标系到相机坐标系之间的转换,则涉及到不同坐标系之间的空间转换,这部分涉及的参数为外参,这部分内容在下节进行讲解。

本章思考

1.叙述相机内参的物理意义。如果一部相机的分辨率变为原来的两倍而其他地方不变,那么它的内参将如何变化?

注:分辨率在不同场合意义不尽相同,这里取传感器的总的感光单元数量作为分辨率,而一些资料中会以某边排列的感光元件数量作为分辨率。在底片面积不变的情况下,分辨率变为原来两倍,指感光单元数量变为原来两倍。如1200w像素变为2400w像素。

2.调研全局快门(global shutter)相机和卷帘快门(rolling shutter)相机的异同。它们在SLAM中有何优缺点?

附录

1.1相机内参标定简介

到目前为止,相机成像有两大转换过程,相机投影及畸变消除,主要由:
K = ( f x 0 c x 0 f y c y 0 0 1 ) K=\left(\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right) K= fx000fy0cxcy1

内参矩阵以及畸变参数:Distortioncoefficients=(k1,k2,k3, p1,p2),这两种参数来决定。而求出这两类参数的过程,就是相机标定,目前相机常用的方法是借助棋盘格标定板,在相机前面拿着标定板上下左右前后移动,然后借助标定算法来求出以上参数,常用的标定算法有张正友标定法。

1.2 相机内参标定工具

1.2.1 OpenCV

OpenCV是一款广泛使用的计算机视觉库,其中包含相机内参标定的相关函数。在OpenCV中,使用calibrateCamera函数进行相机内参标定,该函数使用棋盘格等标定板,通过对标定板拍摄的多幅图像进行处理,得出相机的内参参数。OpenCV还提供了相关的可视化工具,如drawChessboardCorners函数,用于显示标定板的角点,以及projectPoints函数,用于将3D点投影到2D图像平面上。

  1. 循环读取图片
  2. 使用findChessboardCorners函数检测角点(需提前输入角点数)
  3. 使用find4QuadCornerSubpix函数对角点进行亚像素精确化
  4. 可用drawChessboardCorners将角点显示
  5. 根据角点数和尺寸创建一个理想的棋盘格(用point向量存储所有理论上的角点坐标)
  6. 通过calibrateCamera函数由理想坐标和实际图像坐标进行标定,可得到标定结果
  7. 由projectPoints函数计算反向投影误差

1.2.2 MATLAB

MATLAB也提供了相机内参标定的工具箱,包括Camera Calibration Toolbox和Image Processing Toolbox等。Camera Calibration Toolbox使用标定板对相机进行标定,并提供了可视化工具,如ShowExtrinsics函数,用于显示相机的外参参数。Image Processing Toolbox提供了更加高级的算法,如多目相机标定,以支持更加复杂的应用场景。

简单过程如下:

  1. 应用程序中找到Camera Calibration
  2. 添加标定板拍摄图片(按Ctrl可一次添加多张)
  3. 输入棋盘格每格的尺寸大小
  4. 显示已检测出的棋盘格,点击Calibration,开始标定。
  5. 得到标定结果(平均误差小于0.5即可认为结果可靠)
  6. 可查看标定结果和程序

1.2.3 ROS

ROS(Robot Operating System)是一种常用的机器人操作系统,其中包含相机内参标定的相关包,如camera_calibration。该包通过对标定板拍摄的多幅图像进行处理,计算出相机的内参参数,并自动保存标定结果。此外,ROS还提供了一系列可视化工具,如image_view,用于显示相机的图像和标定结果。

相关推荐
就爱敲代码16 分钟前
怎么理解ES6 Proxy
1024程序员节
憧憬一下16 分钟前
input子系统的框架和重要数据结构详解
arm开发·嵌入式·c/c++·1024程序员节·linux驱动开发
三日看尽长安花25 分钟前
【Tableau】
1024程序员节
sswithyou1 小时前
Linux的调度算法
1024程序员节
武子康1 小时前
大数据-187 Elasticsearch - ELK 家族 Logstash Filter 插件 使用详解
大数据·数据结构·elk·elasticsearch·搜索引擎·全文检索·1024程序员节
互联网杂货铺1 小时前
Python测试框架—pytest详解
自动化测试·软件测试·python·测试工具·测试用例·pytest·1024程序员节
GDAL2 小时前
JavaScript正则表达式利器:exec()方法深度解析与应用实例
正则表达式·1024程序员节
2401_857610032 小时前
植物健康,Spring Boot来助力
1024程序员节
阿乾之铭2 小时前
Spring Boot框架中的IO
java·spring boot·log4j·1024程序员节
百流2 小时前
Pyspark中pyspark.sql.functions常用方法(4)
1024程序员节