一、针孔相机模型
如图所示为针孔相机模型,
O
c
a
m
?
X
c
a
m
?
Y
c
a
m
?
Z
c
a
m
O_{cam}-X_{cam}-Y_{cam}-Z_{cam}
Ocam??Xcam??Ycam??Zcam?为相机坐标系,
O
c
a
m
O_{cam}
Ocam?为相机光心,习惯上,让
Z
c
a
m
Z_{cam}
Zcam?轴指向相机拍摄朝向的正前方,
X
c
a
m
X_{cam}
Xcam?轴向右(从
Z
c
a
m
Z_{cam}
Zcam?轴负方向,向正方向看),
Y
c
a
m
Y_{cam}
Ycam?轴向下。
O
o
?
X
?
Y
O_o-X-Y
Oo??X?Y为物理成像平面,位于
Z
c
a
m
Z_{cam}
Zcam?轴负方向,距离相机光心
f
f
f处,
f
f
f为相机焦距。
二、内参数矩阵
相机坐标系内一点
M
M
M的坐标为
(
x
c
a
m
,
y
c
a
m
,
z
c
a
m
)
(x_{cam},y_{cam},z_{cam})
(xcam?,ycam?,zcam?),经过上述针孔相机模型后,投影到成像平面上一点
m
m
m,坐标为
(
x
,
y
)
(x,y)
(x,y)。
从
Y
c
a
m
Y_{cam}
Ycam?轴负方向朝正方向看(上图中,从上往下看),有如下相似三角形关系: 根据三角形相似关系,有:
z
c
a
m
f
=
x
c
a
m
?
x
\frac{z_{cam}}{f}=\frac{x_{cam}}{-x}
fzcam??=?xxcam?? 同理,也会有:
z
c
a
m
f
=
y
c
a
m
?
y
\frac{z_{cam}}{f}=\frac{y_{cam}}{-y}
fzcam??=?yycam??
公式中的负号是因为针孔成像所成的像是倒像,
在坐标的表现上就是位于
X
c
a
m
X_{cam}
Xcam?正半轴的点经过投影后,会被投影到
X
X
X负半轴;
位于
Y
c
a
m
Y_{cam}
Ycam?正半轴的点经过投影后,会被投影到
Y
Y
Y负半轴。
为了将公式中的负号去掉,使式子更加简洁,人们将成像平面对称到摄像机前方,如下图所示: 公式中的负号被去掉:
z
c
a
m
f
=
x
c
a
m
x
(1)
\frac{z_{cam}}{f}=\frac{x_{cam}}{x}\tag{1}
fzcam??=xxcam??(1) 同理,也会有:
z
c
a
m
f
=
y
c
a
m
y
(2)
\frac{z_{cam}}{f}=\frac{y_{cam}}{y}\tag{2}
fzcam??=yycam??(2) 整理,将
x
,
y
x,y
x,y放到同一侧:
x
=
f
x
c
a
m
z
c
a
m
(3)
x=f\frac{x_{cam}}{z_{cam}}\tag{3}
x=fzcam?xcam??(3)
y
=
f
y
c
a
m
y
c
a
m
(4)
y=f\frac{y_{cam}}{y_{cam}}\tag{4}
y=fycam?ycam??(4)
此时,所有变量仍是以长度为单位,比如毫米,如可以说焦距
f
f
f是5毫米。
但实际上,相机最后拍摄得到的相片是由一个个像素点组成的,所以我们还需要将物理成像平面坐标系转变成像素坐标系,通常像素平面坐标系的原点会被定义在物理成像平面的左上角,横轴、纵轴与物理成像平面坐标系的横轴、纵轴平行,如下图所示: 为将长度单位转换成像素单位,定义了两个参数
α
,
β
α,β
α,β,单位为
像
素
/
米
像素/米
像素/米,用以表征每个像素的尺寸,具体意义是一米的长度内,由多少个像素组成,属于与相机生产时的硬件相关的参数,如下图举例所示: 横轴方向上,5个像素的长度为1米,所以
α
=
5
像
素
/
米
α=5像素/米
α=5像素/米,纵轴方向上,10个像素的长度为1米(像素可以不是正方形),所以
β
=
10
像
素
/
米
β=10像素/米
β=10像素/米。
于是,物理成像平面上的坐标与像素平面上的坐标的转换关系如下:
u
=
α
x
+
c
x
(5)
u=αx+c_x\tag{5}
u=αx+cx?(5)
v
=
β
y
+
c
y
(6)
v=βy+c_y\tag{6}
v=βy+cy?(6) 其中,
c
x
,
c
y
c_x,c_y
cx?,cy?为物理成像坐标系的原点相对于像素坐标系的原点的偏移量,单位是
像
素
像素
像素。
将公式3、4代入5、6,可得:
u
=
f
α
x
c
a
m
z
c
a
m
+
c
x
u=fα\frac{x_{cam}}{z_{cam}}+c_x
u=fαzcam?xcam??+cx?
v
=
f
β
y
c
a
m
z
c
a
m
+
c
y
v=fβ\frac{y_{cam}}{z_{cam}}+c_y
v=fβzcam?ycam??+cy? 令
f
α
=
f
x
fα=f_x
fα=fx?,
f
β
=
f
y
fβ=f_y
fβ=fy?得:
u
=
f
x
x
c
a
m
z
c
a
m
+
c
x
(7)
u=f_x\frac{x_{cam}}{z_{cam}}+c_x\tag{7}
u=fx?zcam?xcam??+cx?(7)
v
=
f
y
y
c
a
m
z
c
a
m
+
c
y
(8)
v=f_y\frac{y_{cam}}{z_{cam}}+c_y\tag{8}
v=fy?zcam?ycam??+cy?(8)
通过齐次坐标形式,将式7、8转换成简洁的矩阵形式: 像素坐标
(
u
,
v
)
(u,v)
(u,v)的齐次坐标形式为
(
u
,
v
,
1
)
(u,v,1)
(u,v,1)
[
u
v
]
→
[
u
v
1
]
=
[
f
x
x
c
a
m
z
c
a
m
+
c
x
f
y
y
c
a
m
z
c
a
m
+
c
y
1
]
\begin{bmatrix} u \\ v \\ \end{bmatrix} →\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix}=\begin{bmatrix} f_x\frac{x_cam}{z_cam}+c_x \\ f_y\frac{y_cam}{z_cam}+c_y \\ 1 \\ \end{bmatrix}
[uv?]→???uv1????=???fx?zc?amxc?am?+cx?fy?zc?amyc?am?+cy?1???? 两边乘上
z
c
a
m
z_{cam}
zcam?:
z
c
a
m
[
u
v
1
]
=
[
f
x
x
c
a
m
+
c
x
z
c
a
m
f
y
y
c
a
m
+
c
y
z
c
a
m
z
c
a
m
]
=
[
f
x
0
c
x
0
0
f
y
c
y
0
0
0
1
0
]
[
x
c
a
m
y
c
a
m
z
c
a
m
1
]
z_{cam}\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix}=\begin{bmatrix} f_xx_{cam}+c_xz_{cam} \\ f_yy_{cam}+c_yz_{cam} \\ z_{cam} \\ \end{bmatrix}=\begin{bmatrix} f_x&0&c_x&0 \\ 0&f_y&c_y&0 \\ 0&0&1&0\\ \end{bmatrix}\begin{bmatrix} x_{cam}\\ y_{cam}\\ z_{cam}\\ 1\\ \end{bmatrix}
zcam????uv1????=???fx?xcam?+cx?zcam?fy?ycam?+cy?zcam?zcam?????=???fx?00?0fy?0?cx?cy?1?000?????????xcam?ycam?zcam?1?????? 最终得到:
z
c
a
m
[
u
v
1
]
=
[
f
x
0
c
x
0
0
f
y
c
y
0
0
0
1
0
]
[
x
c
a
m
y
c
a
m
z
c
a
m
1
]
(9)
z_{cam}\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix}=\begin{bmatrix} f_x&0&c_x&0 \\ 0&f_y&c_y&0 \\ 0&0&1&0\\ \end{bmatrix}\begin{bmatrix} x_{cam}\\ y_{cam}\\ z_{cam}\\ 1\\ \end{bmatrix}\tag{9}
zcam????uv1????=???fx?00?0fy?0?cx?cy?1?000?????????xcam?ycam?zcam?1??????(9)
式9完成了将相机坐标系上的坐标
(
x
c
a
m
,
y
c
a
m
,
z
c
a
m
)
(x_{cam},y_{cam},z_{cam})
(xcam?,ycam?,zcam?)转换成像素平面上的坐标
(
u
,
v
)
(u,v)
(u,v)的任务
令
K
=
[
f
x
0
c
x
0
0
f
y
c
y
0
0
0
1
0
]
K=\begin{bmatrix} f_x&0&c_x&0 \\ 0&f_y&c_y&0 \\ 0&0&1&0\\ \end{bmatrix}
K=???fx?00?0fy?0?cx?cy?1?000????,便是相机内参数矩阵。
其中包含了几个相机的硬件信息,
f
f
f焦距,长度单位,如mm;
c
x
,
c
y
c_x,c_y
cx?,cy?成像平面坐标系原点相对于像素平面坐标系原点的偏移量,像素单位;
α
,
β
α,β
α,β单位长度上的像素个数,单位如:像素/mm。
注意:
z
c
a
m
z_{cam}
zcam?实际上是三维空间点的深度信息,在投影过程中丢失了,而三维重建工作的很大一部分任务都是设法还原这个深度信息。 举个例子来说,像素坐标系上得到的一个投影点
m
m
m,实际上只能知道它是由射线
O
M
OM
OM上的任意一个点投影得到的,但单纯从这个投影关系来说,是无法知道具体是射线
O
M
OM
OM上的哪个具体位置的点投影过来得到的投影点
m
m
m,因为整条射线
O
M
OM
OM上的所有点(无穷多个)只要投影到像素坐标系上,都会重叠在
m
m
m处。
三、外参数矩阵
上述推导过程中,使用的是摄像机坐标系上的坐标
M
(
x
c
a
m
,
y
c
a
m
,
z
c
a
m
)
M(x_{cam},y_{cam},z_{cam})
M(xcam?,ycam?,zcam?),但通常情况下,能知道的都是世界坐标系上的坐标,而当摄像机坐标系与世界坐标系并不重合时,就需要通过坐标转换,将世界坐标系上的坐标转换成摄像机坐标系上的坐标。
https://blog.csdn.net/weixin_44179561/article/details/124149297 详细描述了世界坐标系上的坐标转换成摄像机坐标系上的坐标的过程。
里面所使用的旋转矩阵
R
c
2
w
R_{c2w}
Rc2w?和平移量
T
c
2
w
T_{c2w}
Tc2w?,便是相机的外参数,其表征了相机坐标系经过怎样的运动和位姿变化,才能与世界坐标系重合。
|