赞
踩
初中物理我们就学过小孔成像问题,这也是我们对相机的最初认识。
仅靠一个小孔进光量太小,拍摄到的照片会很暗,所以实际的相机会使用凸透镜来聚光。但是凸透镜的光学模型过于复杂,通常会简化成针孔相机模型来解释成像过程并进行建模。
这时出现了一个疑问,小孔成像成倒立的像,而照片的方向却是正常的?
原因在于相机内部会对所成的像再进行一次镜像,所以用户看到的图像就跟人眼看到的方向一致了,我们可以把这一过程等效成把成像平面放到相机前方,示意图如下(之后为了直观,本文所说的成像平面均为镜像过后的等效成像平面)。
列出几个重要名词,通过下图可以简单建立下概念,后边再细品
当前场景下固定不变的坐标系
作为世界坐标系。x轴
正方向,下边是y轴
正方向,相机前方是z轴
正方向,也就是说,拍摄的远处物体距离为正。x、y轴
方向和相机坐标系x、y
相同,不同的是图像坐标系是二维坐标系没有z轴
。
P
c
P_c
Pc点是相机坐标系下坐标,
P
i
P_i
Pi是图像坐标系下坐标,
Z
c
Z_c
Zc是
P
c
P_c
Pc点距离光心的距离,
f
f
f是镜头的焦距,
X
c
X_c
Xc和
X
i
X_i
Xi是点在
x
x
x轴投影距离原点的距离,是正值。
根据相似三角形原理可得:
Z
c
f
=
−
X
c
X
i
=
−
Y
c
Y
i
(
1
)
\frac{Z_{c}}{f}=-\frac{X_{c}}{X_i}=-\frac{Y_{c}}{Y_i} (1)
fZc=−XiXc=−YiYc(1)
回忆前文提到的等效成像平面,我们这里再强化一下这个概念,将
P
′
P'
P′镜像到镜头前方
于是可以将(1)式中的负号去掉
Z
c
f
=
X
c
X
i
=
Y
c
Y
i
(
2
)
\frac{Z_{c}}{f}=\frac{X_{c}}{X_i}=\frac{Y_{c}}{Y_i} (2)
fZc=XiXc=YiYc(2)
内参矩阵描述的是相机坐标系下的坐标到像素坐标的变换关系
利用
(
2
)
(2)
(2)式,很容易可以得出二者的转换关系。
{
X
i
=
f
Z
c
X
c
Y
i
=
f
Z
c
Y
c
(
3
)
\left\{
图像坐标是实连续值,而像素坐标是离散的正值,经过简单的平移和尺度缩放,很容易得到二者之间的转换关系如下:
{
u
=
α
X
i
+
c
x
v
=
β
Y
i
+
c
y
(
4
)
\left\{
α \alpha α、 β \beta β与实际传感器的物理尺寸有关,单位为 p i x e l / m pixel/m pixel/m ; X i X_i Xi、 Y i Y_i Yi单位为 m m m; c x c_x cx、 c y c_y cy单位为 p i x e l pixel pixel。
用
(
3
)
(3)
(3)式,将
X
i
,
Y
i
X_i,Y_i
Xi,Yi用
X
,
Y
,
Z
X,Y,Z
X,Y,Z替换,得到像素坐标与相机坐标系下坐标的关系
{
u
=
f
x
X
c
Z
c
+
c
x
v
=
f
y
Y
c
Z
c
+
c
y
(
5
)
\left\{
为了表达更加漂亮,引入齐次坐标
(
u
v
1
)
=
1
Z
c
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
X
c
Y
c
Z
c
)
(
6
)
\left(
Z
c
(
u
v
1
)
=
K
P
c
(
7
)
Z_c \left(
为了避免混淆,一些参考材料会使用
s
s
s来代替
Z
c
Z_c
Zc,注意他们意思是一样的
思考:
- 观察(6)式可以发现,由于 1 Z c \displaystyle\frac{1}{Z_c} Zc1的存在,对相机坐标同时乘一个常数后的到的像素坐标是相同的。也就是说从光心发出的射线上的点,在图片里对应的像素坐标是相同的,即点的深度在投影过程中被丢失了。不用特殊手段,单目相机无法得到深度值。但如果给定距离,像素点对应的 P c P_{c} Pc就可唯一确定。
- 再重新处理一下(6)式
( u v 1 ) = ( f x 0 c x 0 f y c y 0 0 1 ) ( X c / Z c Y c / Z c 1 ) ( 8 ) \left(\right)= \left(uv1 \right) \left(fx000fy0cxcy1 \right)(8) uv1 = fx000fy0cxcy1 Xc/ZcYc/Zc1 (8)Xc/ZcYc/Zc1
可以认为像素坐标是对相机前方1处平面上的点采样和量化的过程,这个平面称为归一化平面,平面上点的坐标称为归一化坐标。
至此,我们推出了想要的结果!这个只和相机内部参数有关的矩阵
K
K
K即为相机的内参矩阵
K
=
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
7
)
K=\left(
有的时候还会引入一个
λ
\lambda
λ参数,来描述交轴误差(感光芯片的
X
,
Y
X,Y
X,Y轴没有完全垂直)
(
f
x
λ
c
x
0
f
y
c
y
0
0
1
)
\left(
注意:
- 感光芯片的最小单元一般不是严格的正方形,所以得到的 f x f_x fx和 f y f_y fy不一定相等。
- K一般会由相机生产商提供,如果没有提供则可以通过单目棋盘格张正友标定法确定,这个过程被称作内参标定。
- 实际使用中交轴误差不需要考虑
- 再次指出,这个内参矩阵是根据小孔成像模型推导出来的,但是实际的相机镜头组远远比这复杂,如果需要更高精度,应该探索使用其他工具进行标定。
外参矩阵描述的是世界坐标系下坐标与相机坐标系下坐标的转换关系,众所周知,两个坐标系之间的刚体变换可以通过旋转和平移描述,这里其实也没啥好说的。
(
X
c
Y
c
Z
c
)
=
[
R
t
]
(
X
w
Y
w
Z
w
1
)
(
8
)
\left(
P
c
=
[
R
t
]
P
w
~
P_c=[R \ \ \ t]\tilde{P_w}
Pc=[R t]Pw~
这里的
P
w
~
\tilde{P_w}
Pw~是齐次坐标,
P
w
~
=
[
P
w
1
]
T
\tilde{P_w}=[P_w \ \ 1]^T
Pw~=[Pw 1]T,
R
R
R是
3
×
3
3\times3
3×3的旋转矩阵,
t
t
t是
3
×
1
3\times1
3×1的平移向量,
R
R
R,
t
t
t称为相机的外参数。
这个地方如果不理解的,可以去搜索刚体变换,我这里就不写了
Z
c
P
u
v
=
Z
c
(
u
v
1
)
=
K
[
R
t
]
P
w
~
(
9
)
Z_cP_{uv}=Z_c \left(
实际的镜头由于屈光度与光阑位置的不同会导致成像出现径向畸变,透镜与成像平面不平行还会引起切向畸变。径向畸变最为常见,尤其是在照片的边缘上(这提醒我们,拍合照不要坐在边上:),一般鱼眼镜头容易出现桶形畸变,长焦镜头容易出现枕形畸变,效果如下:
如果相机畸变比较明显,那么用内外参获得像素坐标后,还需要再作用畸变系数,径向畸变模型:
u
d
i
s
t
o
r
t
e
d
=
u
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
v
d
i
s
t
o
r
t
e
d
=
v
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
u_{distorted}=u(1+k_1r^2+k_2r^4+k_3r^6)\\ v_{distorted}=v(1+k_1r^2+k_2r^4+k_3r^6)
udistorted=u(1+k1r2+k2r4+k3r6)vdistorted=v(1+k1r2+k2r4+k3r6)
镜像畸变其实很容易记住,其实就是
f
(
r
2
)
f(r^2)
f(r2)的泰勒展开,一般情况下只计算
k
1
k_1
k1和
k
2
k_2
k2。
切向就不记录了,如果有切向畸变那是厂家生产的问题,建议直接换一个,别自己校正了。。。。
不同镜头畸变模型不太一样,比如鱼眼镜头和广角镜头都有,这个地方我平时用不到,引用一篇比较完整的总结常用相机投影及畸变模型(针孔|广角|鱼眼),感兴趣的可以去学习。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。