眼睛模型
通过眼睛可以看到外面的世界,下面我们来了解一下眼睛成像的生物构造与原理。
注释:
英文 | 中文 | 功能 |
---|---|---|
cornea | 眼角膜 | 为眼睛提供大部分屈光力。加上晶体的屈光力,光线便可准确地聚焦在视网膜上构成影像 |
iris | 虹膜 | 调节晶状体厚度,可以控制瞳孔的大小 |
pupil | 瞳孔 | 控制进入眼睛内部的光量大小 |
retina | 视网膜 | 感光成像 |
lens | 晶状体 | 晶状体为一个双凸面透明组织,是眼球屈光系统的重要组成部分,也是唯一具有调节能力的屈光间质 |
optic nervesl | 视神经 | 传输图像 |
![眼睛功能与镜头功能的对应图](https://i-blog.csdnimg.cn/blog_migrate/9507cd00d5c59e21b6a7e8003aefba77.png#pic_center)
眼睛到摄像机模型的抽象(针孔)
最简单的透视投影形式。
理想情况下,3D场景与摄像机的距离是无限的,所有投影线都平行于光轴,但在摄像机中很难实现这样的场景。
场景深度 << 到摄像机的距离。
Z 对于所有场景点都是相同的(只有一个距离)
根据以上摄像机模型可以推导,一个空间点
[
x
,
y
,
z
]
[x,y,z]
[x,y,z]和它在图像中的像素坐标
[
u
,
v
,
d
]
[u,v,d]
[u,v,d](
d
d
d指深度数据) 的对应关系是这样的:
u
=
x
⋅
f
x
z
+
c
x
u=x⋅fxz+cx
u=x⋅fxz+cx
v
=
y
⋅
f
y
z
+
c
y
v=y⋅fyz+cy
v=y⋅fyz+cy
d
=
z
⋅
s
d=z⋅s
d=z⋅s
其中,
f
x
,
f
y
fx,fy
fx,fy指相机在
x
,
y
x,y
x,y两个轴上的焦距,
c
x
,
c
y
cx,cy
cx,cy指相机的光圈中心,
s
s
s指深度图的缩放因子。
这个公式是从
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)推到
(
u
,
v
,
d
)
(u,v,d)
(u,v,d)的。反之,我们也可以把它写成已知
(
u
,
v
,
d
)
(u,v,d)
(u,v,d),推导
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)的方式如下。
z
=
d
/
s
z=d/s
z=d/s
x
=
(
u
−
c
x
)
⋅
z
/
f
x
x=(u−cx)⋅z/fx
x=(u−cx)⋅z/fx
y
=
(
v
−
c
y
)
⋅
z
/
f
y
y=(v−cy)⋅z/fy
y=(v−cy)⋅z/fy
事实上根据这个公式就可以构建点云啦。
通常,我们会把
f
x
,
f
y
,
c
x
,
c
y
fx,fy,cx,cy
fx,fy,cx,cy这四个参数定义为相机的内参矩阵
C
C
C,也就是相机做好之后就不会变的参数。相机的内参可以用很多方法来标定,详细的步骤比较繁琐,我们这里就不提了。给定内参之后呢,每个点的空间位置与像素坐标就可以用简单的矩阵模型来描述了:
其中, R R R和 t t t是相机的姿态。 R R R代表旋转矩阵, t t t代表位移矢量。因为我们现在做的是单幅点云,认为相机没有旋转和平移。所以,把 R R R设成单位矩阵 I I I,把 t t t设成了零。 s s s是scaling factor,即深度图里给的数据与实际距离的比例。由于深度图给的都是short (mm单位), s s s通常为1000。
于是就有了上面那个 ( u , v , d ) (u,v,d) (u,v,d)转 ( x , y , z ) (x,y,z) (x,y,z)的公式,如果相机发生了位移和旋转,那么只要对这些点进行位移和旋转操作即可。