相机标定与三维重建原理及实现学习笔记1——相机模型数学推导详解
Posted ViolentElder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相机标定与三维重建原理及实现学习笔记1——相机模型数学推导详解相关的知识,希望对你有一定的参考价值。
目录
- 前言
- 一.小孔成像模型
- 二.坐标系的变换
- 1.世界坐标系到相机坐标系的变换(刚体变换)[ x w ^ → x c ^ \\boldsymbol \\hatx_w\\rightarrow \\boldsymbol \\hatx_c xw^→xc^]
- 2.相机坐标系到图像坐标系的变换(射影变换,基于小孔成像模型)[ x c ^ → x p ^ \\boldsymbol \\hatx_c\\rightarrow \\boldsymbol \\hatx_p xc^→xp^]
- 3.图像坐标系到像素坐标系的变换(平移+单位缩放)[ x p ^ → x s ^ \\boldsymbol \\hatx_p\\rightarrow \\boldsymbol \\hatx_s xp^→xs^]
- 4.总结
- 三.畸变模型
- 四.总结
- 五.写在最后
- 参考引用
前言
由于本人近期正在展开数字图像相关技术用于测量材料形变方向的研究,既然涉及到使用图像处理参与到测量或检测研究当中,就肯定避不开构建物空间上的任意一点与相机所拍摄到的图像上一点之间的数学关系及数学模型。之前有过标定经验的我只是单纯的使用别人封装好的函数,如今仔细推导过后才发现其中奥秘所在。我认为想要在一个技术上有所创新,最核心的还是能够将其学的透彻,我希望将自己作为一个初学者学习和推导该原理的过程记录下来,也方便之后每一个涉足该领域知识的人能更清晰更快的应用这些知识。
本文所写的内容主要参考《学习OpenCV 3 》1以及 大奥特曼打小怪兽大佬的博客第六节、双目视觉之相机标定2。但是本文的讲解思路会稍有不同,同时也会更偏向数学推导。如果本文对你的帮助不大,建议可以看一下提到的书籍与博客,可以提供一些不同角度的讲解。
如果您对于标定第一次接触,我希望您可以带着下面这两个问题在本文的推导中一起思考:
- 为什么要进行标定?
- 标定到底是在计算什么东西?
文章中的图大部分都是我自己绘制的,之后写论文会用到,所以目前请不要盗用于商业用途,谢谢!
由于标定的主要目的是建立图像与实际被摄物体的变换关系,因此我们首先需要了解的是照相机系统数学模型——小孔成像模型。
一.小孔成像模型
对于任意一个折射型光路的照相机系统,无论其使用的镜头透镜组合有多么复杂,其都可以被简化的看做一个凸透镜,而光线通过凸透镜的光心,其光路不会发生偏折。因此照相机系统可以看做是一个小孔成像的模型,如下图所示
整个数学模型的坐标系建立在光心
O
O
O上,其中
x
c
^
\\hatx_c
xc^是物空间的一点,其发出或反射的光经过光心
O
O
O后会投影到相机的感光面上,像点为
x
′
^
\\hatx^'
x′^,相机感光面到系统光心的距离为焦距
f
f
f,如此一来根据相似三角形的公式可以得到
−
x
′
f
=
x
c
z
c
- \\fracx^'f=\\fracx_cz_c
−fx′=zcxc而这里的负号也表示了,此时获得的是一个倒立的像。
由于当前关系式中存在负号,而且通常相机输出给我的图像都是已经做了上下翻转才输出的,为符合认知以及简便计算,我们可以将这个感光面绕投影中心顺时针旋转180°,将其移动到光心前
f
f
f的位置,建立一个新的平面,而这个平面也就是计算机视觉当中所采用模型的像面(Image Plane),其与光轴的焦点也称为“主点”(Principal Point)。这样一来小孔成像的模型就变为了如下图所示的样子
这里的
x
p
=
x
′
x_p=x^'
xp=x′,小孔成像的公式就变为了
x
p
f
=
x
c
z
c
\\fracx_pf=\\fracx_cz_c
fxp=zcxc这样一来就消除了负号,同时像平面也变为了我们认知当中的正向图像。利用上述公式,我们在已知其中三个变量自然就可以求解剩下的未知量,但是这里存在一个问题,光轴并不是一根实际的线,而且相机系统的光心具体在什么位置是难以得到准确值的,这就意味着在以光心作为坐标系(这种坐标系称为相机坐标系)时,尽管已知物空间上一点,我们也很难量测其在这个坐标系下的具体位置
(
x
c
,
y
c
,
z
c
)
(x_c,y_c,z_c)
(xc,yc,zc)。因此我们需要以物空间中的一个具体位置来建立坐标系,而这个坐标系即世界坐标系。
除此之外我们还需要注意到,无论相机坐标系也好,还是世界坐标系也好,他们都是一个三维的坐标系,但是我们实际拍摄的图像只是二维的,也就是说经过小孔成像模型投影后得到的像点 x p x_p xp我们实质只关心其前两个维度的变量 ( x p , y p ) (x_p,y_p) (xp,yp)即可,因此可以直接在图像平面的主点(即图像的中心)上建立二维的 x − y x-y x−y坐标系即可,而这个坐标系被称为图像坐标系。
当然,这三个坐标系的度量都是长度单位(一般采用mm),但我们实际拿到的数字图像单位是像素,而且数字图像在PC的存储是以矩阵的形式存储,矩阵的起始点位于左上角,因此我们要引入在数字图像上的计算还需要以图像左上角位置建立的,度量单位是像素的坐标系,而这个坐标系被称为像素坐标系。其与图像坐标系的差异如下图所示,
u
−
v
u-v
u−v坐标系为像素坐标系,
X
p
−
Y
p
X_p-Y_p
Xp−Yp坐标系为图像坐标系,
(
c
x
,
c
y
)
(c_x,c_y)
(cx,cy)表示主点
P
P
P在像素坐标系下的位置。
通过上面说到的四个坐标系的相互变换,我们即可构建数字图像上的某个像素与实际空间中的具体物点之间的映射关系了,而标定的目的就是去求解在这些坐标系相互变换中用到的各种未知量。
二.坐标系的变换
1.世界坐标系到相机坐标系的变换(刚体变换)[ x w ^ → x c ^ \\boldsymbol \\hatx_w\\rightarrow \\boldsymbol \\hatx_c xw^→xc^]
刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移的运动,称之为刚体变换2。
由于世界坐标系和相机坐标系都是右手坐标系,两者之间的转换并不存在形变,仅通过刚体变换的方式即可进行相互的转换,设物空间中一点,在世界坐标系中的表达为
x
w
^
=
[
x
w
,
y
w
,
z
w
]
T
\\boldsymbol \\hatx_w=[x_w,y_w,z_w]^T
xw^=[xw,yw,zw]T,在相机坐标系下的表达为
x
c
^
=
[
x
c
,
y
c
,
z
c
]
T
\\boldsymbol \\hatx_c=[x_c,y_c,z_c]^T
xc^=[xc,yc,zc]T,根据刚体变换的数学表达,我们可以得到如下的转换关系: 以上是关于相机标定与三维重建原理及实现学习笔记1——相机模型数学推导详解的主要内容,如果未能解决你的问题,请参考以下文章 结构光三维重建Projector-Camera Calibration投影仪相机标定 结构光三维重建Projector-Camera Calibration投影仪相机标定 国科大人工智能学院《计算机视觉》课 —三维视觉—相机标定与稀疏重建 国科大人工智能学院《计算机视觉》课 —三维视觉—相机标定与稀疏重建
[
X
c
Y
c
Z
c
]
=
[
r
00
r
01
r
02
r
10
r
11
r
12
r
20
r
21
r
22
]
[
X
w
Y
w
Z
w
]
+
[
T
x
T
y
T
z
]
\\left[\\beginarrayc X_c \\\\ Y_c \\\\ Z_c \\endarray\\right]=\\left[\\beginarraylll r_00 & r_01 & r_02 \\\\ r_10 & r_11 & r_12 \\\\ r_20 & r_21 & r_22 \\endarray\\right]\\left[\\beginarrayc X_w \\\\ Y_w \\\\ Z_w \\endarray\\right]+\\l