赞
踩
相机分为短焦镜头和长焦镜头,短焦镜头看到的视野更广阔,同样距离大小的一颗树,在短焦相机中所占的像素个数较少。
长焦镜头看到的视野较窄,能看的更远。因为同样距离大小的一棵树,在长焦距镜头中的像素个数更多;
同一款芯片,短焦距fov大,长焦fov小。
要搞明白针孔相机模型,首先需要明确世界坐标系
O
X
w
Y
w
Z
w
OX_wY_wZ_w
OXwYwZw、相机坐标系
O
X
c
Y
c
Z
c
OX_cY_cZ_c
OXcYcZc、物理坐标系
O
X
l
Y
l
OX_lY_l
OXlYl和像素坐标系
O
U
V
OUV
OUV之间的关系。最重要的是需要理解物理坐标系和像素坐标系之间的变换关系。
坐标系之间的关系
什么是内参?
内参可以完成相机坐标系中点P到像素坐标系的投影。也就是说点P的反射光线,经过光心以及透镜的折射以后,会落在像素坐标系的那个像素坐标。以下面的公式讲解:
[
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
]
(
1
)
{
u
=
f
x
z
c
x
c
+
c
x
v
=
f
y
z
c
x
c
+
c
y
{
x
c
=
(
u
−
c
x
)
×
σ
u
f
×
z
c
=
(
u
−
c
x
)
f
x
×
z
c
y
c
=
(
v
−
c
y
)
×
σ
v
f
×
z
c
=
(
v
−
c
y
)
f
y
×
z
c
(
2
)
上式为点P在相机坐标系中的坐标
(
x
c
,
y
c
,
z
c
)
(x_c,y_c,z_c)
(xc,yc,zc)与像素坐标系坐标
(
u
,
v
)
(u,v)
(u,v)的关系。遵循相似三角形给原则,如下图:
其中, f为焦距,
p
p
p是相机坐标系中的坐标位置,
p
′
p'
p′为图像物理坐标系中的坐标位置。
p
′
(
x
l
,
y
l
)
p'(x_l,y_l)
p′(xl,yl)在像素坐标中的位置为:
u
=
(
x
l
−
c
x
)
×
σ
u
f
v
=
(
y
l
−
c
y
)
×
σ
v
f
f
x
=
f
σ
u
f
y
=
f
σ
v
u = {(x_l - c_x) \times \sigma_u \over f} \\ \ \\ v = {(y_l - c_y) \times \sigma_v \over f} \\ \ \\ f_x = {f \over \sigma_u }\\ \ \\ f_y = {f \over \sigma_v}
u=f(xl−cx)×σu v=f(yl−cy)×σv fx=σuf fy=σvf
所以说,内参的作用就是完成尺度转化和中心化。
点P在像素坐标系中的像素代表了光心与点P连线方向的射线上的所有点,如果你把式子(1)的相机坐标系坐标的xyz同时缩放m倍,得到的uv像素点是一致的。
反过来思考,如果给你一个像素点坐标uv, 以及内参矩阵,你可以得到该点在相机坐标系下的笛卡尔三维坐标吗?答案是不行的,因为缺少了深度信息。每个像素点都是一条射线,但是射线的长度你不知道。但是如果允许你进行深度的采样呐?也就是说假如相机的可见距离是200,那么采样2000个深度(2000个
z
c
z_c
zc),就可以得到2000个坐标点位置,这2000个点都在射线上,这也就是自动驾驶中LSS的原理。
如果某个像素是个接地点,那么也算是获得了深度的信息。根据相机距离地面的高度,就可以获得深度。注意这里的相机光轴需要水平,如果不水平,需要使用一个水平状态的相机坐标系作为中转,这就是接地点测距的原理。针孔相机中借助了深度为1的平面。
图像传感器尺寸,像素尺寸,焦距,FOV角之间的关系
假定某相机镜头焦距为f(mm),芯片尺寸为
w
,
h
w, h
w,h,垂直FOV角为
θ
v
\theta_v
θv,水平FOV角度为
θ
u
\theta_u
θu。那么,
t
a
n
(
θ
u
2
)
=
w
2
×
f
θ
u
=
2
×
a
r
c
t
a
n
(
w
2
×
f
)
θ
v
=
2
×
a
r
c
t
a
n
(
w
2
×
f
)
tan({\theta_u \over 2}) = {w \over 2 \times f} \\ \ \\ \theta_u = 2 \times arctan({w \over 2 \times f}) \\ \ \\ \theta_v= 2 \times arctan({w \over 2 \times f})
tan(2θu)=2×fw θu=2×arctan(2×fw) θv=2×arctan(2×fw)
给定某个物体所占的像素大小,得到物体真实大小深度的原理
假定有棵树与相机水平,真实高度为H,v方向占用像素M个, 像素尺寸
σ
v
\sigma_v
σv,焦距
f
f
f,深度为z。则:
H
M
×
σ
v
=
z
f
{H \over M \times \sigma_v} = {z \over f}
M×σvH=fz
上文已经讲解了内参的作用,给定一系列相机系下的三维点
P
{
p
1
,
p
2
,
.
.
.
,
p
n
}
,
p
i
∈
R
3
P\{p_1, p_2, ... , p_n\},p_i \in R_3
P{p1,p2,...,pn},pi∈R3。相机内参
I
∈
R
3
×
3
I \in R_{3\times3}
I∈R3×3。计算对应的像素点,将这团三维点投影到图片上。
如果图片发生了裁剪和缩放,为了使得这团激光点还可以正确的完成反投影,需要怎么调整内参?
假定原始的内外参矩阵为:
I
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
,
I =
图片缩放,在w方向缩放
t
w
t_w
tw倍,在h方向缩放
t
h
t_h
th倍
[
u
n
e
w
v
n
e
w
1
]
=
1
z
c
[
t
w
f
x
0
t
w
c
x
0
t
h
f
y
t
h
c
y
0
0
1
]
[
x
c
y
c
z
c
]
图片裁剪,以原图上的像素位置
(
m
x
,
m
y
)
(m_x,m_y)
(mx,my)为左上角裁剪
[
u
n
e
w
v
n
e
w
1
]
=
1
z
c
[
f
x
0
c
x
−
m
x
0
f
y
c
y
−
m
y
0
0
1
]
[
x
c
y
c
z
c
]
先从
(
m
x
,
m
y
)
(m_x,m_y)
(mx,my)开始裁剪,裁剪后的图片尺寸是原始尺寸的
T
1
T_1
T1倍,随后把裁剪后的图片扩大到原始图片的
T
2
T_2
T2 倍
[
u
v
1
]
=
1
z
c
[
T
2
T
1
f
x
0
T
2
T
1
(
c
x
−
m
x
)
0
T
2
T
1
f
y
T
2
T
1
(
c
y
−
m
y
)
0
0
1
]
[
x
c
y
c
z
c
]
先缩放后裁剪。先缩放到原始图片的
T
1
T_1
T1倍,然后从缩放后的图片的
(
m
x
,
m
y
)
(m_x,m_y)
(mx,my)开始裁剪。
[
u
v
1
]
=
1
z
c
[
T
1
f
x
0
T
1
c
x
−
m
x
0
T
1
f
y
T
1
c
y
−
m
y
0
0
1
]
[
x
c
y
c
z
c
]
相机的内参标定通常是转化为非线性优化的问题,通过多组3D空间点和像素点的一一对应关系,构建优化函数,然后通过LM算法或者高斯牛顿计算。
构建棋盘格坐标系,原点为棋盘格左上角点,X/Y轴分别为棋盘格的两条边,Z轴垂直棋盘格平面。
根据棋盘格的尺寸,可以得到一系列棋盘格的交叉点3D坐标
P
c
h
e
s
s
b
o
a
r
d
{
p
0
,
p
1
,
p
2
,
.
.
.
,
p
n
}
,
p
∈
R
3
P_{chessboard}\{p_0,p_1,p_2,...,p_n\},p \in R_3
Pchessboard{p0,p1,p2,...,pn},p∈R3。通过角点检测算法得到图片中的棋盘格格子角点的像素坐标(可以使用计算机视觉中的Harris算法,可以使用Opencv中的API)。最后根据外参(这里的外参是棋盘格坐标系到相机坐标系的变变换关系
T
c
h
e
s
s
b
o
a
r
d
c
a
m
e
r
a
T_{chessboard}^{camera}
Tchessboardcamera,图中是
T
c
a
m
e
r
a
c
h
e
s
s
b
o
a
r
d
T_{camera}^{chessboard}
Tcamerachessboard,我的习惯是写成前者,表示一个点从chessboar系到camera系的变换)和相机内参构建一系列的方程,通常至少需要四组点的对应关系。
那么现在的问题就是,我们得到了若干组的像素点与3D点的对应关系,怎么求解这里的内参矩阵和外参矩阵呐?这就需要提到张正友标定。
张式标定法的大致思路如下:
那么现在的问题就是,我们得到了若干组的像素点与3D点的对应关系,怎么求解这里的内参矩阵和外参矩阵呐?这就需要提到张正友标定。
张式标定法的大致思路如下:
在梳理这个问题之前,需要明白的是不同位置不同角度的标定板与相机坐标系之间的外参矩阵 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera是不同的,但是同一个位置标定板的不同角点坐标与相机之间的外参矩阵是一样的,还有就是所有位置所有角度拍摄的照片对应的内参是一样的。
因为棋盘坐标系垂直于棋盘格平面,所以这里的棋盘格点P的z轴坐标为0,因此得,
z
c
a
m
[
u
v
1
]
=
I
⋅
[
r
1
,
r
2
,
t
]
⋅
[
x
c
h
e
s
s
b
o
a
r
d
y
c
h
e
s
s
b
o
a
r
d
1
]
,
I
∈
R
3
×
3
,
r
i
∈
R
3
z
c
a
m
m
ˉ
=
H
⋅
M
ˉ
,
H
∈
R
3
×
3
,
m
ˉ
∈
R
3
,
M
ˉ
∈
R
3
H
=
I
⋅
[
r
1
,
r
2
,
t
]
=
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
I
=
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
u
=
h
11
x
c
h
e
s
s
b
o
a
r
d
+
h
12
x
c
h
e
s
s
b
o
a
r
d
+
h
13
h
31
x
c
h
e
s
s
b
o
a
r
d
+
h
32
x
c
h
e
s
s
b
o
a
r
d
+
h
33
×
1
z
c
a
m
v
=
h
21
x
c
h
e
s
s
b
o
a
r
d
+
h
22
x
c
h
e
s
s
b
o
a
r
d
+
h
23
h
31
x
c
h
e
s
s
b
o
a
r
d
+
h
32
x
c
h
e
s
s
b
o
a
r
d
+
h
33
×
1
z
c
a
m
每个对应关系可以构建上式(8)(9)两个式子,式(7)的9个参数中有个其次坐标,因为需要四个棋盘格系的坐标点,构成8个等式完成H矩阵的8个参数的求解。注意这四个点需要来自同一个位置的棋盘格标定板,因为H矩阵包含了外参,这8个等式的H矩阵需要保持一致。
B矩阵需要内参矩阵来求解, B = I − T I − 1 B = I^{-T}I^{-1} B=I−TI−1。为什么需要这个参数请看下边的分析
根据上文知道,
r
1
,
r
2
r_1,r_2
r1,r2是外参矩阵的前两列,这两个单位列向量正交,即
r
1
T
r
2
=
0
r_1^Tr_2=0
r1Tr2=0,由此可以得到下列的过程,记矩阵
H
=
[
h
1
,
h
2
,
h
3
]
,
h
i
∈
R
3
H=[h_1,h_2,h_3],h_i \in R_3
H=[h1,h2,h3],hi∈R3
[
h
1
,
h
2
,
h
3
]
=
I
[
r
1
,
r
2
,
t
]
h
1
=
I
r
1
,
h
2
=
I
r
2
r
1
=
I
−
1
h
1
,
r
2
=
I
−
1
h
2
r
1
T
r
2
=
h
1
T
I
−
T
I
−
1
h
2
=
0
r
2
T
r
1
=
h
2
T
I
−
T
I
−
1
h
1
=
0
I
=
[
f
x
γ
u
x
0
f
y
u
y
0
0
1
]
记矩阵
B
B
B为:
B
=
I
−
T
I
−
1
=
[
b
11
b
12
b
13
b
21
b
22
b
23
b
31
b
32
b
33
]
=
[
1
f
x
2
−
γ
f
x
2
f
y
c
y
γ
−
c
x
f
y
f
x
2
f
y
−
γ
f
x
2
f
y
γ
f
x
2
f
y
+
1
f
y
2
−
γ
(
c
y
γ
−
c
x
f
y
)
f
x
2
f
y
2
−
c
y
2
f
y
2
c
y
γ
−
c
x
f
y
f
x
2
f
y
−
γ
(
c
y
γ
−
c
x
f
y
)
f
x
2
f
y
2
−
c
y
2
f
y
2
(
c
y
γ
−
c
x
f
y
)
2
f
x
2
f
y
2
+
c
y
2
f
y
2
+
1
]
B
=
[
b
11
b
12
b
13
b
12
b
22
b
23
b
13
b
23
b
33
]
由式子(16)(17)我们可以知道在H矩阵已知的情况下,每个棋盘格位姿可以得到两个等式,内参据矩阵
I
I
I有5个参数需要求解,矩阵B有九个参数,但是因为矩阵B是个对称阵,所以矩阵B只剩下6个参数需要求解,因此我们需要三个棋盘格的位姿来完成6个等式的构建(每个棋盘格位姿选取超过4个角点坐标求出对应的H矩阵)。由此我们就求出了B矩阵,B矩阵与内参矩阵联系紧密。
因为B矩阵是个对称阵,因此B矩阵中还有6个参数需要求解,记作b。
b
=
[
b
11
,
b
12
,
b
22
,
b
21
,
b
22
,
b
33
]
T
b = [b_{11},b_{12},b_{22},b_{21},b_{22},b_{33}]^T
b=[b11,b12,b22,b21,b22,b33]T
因此,
h
1
T
I
−
T
I
−
1
h
2
=
0
h_1^TI^{-T}I^{-1}h_2=0
h1TI−TI−1h2=0可以完成下述推导,
h
1
T
I
−
T
I
−
1
h
2
=
h
1
B
h
2
=
[
h
11
,
h
12
,
h
13
]
[
b
11
b
12
b
13
b
21
b
22
b
23
b
31
b
32
b
33
]
[
h
21
h
22
h
23
]
=
v
i
j
b
v
12
=
[
h
11
h
21
,
h
11
h
22
+
h
12
h
21
,
h
12
h
22
,
h
13
h
21
+
h
11
h
23
,
h
13
h
22
+
h
12
h
23
,
h
13
h
23
]
T
然后结合式子(16)(17),可以得到下列等式,
[
v
12
T
v
11
T
−
v
22
T
]
⋅
[
b
11
,
b
12
,
b
22
,
b
21
,
b
22
,
b
33
]
T
=
[
v
12
T
v
11
T
−
v
22
T
]
b
=
0
因此,每个姿态的标定板(通过标定板上的四个角点位置)得到的H矩阵的帮助下,可以构建两个方程,限制B矩阵(B矩阵来源自内参,所以所有标定板姿态对应的B矩阵都一样)的两个自由度(B矩阵只有六个自由度)。所以我们需要三个位置姿态的标定板对应的H矩阵来构建6个方程,完成B矩阵6个自由度的限制。
记第一个标定板对应的V矩阵为
v
12
′
,
v
11
′
,
v
22
′
v'_{12},v'_{11},v'_{22}
v12′,v11′,v22′,第二个标定板对应的V矩阵为
v
12
′
′
,
v
11
′
′
,
v
22
′
′
v''_{12},v''_{11},v''_{22}
v12′′,v11′′,v22′′,第三个标定板对应的V矩阵为
v
12
′
′
′
,
v
11
′
′
′
,
v
22
′
′
′
v'''_{12},v'''_{11},v'''_{22}
v12′′′,v11′′′,v22′′′ 。那么结合式(24),我们可以得到,
[
v
′
12
T
v
′
11
T
−
v
′
22
T
v
′
′
12
T
v
′
′
11
T
−
v
′
′
22
T
v
′
′
′
12
T
v
′
′
′
11
T
−
v
′
′
′
22
T
]
⋅
[
b
11
b
12
b
22
b
31
b
32
b
33
]
=
A
⋅
b
=
0
利用非线性优化的方式,就能求出矩阵b。
第三步,利用
B
B
B矩阵求解内参矩阵
I
I
I
得到B矩阵以后,通过Cholesky分解得到相机的内参数
f
x
=
1
b
11
f
y
=
b
11
b
11
b
22
−
b
12
2
γ
=
−
f
x
2
f
y
b
12
c
y
=
b
12
b
13
−
b
11
b
23
b
11
b
22
−
b
12
2
c
x
=
c
y
γ
f
y
−
f
x
2
b
13
第四步,结合H矩阵和内参矩阵,求出每个姿态棋盘格的外参
第三步结束以后,得到了相机的内参矩阵。然后结合每个位姿棋盘格求出的H矩阵和上一步求出的内参矩阵求解每个位置姿态的棋盘格坐标系与相机坐标系之间的转换关系
T
c
h
e
s
s
b
o
a
r
d
c
a
m
e
r
a
T_{chessboard}^{camera}
Tchessboardcamera。
结合式(15),具体计算步骤如下:
r
1
=
I
−
1
h
1
r
2
=
I
−
1
h
2
r
3
=
r
1
×
r
2
t
=
I
−
1
h
3
到这里,我们已经得到了使用的所有位姿棋盘格与相机坐标系直接的外参关系
T
c
h
e
s
s
b
o
a
r
d
c
a
m
e
r
a
T_{chessboard}^{camera}
Tchessboardcamera,以及相机的内参。
总结一下之前的四步: 首先每个棋盘格姿态我们提取四个角点,构建8个方程,完成H矩阵的求解(H矩阵是内参矩阵和该棋盘格坐标系与相机坐标系的乘积,因此每个位资的棋盘格都对应一个H矩阵);然后另外选取2个位姿的棋盘格,求出另外两个H矩阵。再然后每个H矩阵构建一个两个方程,三个H矩阵构建六个方程,最后构建一个方程组,自变量就是B矩阵的6个参数,系数矩阵记为V矩阵,使用非线性优化的方式求出B矩阵;在然后借助Cholesky分解完成内参矩阵的求解;最后求解相机坐标系与所有棋盘格姿态的外参联系 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera。需要注意的是,上述的过程都是在假设没有畸变的情况下,也就是说式(3)是在无畸变的情况下构建的等式。所以求出的H矩阵,也就基于无畸变的假设,进而造成后续的B矩阵,I矩阵和外参矩阵都有一定的误差存在。所以下边的步骤将解决这里的误差
第五步,求解畸变参数
求畸变参数的过程也是最小化误差的过程,完成理想像素点坐标与畸变情况下的像素点坐标之间误差的最小化,最后构建一个方程组,使用LM算法完成最后畸变参数的求解。
记理想像素坐标为
(
u
,
v
)
(u,v)
(u,v),对应在图像物理坐标系的坐标为
(
x
l
,
y
l
)
(x_l,y_l)
(xl,yl),距离芯片中心的距离
r
c
=
x
l
2
+
y
l
2
r_c=\sqrt{x_l^2 + y_l^2}
rc=xl2+yl2
;携带畸变的像素坐标为
(
u
′
,
v
′
)
(u',v')
(u′,v′),对应在图像物理坐标系的坐标为
(
x
l
′
,
y
l
′
)
(x_l^{'},y_l^{'})
(xl′,yl′);感光芯片的像素尺寸为
(
σ
u
,
σ
v
)
(\sigma_u,\sigma_v)
(σu,σv);畸变参数为
k
1
,
k
2
,
k
3
,
k
4
k_1,k_2,k_3,k_4
k1,k2,k3,k4 。为了方便写公式,下文仅对
k
1
,
k
2
k_1,k_2
k1,k2进行求解,
k
3
,
k
4
k_3,k_4
k3,k4同理拓展即可。
u
=
x
l
σ
u
+
c
x
,
u
′
=
x
l
′
σ
u
+
c
x
v
=
y
l
σ
v
+
c
y
,
v
′
=
y
l
′
σ
v
+
c
y
结合式(35)和(36)可以推出,
u
−
c
x
=
(
u
′
−
c
x
)
×
(
1
+
k
1
r
c
2
+
k
2
r
c
4
)
v
−
c
y
=
(
v
′
−
c
y
)
×
(
1
+
k
1
r
c
2
+
k
2
r
c
4
)
进一步,得
[
(
c
x
−
u
′
)
r
c
2
(
c
x
−
u
′
)
r
c
4
(
c
y
−
v
′
)
r
c
2
(
c
y
−
v
′
)
r
c
4
]
[
k
1
k
2
]
=
[
u
′
−
u
v
′
−
v
]
上式中的理想像素坐标点,通过前四步求出的理想内外参矩阵完成棋盘格坐标系3D点的重投影,得到理想的像素点坐标。携带畸变的像素点坐标通过直接对图片进行角点检测得到对应的像素点。每个3D角点和像素点都可以构建式(39)的两个方程。为了可以最小化误差的影响,我们选择已经求出H矩阵的多个棋盘格(m个)位姿的多个3D角点和对应的图片角点像素坐标(n个),构建mn个方程,参照式子(39)的形式整理为矩阵相乘的形式。
[
(
c
x
−
u
′
)
r
c
2
(
c
x
−
u
′
)
r
c
4
(
c
y
−
v
′
)
r
c
2
(
c
y
−
v
′
)
r
c
4
.
.
.
.
.
.
.
.
]
[
k
1
k
2
]
=
[
u
′
−
u
v
′
−
v
.
.
.
.
.
.
.
.
.
.
.
.
]
记作,
D
⋅
k
=
d
D
=
[
(
c
x
−
u
′
)
r
c
2
(
c
x
−
u
′
)
r
c
4
(
c
y
−
v
′
)
r
c
2
(
c
y
−
v
′
)
r
c
4
.
.
.
.
.
.
.
.
]
d
=
[
u
′
−
u
v
′
−
v
.
.
.
.
.
.
.
.
.
.
.
.
]
使用最小二乘法,得到最后的结果
k
=
(
D
T
⋅
D
)
−
1
⋅
D
T
⋅
d
k = (D^T \cdot D)^{-1} \cdot D^T \cdot d
k=(DT⋅D)−1⋅DT⋅d
至此,就已经算出了所有的参数。
第六步,重投影,根据重投影误差优化参数
详情看代码
https://github.com/hjfenghj/PinholeCameraCalibration
棋盘格下载: 棋盘格下载
ros的相机标定工具箱: ROS相机内参标定工具箱
激光雷达和相机的联合标定工具箱
https://zhuanlan.zhihu.com/p/686197773
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。