针孔相机模型
针孔相机模型是实际研究中最常用的模型。针孔是一个中间有一个小孔的假想墙壁,光只能从小孔通过。
f
f
f是摄像机焦距,
Z
Z
Z是摄像机到物体的距离,
X
X
X是物体长度,是图像平面上的物体长度。由相似三角形可得:
−
x
=
f
X
Z
-x = f\frac{X}{Z}
−x=fZX
可将上图等价转换为如下所示系统,图像平面防止在针孔前方的摄像机模型(数学上等价,形式更简单)。
经过转换得到
x
p
=
f
x
c
z
c
y
p
=
f
y
c
z
c
⟺
z
c
[
x
p
y
p
1
]
=
[
f
0
0
0
f
0
0
0
1
]
[
x
c
y
c
z
c
]
\begin{aligned} x_p = f\frac{x_c}{z_c}\\ y_p = f\frac{y_c}{z_c} \end{aligned}\iff z_c\begin{bmatrix} x_p\\ y_p\\ 1 \end{bmatrix}= \begin{bmatrix} f&0&0\\ 0&f&0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_c\\y_c\\z_c \end{bmatrix}
xp=fzcxcyp=fzcyc⟺zc⎣⎡xpyp1⎦⎤=⎣⎡f000f0001⎦⎤⎣⎡xcyczc⎦⎤
物体投影到成像平面之后由采样器件采样后转换为数字信号,成为像素图像。
d
x
,
d
y
dx,dy
dx,dy分别为一个像素占据的成像平面的物理尺寸(x方向,y方向)。
由于像素坐标系的原点和图像坐标系的原点不同,建模时需要加上两者原点的偏移和
c
x
c_x
cx和
c
y
c_y
cy。
u
=
x
p
d
x
+
c
x
v
=
y
p
d
y
+
c
y
⟺
[
u
v
1
]
=
[
1
d
x
0
c
x
0
1
d
y
c
y
0
0
1
]
[
x
p
y
p
1
]
\begin{aligned} u &= \frac{x_p}{dx}+c_x \\ v &= \frac{y_p}{dy}+c_y \end{aligned}\iff \begin{bmatrix} u\\v\\1 \end{bmatrix}= \begin{bmatrix} \frac{1}{dx}&0&c_x\\ 0&\frac{1}{dy}&c_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_p\\y_p\\1 \end{bmatrix}
uv=dxxp+cx=dyyp+cy⟺⎣⎡uv1⎦⎤=⎣⎡dx1000dy10cxcy1⎦⎤⎣⎡xpyp1⎦⎤
于是
[
u
v
1
]
=
1
z
c
[
1
d
x
0
c
x
0
1
d
y
c
y
0
0
1
]
[
f
0
0
0
f
0
0
0
1
]
[
x
c
y
c
z
c
]
=
[
f
d
x
0
c
x
0
f
d
y
c
y
0
0
1
]
[
x
c
z
c
y
c
z
c
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
x
ˉ
y
ˉ
1
]
\begin{aligned} \begin{bmatrix} u\\v\\1 \end{bmatrix}&=\dfrac{1}{z_c}\begin{bmatrix} \frac{1}{dx}&0&c_x\\ 0&\frac{1}{dy}&c_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} f&0&0\\ 0&f&0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x_c\\y_c\\z_c \end{bmatrix}\\ &= \begin{bmatrix} \frac{f}{dx}&0&c_x\\ 0&\frac{f}{dy}&c_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} \frac{x_c}{z_c}\\ \frac{y_c}{z_c}\\ 1 \end{bmatrix}\\ &=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix} \begin{bmatrix} \bar{x}\\ \bar{y}\\ 1 \end{bmatrix} \end{aligned}
⎣⎡uv1⎦⎤=zc1⎣⎡dx1000dy10cxcy1⎦⎤⎣⎡f000f0001⎦⎤⎣⎡xcyczc⎦⎤=⎣⎡dxf000dyf0cxcy1⎦⎤⎣⎡zcxczcyc1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡xˉyˉ1⎦⎤
其中,
f
x
=
f
d
x
f_x=\dfrac{f}{dx}
fx=dxf和
f
y
=
f
d
y
f_y=\dfrac{f}{dy}
fy=dyf是x, y方向的缩放系数,由于像素点在成像仪上呈现的并不是完美的正方形,两者可能不相等。
x
ˉ
=
x
c
z
c
\bar{x}=\dfrac{x_c}{z_c}
xˉ=zcxc和
y
ˉ
=
y
c
z
c
\bar{y}=\dfrac{y_c}{z_c}
yˉ=zcyc是归一化坐标(相当于成像与
z
c
=
1
z_c=1
zc=1平面上)。
畸变模型
为了获得好的成像效果,通常在相机的前方加上透镜。透镜的引入会对成像过程中光线的传播产生新的影响:一是透镜自身的形状会对光线的传播产生影响,二是在机械组装过程中,透镜和成像平面不完全平行,这也会֯得光线穿过透镜投影到成像面时的位置发生变化。
由透镜形状引起的畸变称为径向畸变 。在针孔模型中,一条直线投影到像素平面上还是一条直线。可是,实际拍摄的照片中,摄像机的透镜往往使得真实环境中的一条直线在图片中变成了曲线。越靠近图像的边缘,这种现象越明显。由于实际加工制作的透镜往往是中心对称的,这使得不规则的畸变通常径向对称。它们主要分为两大类:桶形畸变和枕形畸变,如下图所示。
桶形畸变图像放大率随着与光轴之间的距离增加而减小,而枕形畸变则恰好相反。在这两种畸变中,穿过图像中心和光轴有交点的直线还能保持形状不变。
除了透镜的形状会引入径向畸变,由于在相机的组装过程中不能使透镜和成像面严格平行,所以也会引入切向畸变。
通常选用较为规则的图形例如黑白棋盘格进行相机标定,标定效果较好。使用OpenCV中摄像机标定的相关函数定得出相机内参数 c x , c y , f x , f y c_x, c_y, f_x, f_y cx,cy,fx,fy以及畸变校正系数 k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3。
对于径向畸变,可以用一个多项式函数来描述畸变前后的坐标变化:这类畸变可以用与距中心的距离有关的二次及高次多项式函数进行校正。考虑归一化平面上任意一点
p
\bm{p}
p,其坐标为
[
x
ˉ
,
y
ˉ
]
T
[\bar{x},\bar{y}]^T
[xˉ,yˉ]T,是未校正的点的坐标,也可以写成极坐标的形式
[
r
,
θ
]
T
[r,\theta]^T
[r,θ]T,其中
r
r
r表示点与坐标原点之间的距离,
θ
\theta
θ表示与水平轴的夹角。
x
ˉ
d
i
s
t
o
r
t
e
d
=
x
ˉ
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
ˉ
d
i
s
t
o
r
t
e
d
=
y
ˉ
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
\bar{x}_{distorted} = \bar{x}(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ \bar{y}_{distorted} = \bar{y}(1 + k_1r^2 + k_2r^4 + k_3r^6)
xˉdistorted=xˉ(1+k1r2+k2r4+k3r6)yˉdistorted=yˉ(1+k1r2+k2r4+k3r6)
其中
[
x
ˉ
d
i
s
t
o
r
t
e
d
,
y
ˉ
d
i
s
t
o
r
t
e
d
]
T
[\bar{x}_{distorted}, \bar{y}_{distorted}]^T
[xˉdistorted,yˉdistorted]T是校正后的点的归一化坐标。上述校正模型中,对于畸变较小的图像中心区域,畸变校正主要是
k
1
k_1
k1起作用;对于畸变较大的边缘区域,主要是
k
2
k_2
k2起作用。对于切向畸变,可以使用另外的两个参数
p
1
p_1
p1,
p
2
p_2
p2来进行校正:
x
ˉ
d
i
s
t
o
r
t
e
d
=
x
ˉ
+
2
p
1
x
ˉ
y
ˉ
+
p
2
(
r
2
+
2
x
ˉ
2
)
y
ˉ
d
i
s
t
o
r
t
e
d
=
y
ˉ
+
p
1
(
r
2
+
2
y
ˉ
2
)
+
2
p
2
x
ˉ
y
ˉ
\bar{x}_{distorted} = \bar{x} + 2p_1\bar{x}\bar{y} + p_2(r^2 + 2\bar{x}^2) \\ \bar{y}_{distorted} = \bar{y} + p_1(r^2 + 2\bar{y}^2) + 2p_2\bar{x}\bar{y}
xˉdistorted=xˉ+2p1xˉyˉ+p2(r2+2xˉ2)yˉdistorted=yˉ+p1(r2+2yˉ2)+2p2xˉyˉ
联合上式,对于相机坐标系中的一点P
(
x
c
,
y
c
,
z
c
)
(x_c,y_c,z_c)
(xc,yc,zc),能够通过5个畸变系数找到这个点在像素平面上的正确位置:
- 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [ x ˉ , y ˉ ] T [\bar{x},\bar{y}]^T [xˉ,yˉ]T。
- 对归一化平面上的点进行径向畸变和切向畸变校正。
{ x ˉ d i s t o r t e d = x ˉ ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x ˉ y ˉ + p 2 ( r 2 + 2 x ˉ 2 ) y ˉ d i s t o r t e d = y ˉ ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y ˉ 2 ) + 2 p 2 x ˉ y ˉ \begin{cases} \bar{x}_{distorted} = \bar{x}(1+k_1r^2+k_2r^4+k_3r^6)+2p_1\bar{x}\bar{y}+p_2(r^2+2\bar{x}^2)\\ \bar{y}_{distorted} = \bar{y}(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2\bar{y}^2)+2p_2\bar{x}\bar{y} \end{cases} {xˉdistorted=xˉ(1+k1r2+k2r4+k3r6)+2p1xˉyˉ+p2(r2+2xˉ2)yˉdistorted=yˉ(1+k1r2+k2r4+k3r6)+p1(r2+2yˉ2)+2p2xˉyˉ - 将校正后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置。
{ u = f x x ˉ d i s t o r t e d + c x v = f y y ˉ d i s t o r t e d + c y \begin{cases} u = f_x\bar{x}_{distorted}+c_x\\ v = f_y\bar{y}_{distorted}+c_y \end{cases} {u=fxxˉdistorted+cxv=fyyˉdistorted+cy
张正友标定法
基于二维平面靶标的标定方法,使用相机在不同角度下拍摄多幅平面靶标的图像,比如棋盘格的图像,然后通过对棋盘格的角点进行计算分析来进行相机标定(求解相机的内外参数)。
- 对每一幅图像得到一个映射矩阵(单应矩阵)H
内参矩阵设为K
假定模板平面在世界坐标系Z=0的平面上,则有
s [ u v 1 ] = K ( r 1 r 2 r 3 t ) [ X Y Z 1 ] = K ( r 1 r 2 t ) [ X Y 1 ] s\begin{bmatrix}u\\v\\1\end{bmatrix} =K\begin{pmatrix}r_1&r_2&r_3&t\end{pmatrix} \begin{bmatrix}X\\Y\\Z\\1\end{bmatrix}= K\begin{pmatrix}r_1&r_2&t\end{pmatrix} \begin{bmatrix}X\\Y\\1\end{bmatrix} s⎣⎡uv1⎦⎤=K(r1r2r3t)⎣⎢⎢⎡XYZ1⎦⎥⎥⎤=K(r1r2t)⎣⎡XY1⎦⎤
可得到单应矩阵
H = ( h 1 h 2 h 3 ) = λ K ( r 1 r 2 t ) H = (h_1 h_2 h_3)=\lambda K(r_1r_2t) H=(h1h2h3)=λK(r1r2t)
利用单应矩阵可得到内参矩阵K的约束条件为
h 1 T K − T K − 1 h 2 = 0 h_1^TK^{-T}K^{-1}h_2=0 h1TK−TK−1h2=0 - 利用约束条件线性求解内参矩阵K
假设存在
B = K − T K − 1 B=K^{-T}K^{-1} B=K−TK−1
式中,B为对称矩阵,基于绝对二次曲面原理求出B以后,再对B矩阵求逆,并从中导出内参矩阵A,再由A和单应矩阵H计算外参R和t。 - 最大似然估计
采用最大似然准则优化上述参数。