c++ opencv相机标定原理
相机标定(相机校准)
真实物体通过相机在图像中显示。可以通过一个数学模型将真实物体的三维坐标与图像中的二维坐标一一对应,这个数学模型(相机矩阵)的求取计算过程就是相机标定。
从三维坐标(世界坐标系)到二维坐标(图像坐标系)又可以分为三个步骤:
(1)从世界坐标转换到相机坐标;
(2)从相机坐标转换到图像坐标;
(3)从图像坐标转换到像素坐标。
四个坐标系之间的关系图
(1)坐标系(Xw, Yw, Zw)为世界坐标系;
(2)坐标系(Xc, Yc, Zc)为相机坐标系;
(3)坐标系(x, y)为图像坐标系;
(4)坐标系(u, v)为像素坐标系;
从世界坐标转换到相机坐标
点P从世界坐标(Xpw, Ypw, Zpw)到相机坐标(Xpc, Ypc, Zpc)的变换包含了一个三维的旋转变换R以及一个平移变换t,齐次表达式为:
[
X
p
c
Y
p
c
Z
p
c
]
=
[
R
∣
t
]
[
X
p
w
Y
p
w
Z
p
w
1
]
\left[\begin{array}{c}X p c \\ Y p c \\ Z p c\end{array}\right]=[R \mid t]\left[\begin{array}{c}X p w \\ Y p w \\ Z p w \\ 1\end{array}\right]
XpcYpcZpc
=[R∣t]
XpwYpwZpw1
其中R为3×3大小的旋转矩阵,t为3×1的平移矩阵,变换矩阵P为3×4大小的矩阵:
P
=
[
R
∣
t
]
P=[R \mid t]
P=[R∣t]
从相机坐标转换到图像坐标
根据小孔成像模型,则由P的相机坐标(Xpc, Ypc, Zpc)到图像坐标(xp, yp)有:
y
p
=
f
y
×
Y
p
c
Z
p
c
x
p
=
f
x
×
X
p
c
Z
p
c
\begin{aligned} & y_p=f_y \times \frac{Y p c}{Z p c} \\ & x_p=f_x \times \frac{X p c}{Z p c} \end{aligned}
yp=fy×ZpcYpcxp=fx×ZpcXpc
转换为矩阵为:
[
x
p
y
p
1
]
=
1
Z
p
c
[
f
x
0
0
0
f
y
0
0
0
1
]
[
X
p
c
Y
p
c
Z
p
c
]
\left[\begin{array}{c} x_p \\ y_p \\ 1 \end{array}\right]=\frac{1}{Z_{p c}}\left[\begin{array}{ccc} f_x & 0 & 0 \\ 0 & f_y & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} X_{p c} \\ Y_{p c} \\ Z_{p c} \end{array}\right]
xpyp1
=Zpc1
fx000fy0001
XpcYpcZpc
fx, fy分别为x, y方向上的焦距。
从图像坐标转换到像素坐标
图像坐标系平面可以认为是理想的成像面,像素坐标系则是相机传感器平面,理想情况下图像坐标平面和像素坐标平面在同一平面,则从图像坐标转换到像素坐标有两个步骤:
(1)缩放,在前面的坐标系中,坐标系单位是统一的实际距离单位,但是像素坐标系的单位不一样,因此要缩放,换算到像素坐标系;
(2)平移,从图像坐标系原点到像素坐标系原点。
则变换为:
[
u
p
v
p
1
]
=
[
s
x
0
c
x
0
s
y
c
y
0
0
1
]
[
x
p
y
p
1
]
\left[\begin{array}{c} u_p \\ v_p \\ 1 \end{array}\right]=\left[\begin{array}{ccc} s_x & 0 & c_x \\ 0 & s_y & c_y \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x_p \\ y_p \\ 1 \end{array}\right]
upvp1
=
sx000sy0cxcy1
xpyp1
其中sx和sy为单位长度的像素数。
以上是理论情况下,但是在实际中可能由于相机传感器的问题导致图像轴不垂直的情况,如下图
像素偏斜
可以认为在y方向坐标不变,x方向坐标存在偏移,则有
[
u
p
v
p
1
]
=
[
s
x
c
c
x
0
s
y
c
y
0
0
1
]
[
x
p
y
p
1
]
\left[\begin{array}{c} u_p \\ v_p \\ 1 \end{array}\right]=\left[\begin{array}{ccc} s_x & c & c_x \\ 0 & s_y & c_y \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x_p \\ y_p \\ 1 \end{array}\right]
upvp1
=
sx00csy0cxcy1
xpyp1
其中c为偏移系数。
相机内参、外参
由1.1, 1.2, 1.3小结,得到最终的由世界坐标到像素坐标转换关系:
[
u
p
v
p
1
]
=
[
s
x
c
c
x
0
s
y
c
y
0
0
1
]
1
Z
p
c
[
f
x
0
0
0
f
y
0
0
0
1
]
[
R
∣
t
]
[
X
p
w
Y
p
w
Z
p
w
1
]
\left[\begin{array}{c} u_p \\ v_p \\ 1 \end{array}\right]=\left[\begin{array}{ccc} s_x & c & c_x \\ 0 & s_y & c_y \\ 0 & 0 & 1 \end{array}\right] \frac{1}{Z_{p c}}\left[\begin{array}{ccc} f_x & 0 & 0 \\ 0 & f_y & 0 \\ 0 & 0 & 1 \end{array}\right][R \mid t]\left[\begin{array}{c} X p w \\ Y p w \\ Z p w \\ 1 \end{array}\right]
upvp1
=
sx00csy0cxcy1
Zpc1
fx000fy0001
[R∣t]
XpwYpwZpw1
即:
s
[
u
p
v
p
1
]
=
[
f
x
s
x
f
y
c
c
x
0
f
y
s
y
c
y
0
0
1
]
[
R
∣
t
]
[
X
p
w
Y
p
w
Z
p
w
1
]
s\left[\begin{array}{c} u_p \\ v_p \\ 1 \end{array}\right]=\left[\begin{array}{ccc} f_x s_x & f_yc & c x \\ 0 & f_y s_y & c y \\ 0 & 0 & 1 \end{array}\right][R \mid t]\left[\begin{array}{c} X p w \\ Y p w \\ Z p w \\ 1 \end{array}\right]
s
upvp1
=
fxsx00fycfysy0cxcy1
[R∣t]
XpwYpwZpw1
得到:
s
m
~
=
A
[
R
∣
t
]
M
~
其中:
s
=
Z
p
c
为尺度参数
A
是相机内参,
R
,
t
是相机外参
m
~
为图像的齐次坐标
[
u
,
v
,
1
]
T
M
~
为模型点的齐次坐标
[
X
p
w
,
Y
p
w
,
Z
p
w
,
1
]
T
A
=
[
f
x
s
x
f
y
c
c
x
0
f
y
s
y
c
y
0
0
1
]
s \tilde{m}=\mathbf{A}[\mathbf{R} \mid \mathbf{t}] \tilde{\mathbf{M}}\\ 其中:\\ s=Z_{pc}为尺度参数\\ A是相机内参,R,t是相机外参\\ \tilde{m}为图像的齐次坐标[u,v,1]^T\\ \tilde{\mathbf{M}}为模型点的齐次坐标[X_{pw},Y_{pw},Z_{pw},1]^T\\ A=\left[\begin{array}{ccc} f_x s_x & f_yc & c x \\ 0 & f_y s_y & c y \\ 0 & 0 & 1 \end{array}\right]
sm~=A[R∣t]M~其中:s=Zpc为尺度参数A是相机内参,R,t是相机外参m~为图像的齐次坐标[u,v,1]TM~为模型点的齐次坐标[Xpw,Ypw,Zpw,1]TA=
fxsx00fycfysy0cxcy1
镜头畸变系数
除了相机硬件的参数外,镜头也不会是理想中的完美镜头,由于镜头的缺陷也会导致坐标换算出现误差,因此需要考虑镜头带来的图像失真。镜头带来的畸变包括径向畸变和切向畸变两种。
径向畸变
当光线在镜头边缘附近比在其光学中心弯曲得更多时,就会发生径向畸变。镜头越小,畸变越大。包含枕形(pincushion)、桶形(barrel)两种:
径向畸变通过径向畸变系数模型表示并校正:
x
畸变
=
x
(
1
+
k
1
∗
r
2
+
k
2
∗
r
4
+
k
3
∗
r
6
)
y
畸变
=
y
(
1
+
k
1
∗
r
2
+
k
2
∗
r
4
+
k
3
∗
r
6
)
\begin{aligned} & x_{\text {畸变 }}=x\left(1+k_1 * r^2+k_2 * r^4+k_3 * r^6\right) \\ & y_{\text {畸变 }}=y\left(1+k_1 * r^2+k_2 * r^4+k_3 * r^6\right) \end{aligned}
x畸变 =x(1+k1∗r2+k2∗r4+k3∗r6)y畸变 =y(1+k1∗r2+k2∗r4+k3∗r6)
其中:
x, y为未发生畸变的像素位置;
k1, k2, k3为径向畸变系数,一般两个系数就足够校准,但是对于大畸变如广角镜头就需要三个系数;
r^2 = x^2 + y^2.
切向畸变
当镜头和像平面不平行时会发生切向畸变:
切向畸变通过切向畸变系数模型表示并校正:
x
畸变
=
x
+
[
2
∗
p
1
∗
x
∗
y
+
p
2
∗
(
r
2
+
2
∗
x
2
)
]
y
畸变
=
y
+
[
p
1
∗
(
r
2
+
2
∗
y
2
)
+
2
∗
p
2
∗
x
∗
y
]
\begin{gathered} x_{\text {畸变 }}=x+\left[2 * p_1 * x * y+p_2 *\left(r^2+2 * x^2\right)\right] \\ y_{\text {畸变 }}=y+\left[p_1 *\left(r^2+2 * y^2\right)+2 * p_2 * x * y\right] \end{gathered}
x畸变 =x+[2∗p1∗x∗y+p2∗(r2+2∗x2)]y畸变 =y+[p1∗(r2+2∗y2)+2∗p2∗x∗y]
x, y为未发生畸变的像素位置;
k1, k2为切向畸变系数;
r^2 = x^2 + y^2.
小结
相机标定主要计算:
(1)相机外参:世界坐标系到相机坐标系的变换矩阵(三轴旋转角度+三轴平移量总共6个参数)
(2)相机内参:焦距(fx, fy),光心/主点(cx, cy),倾斜系数(c)(5个参数)
(3)镜头畸变系数:径向畸变系数和切向畸变系数(k1, k2, p1, p2,4个参数)
张正友标定法
单应性、单应性矩阵、齐次坐标
单应性:平面的单应性被定义为从一个平面到另一个平面的投影映射,单应性变换或投影变换;
单应性矩阵:两个投影平面的变换矩阵,投影变换矩阵;
齐次坐标:类似定义三维空间坐标系的笛卡尔坐标系,齐次坐标系定义投影空间,齐次坐标与笛卡尔坐标转换关系如下:
二维平面:
笛卡尔坐标
:
(
x
,
y
)
齐次坐标
:
(
x
′
,
y
′
,
w
′
)
则有
:
x
=
x
w
y
=
y
w
笛卡尔坐标: (x, y)\\ 齐次坐标 : \left(x^{\prime}, y^{\prime}, w^{\prime}\right)\\ 则有:\\ \begin{aligned} & x=\frac{x}{w} \\ & y=\frac{y}{w} \end{aligned}
笛卡尔坐标:(x,y)齐次坐标:(x′,y′,w′)则有:x=wxy=wy
三维空间:
笛卡尔坐标
:
(
x
,
y
,
z
)
齐次坐标
:
(
x
′
,
y
′
,
z
′
,
w
′
)
则有
:
x
=
x
w
y
=
y
′
w
z
=
z
′
w
笛卡尔坐标: (x, y, z)\\ 齐次坐标 : \left(x^{\prime}, y^{\prime}, z^{\prime}, w^{\prime}\right)\\ 则有:\\ \begin{aligned} & x=\frac{x}{w} \\ & y=\frac{y^{\prime}}{w} \\ & z=\frac{z^{\prime}}{w} \end{aligned}
笛卡尔坐标:(x,y,z)齐次坐标:(x′,y′,z′,w′)则有:x=wxy=wy′z=wz′
张正友标定法数学模型
基本方程
在不考虑镜头畸变时,模型点到图像点的变换关系表示为:
s
m
~
=
A
[
R
∣
t
]
M
~
(1)
s \tilde{m}=\mathbf{A}[\mathbf{R} \mid \mathbf{t}] \tilde{\mathbf{M}}\tag{1}
sm~=A[R∣t]M~(1)
其中:
A
是相机内参矩阵
,
R
,
t
是相机外参
,
s
为尺度系数。
m
~
为图像的齐次坐标
[
u
,
v
,
1
]
T
M
~
为模型点的齐次坐标
[
X
,
Y
,
Z
,
1
]
T
A 是相机内参矩阵, \mathbf{R}, t 是相机外参, s为尺度系数。\\ \tilde{m} 为图像的齐次坐标 [u, v, 1]^T\\ \tilde{M} 为模型点的齐次坐标 [X, Y, Z, 1]^T
A是相机内参矩阵,R,t是相机外参,s为尺度系数。m~为图像的齐次坐标[u,v,1]TM~为模型点的齐次坐标[X,Y,Z,1]T
假设模型平面在世界坐标系的Z = 0(标定时将棋盘格作为世界坐标系原点,则Z=0)上。让我们用ri表示旋转矩阵R的第i列,则由(1)有:
s
[
u
v
1
]
=
A
[
r
1
,
r
2
,
r
3
,
t
]
[
X
Y
0
1
]
=
A
[
r
1
,
r
2
,
t
]
[
X
Y
1
]
⇒
s
m
~
=
H
M
~
(2)
\begin{aligned} & s\left[\begin{array}{c} u \\ v \\ 1 \end{array}\right]=\mathbf{A}[\mathbf{r} 1, \mathbf{r} \mathbf{2}, \mathbf{r} 3, \mathbf{t}]\left[\begin{array}{c} X \\ Y \\ 0 \\ 1 \end{array}\right]=\mathbf{A}[\mathbf{r} \mathbf{1}, \mathbf{r} \mathbf{2}, \mathbf{t}]\left[\begin{array}{c} X \\ Y \\ 1 \end{array}\right] \\ & \Rightarrow s \tilde{m}=\mathbf{H} \tilde{\mathbf{M}} \end{aligned}\tag{2}
s
uv1
=A[r1,r2,r3,t]
XY01
=A[r1,r2,t]
XY1
⇒sm~=HM~(2)
其中:
H
=
A
[
r
1
,
r
2
,
t
]
\mathbf{H}=\mathbf{A}[\mathbf{r} \mathbf{1}, \mathbf{r} \mathbf{2}, \mathbf{t}]
H=A[r1,r2,t]
H是一个3×3的系数矩阵(单应性矩阵):
H
=
A
[
r
1
,
r
2
,
t
]
=
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
(3)
\mathbf{H}=\mathbf{A}[\mathbf{r} 1, \mathbf{r} 2, \mathbf{t}]=\left[\begin{array}{lll} h 11 & h 12 & h 13 \\ h 21 & h 22 & h 23 \\ h 31 & h 32 & h 33 \end{array}\right]\tag{3}
H=A[r1,r2,t]=
h11h21h31h12h22h32h13h23h33
(3)
对于齐次坐标系中的H有性质:
这里使用的是齐次坐标系,也就是说可以进行任意尺度的缩放(s为尺度因子),也就是说把H乘以任意一个非零常数k并不改变上式结果,无非就是尺度因子s有所改变。
例如将H乘以1/h33:
H
′
=
1
h
33
H
=
[
h
1
1
′
h
1
2
′
h
1
3
′
h
2
1
′
h
2
2
′
h
2
3
′
h
3
1
′
h
3
2
′
1
]
H^{\prime}=\frac{1}{h 33} H=\left[\begin{array}{ccc} h 11^{\prime} & h 12^{\prime} & h 13^{\prime} \\ h 21^{\prime} & h 22^{\prime} & h 23^{\prime} \\ h 31^{\prime} & h 32^{\prime} & 1 \end{array}\right]
H′=h331H=
h11′h21′h31′h12′h22′h32′h13′h23′1
H’与H带入公式(2)得到的计算结果u, v相等。因此可以认为H只有8个自由度。
内在参数的约束条件
令 H = [h1 h2 h3],则由公式(3)有:
[
h
1
h
2
h
3
]
=
k
A
[
r
1
r
2
t
]
(4)
\left[\begin{array}{lll} h 1 & h 2 & h 3 \end{array}\right]=k A\left[\begin{array}{lll} r 1 & r 2 & t \end{array}\right]\tag{4}
[h1h2h3]=kA[r1r2t](4)
其中k为任意的尺度因子。由于旋转矩阵是一个标准的正交矩形,因此r1和r2为正交的单位向量,有:
r
1
T
r
2
=
0
r
1
T
r
1
=
r
2
T
r
2
=
1
(5)
\begin{aligned} & r_1^T r_2=0 \\ & r_1^T r_1=r_2^T r_2=1 \end{aligned}\tag{5}
r1Tr2=0r1Tr1=r2Tr2=1(5)
有公式(4)有:
h
1
=
k
A
r
1
h
2
=
k
A
r
2
(6)
\begin{aligned} & h 1=k A r_1 \\ & h 2=k A r_2 \end{aligned}\tag{6}
h1=kAr1h2=kAr2(6)
进一步由公式(6)得到:
r
1
=
k
−
1
A
−
1
h
1
r
2
=
k
−
1
A
−
1
h
2
(7)
\begin{aligned} & r_1=k^{-1} A^{-1} h 1 \\ & r_2=k^{-1} A^{-1} h 2 \end{aligned}\tag{7}
r1=k−1A−1h1r2=k−1A−1h2(7)
结合公式(5)和(7)有:
r
1
T
r
2
=
(
k
−
1
A
−
1
h
1
)
T
k
−
1
A
−
1
h
2
=
0
⇒
h
1
T
A
−
T
A
−
1
h
2
=
0
(8)
\begin{aligned} & r_1^T r_2=\left(k^{-1} A^{-1} h 1\right)^T k^{-1} A^{-1} h 2=0 \\ & \Rightarrow h 1^T A^{-T} A^{-1} h 2=0 \end{aligned}\tag{8}
r1Tr2=(k−1A−1h1)Tk−1A−1h2=0⇒h1TA−TA−1h2=0(8)
r 1 T r 1 = r 2 T r 2 = 1 ⇒ ( k − 1 A − 1 h 1 ) T k − 1 A − 1 h 1 = ( k − 1 A − 1 h 2 ) T k − 1 A − 1 h 2 ⇒ h 1 T A − T A − 1 h 1 = h 2 T A − T A − 1 h 2 (9) \begin{aligned} & r_1^T r_1=r_2^T r_2=1 \\ & \Rightarrow\left(k^{-1} A^{-1} h 1\right)^T k^{-1} A^{-1} h 1=\left(k^{-1} A^{-1} h 2\right)^T k^{-1} A^{-1} h 2 \\ & \Rightarrow h 1^T A^{-T} A^{-1} h 1=h 2^T A^{-T} A^{-1} h 2 \end{aligned}\tag{9} r1Tr1=r2Tr2=1⇒(k−1A−1h1)Tk−1A−1h1=(k−1A−1h2)Tk−1A−1h2⇒h1TA−TA−1h1=h2TA−TA−1h2(9)
得到(8)(9)两个约束。
参数求解
参数求解过程:
(1)给出一个封闭解
(2)根据最大似然估计给出非线性的最优化解
(3)考虑镜头的径向畸变(张正友标定法不考虑切向畸变),给出解析解和非线性解
封闭解
有:
A
=
[
α
c
u
0
0
β
v
0
0
0
1
]
A=\left[\begin{array}{ccc} \alpha & c & u_0 \\ 0 & \beta & v_0 \\ 0 & 0 & 1 \end{array}\right]
A=
α00cβ0u0v01
令:
B
=
A
−
T
A
−
1
=
[
1
α
2
−
c
α
2
β
c
v
0
−
u
0
β
α
2
β
−
c
α
2
β
c
α
2
β
2
+
1
β
2
−
c
(
c
v
0
−
u
0
β
)
α
2
β
2
−
v
0
β
2
c
v
0
−
u
0
β
α
2
β
−
c
(
c
v
0
−
u
0
β
)
α
2
β
2
−
v
0
β
2
(
c
v
0
−
u
0
β
)
2
α
2
β
2
+
v
0
2
β
2
+
1
]
(10)
B=A^{-T} A^{-1}=\left[\begin{array}{ccc} \frac{1}{\alpha^2} & \frac{-c}{\alpha^2 \beta} & \frac{c v_0-u_0 \beta}{\alpha^2 \beta} \\ \frac{-c}{\alpha^2 \beta} & \frac{c}{\alpha^2 \beta^2}+\frac{1}{\beta^2} & -\frac{c\left(c v_0-u_0 \beta\right)}{\alpha^2 \beta^2}-\frac{v_0}{\beta^2} \\ \frac{c v_0-u_0 \beta}{\alpha^2 \beta} & -\frac{c\left(c v_0-u_0 \beta\right)}{\alpha^2 \beta^2}-\frac{v_0}{\beta^2} & \frac{\left(c v_0-u_0 \beta\right)^2}{\alpha^2 \beta^2}+\frac{v_0^2}{\beta^2}+1 \end{array}\right]\tag{10}
B=A−TA−1=
α21α2β−cα2βcv0−u0βα2β−cα2β2c+β21−α2β2c(cv0−u0β)−β2v0α2βcv0−u0β−α2β2c(cv0−u0β)−β2v0α2β2(cv0−u0β)2+β2v02+1
(10)
其中B是一个对称矩阵,设一个六维向量b:
b
=
[
B
11
,
B
12
,
B
13
,
B
22
,
B
23
,
B
33
]
T
(11)
b=[B 11, B 12, B 13, B 22, B 23, B 33]^T\tag{11}
b=[B11,B12,B13,B22,B23,B33]T(11)
设H的第i列向量为
h
i
=
[
h
i
1
,
h
i
2
,
h
i
3
]
T
h_i=\left[h_{i 1}, h_{i 2}, h_{i 3}\right]^T
hi=[hi1,hi2,hi3]T
有:
h
i
T
B
h
j
=
v
i
j
T
b
(12)
h_i^T B h_j=v_{i j}^T b\tag{12}
hiTBhj=vijTb(12)
其中:
v
i
j
=
[
h
i
1
h
j
1
h
i
1
h
j
2
+
h
i
2
h
j
1
h
i
2
h
j
2
h
i
3
h
j
1
+
h
i
1
h
j
3
h
i
3
h
j
2
+
h
i
2
h
j
3
h
i
3
h
j
3
]
v_{i j}=\left[\begin{array}{c} h_{i 1} h_{j 1} \\ h_{i 1} h_{j 2}+h_{i 2} h_{j 1} \\ h_{i 2} h_{j 2} \\ h_{i 3} h_{j 1}+h_{i 1} h_{j 3} \\ h_{i 3} h_{j 2}+h_{i 2} h_{j 3} \\ h_{i 3} h_{j 3} \end{array}\right]
vij=
hi1hj1hi1hj2+hi2hj1hi2hj2hi3hj1+hi1hj3hi3hj2+hi2hj3hi3hj3
约束公式(8)(9)可以重写为:
r
1
T
r
2
=
(
k
−
1
A
−
1
h
1
)
T
k
−
1
A
−
1
h
2
=
0
⇒
h
1
T
A
−
T
A
−
1
h
2
=
0
⇒
h
1
T
B
h
2
=
0
⇒
v
12
T
b
=
0
\begin{aligned} & r_1^T r_2=\left(k^{-1} A^{-1} h 1\right)^T k^{-1} A^{-1} h 2=0 \\ & \Rightarrow h 1^T A^{-T} A^{-1} h 2=0 \\ & \Rightarrow h 1^T B h 2=0 \\ & \Rightarrow v_{12}^T b=0 \end{aligned}
r1Tr2=(k−1A−1h1)Tk−1A−1h2=0⇒h1TA−TA−1h2=0⇒h1TBh2=0⇒v12Tb=0
r 1 T r 1 = r 2 T r 2 = 1 ⇒ ( k − 1 A − 1 h 1 ) T k − 1 A − 1 h 1 = ( k − 1 A − 1 h 2 ) T k − 1 A − 1 h 2 ⇒ h 1 T A − T A − 1 h 1 = h 2 T A − T A − 1 h 2 ⇒ h 1 T B h 1 = h 2 T B h 2 ⇒ ( v 11 − v 22 ) T b = 0 \begin{aligned} & r_1^T r_1=r_2^T r_2=1 \\ & \Rightarrow\left(k^{-1} A^{-1} h 1\right)^T k^{-1} A^{-1} h 1=\left(k^{-1} A^{-1} h 2\right)^T k^{-1} A^{-1} h 2 \\ & \Rightarrow h 1^T A^{-T} A^{-1} h 1=h 2^T A^{-T} A^{-1} h 2 \\ & \Rightarrow h 1^T B h 1=h 2^T B h 2 \\ & \Rightarrow\left(v_{11}-v_{22}\right)^T b=0 \end{aligned} r1Tr1=r2Tr2=1⇒(k−1A−1h1)Tk−1A−1h1=(k−1A−1h2)Tk−1A−1h2⇒h1TA−TA−1h1=h2TA−TA−1h2⇒h1TBh1=h2TBh2⇒(v11−v22)Tb=0
由上面两式得到:
[
v
12
T
(
v
11
−
v
22
)
T
]
b
=
0
(13)
\left[\begin{array}{c} v_{12}^T \\ \left(v_{11}-v_{22}\right)^T \end{array}\right] b=0\tag{13}
[v12T(v11−v22)T]b=0(13)
公式(13)为一个给定单应性中的两个基本约束条件,即标定一张图像就给出上面两个约束。
通过标定n张图像,则有n个公式(13),叠加表示得到: V b = 0 Vb=0 Vb=0 其中V是一个2n*6的矩阵。
因为b是一个6维向量,因此最少有6个方程就可以求解这6个未知量,每张图像可以提供两个约束方程。若有3张图像则可以解出给定比例因子的6维向量b的解。
若只有2张图像,可以施加无倾斜系数的约束,即c=0,有: [ 0 , 1 , 0 , 0 , 0 , 0 ] b = 0 [0,1,0,0,0,0]b=0 [0,1,0,0,0,0]b=0 将上式代入(13)作为额外约束。
得到b的解后,即得到B,并解出相机内参A。解出A,则能够解出相机外参。
得到B后。相机内参A计算如下:
v
0
=
(
B
12
B
13
−
B
11
B
23
)
/
(
B
11
B
22
−
B
12
2
)
λ
=
B
33
−
[
B
13
2
+
v
0
(
B
12
B
13
−
B
11
B
23
)
]
/
B
11
α
=
λ
/
B
11
β
=
λ
B
11
/
(
B
11
B
22
−
B
12
2
)
c
=
−
B
12
α
2
β
/
λ
u
0
=
c
v
0
/
α
−
B
12
α
2
/
λ
\begin{aligned} & v_0=\left(B_{12} B_{13}-B_{11} B_{23}\right) /\left(B_{11} B_{22}-B_{12}^2\right) \\ & \lambda=B_{33}-\left[B_{13}^2+v_0\left(B_{12} B_{13}-B_{11} B_{23}\right)\right] / B_{11} \\ & \alpha=\sqrt{\lambda / B_{11}} \\ & \beta=\sqrt{\lambda B_{11} /\left(B_{11} B_{22}-B_{12}^2\right)} \\ & c=-B_{12} \alpha^2 \beta / \lambda \\ & u_0=c v_0 / \alpha-B_{12} \alpha^2 / \lambda \end{aligned}
v0=(B12B13−B11B23)/(B11B22−B122)λ=B33−[B132+v0(B12B13−B11B23)]/B11α=λ/B11β=λB11/(B11B22−B122)c=−B12α2β/λu0=cv0/α−B12α2/λ
根据上式计算得到A后,可以计算相机外参:
r
1
=
k
A
−
1
h
1
r
2
=
k
A
−
1
h
2
r
3
=
r
1
×
r
2
t
=
k
A
−
1
h
3
\begin{aligned} & r_1=k A^{-1} h_1 \\ & r_2=k A^{-1} h_2 \\ & r_3=r_1 \times r_2 \\ & t=k A^{-1} h_3 \end{aligned}
r1=kA−1h1r2=kA−1h2r3=r1×r2t=kA−1h3
其中:
k
=
1
/
∥
A
−
1
h
1
∥
=
1
/
∥
A
−
1
h
2
∥
k=1 /\left\|A^{-1} h 1\right\|=1 /\left\|A^{-1} h 2\right\|
k=1/
A−1h1
=1/
A−1h2
这里计算得到的R比一定满足标准旋转矩阵的性质,需要优化。
最大似然估计
上述解是通过最小化一个没有物理意义的代数距离而得到的。可以通过最大似然推理来改进它。
若给出模型平面上n张图像,模型平面上有m个点,假设图像点被独立且同分布的噪声破坏。最大似然估计可以通过最小化以下函数来得到:
∑
i
=
1
n
∑
j
=
1
m
∥
m
i
j
−
m
^
(
A
,
R
i
,
t
i
,
M
j
)
∥
2
其中
:
h
a
t
m
(
A
,
R
i
,
t
i
,
M
j
)
为通过公式
(
1
)
计算得到的投影点
(14)
\sum_{i=1}^n \sum_{j=1}^m\left\|m_{i j}-\hat{m}\left(A, R_i, t_i, M_j\right)\right\|^2\\ 其中:\\ \\hat{m}\left(A, R_i, t_i, M_j\right) 为通过公式 (1) 计算得到的投影点\tag{14}
i=1∑nj=1∑m∥mij−m^(A,Ri,ti,Mj)∥2其中:hatm(A,Ri,ti,Mj)为通过公式(1)计算得到的投影点(14)
一个旋转R由一个包含3个参数的向量参数化,用r表示,它平行于旋转轴,其大小等于旋转角。R和r由罗德里格斯公式相关联。最小化公式(14)是一个非线性最小化问题,它可以用在Minpack中实现的LM算法来求解。它需要一个初始参数值:A,{Ri,ti|i=1…n}这个初始参数则可以使用2.2.3.1中所求的参数解。
处理镜头径向畸变
在前面1.5.1中定义了图像的径向畸变系数模型:
x
畸变
=
x
(
1
+
k
1
∗
r
2
+
k
2
∗
r
4
+
k
3
∗
r
6
)
y
畸变
=
y
(
1
+
k
1
∗
r
2
+
k
2
∗
r
4
+
k
3
∗
r
6
)
\begin{gathered} x_{\text {畸变 }}=x\left(1+k_1 * r^2+k_2 * r^4+k_3 * r^6\right) \\ y_{\text {畸变 }}=y\left(1+k_1 * r^2+k_2 * r^4+k_3 * r^6\right) \end{gathered}
x畸变 =x(1+k1∗r2+k2∗r4+k3∗r6)y畸变 =y(1+k1∗r2+k2∗r4+k3∗r6)
在张正友数学模型中只考虑k1,k2:
x
^
=
x
(
1
+
k
1
∗
(
x
2
+
y
2
)
+
k
2
∗
(
x
2
+
y
2
)
2
)
y
^
=
y
(
1
+
k
1
∗
(
x
2
+
y
2
)
+
k
2
∗
(
x
2
+
y
2
)
2
)
\begin{aligned} & \hat{x}=x\left(1+k_1 *\left(x^2+y^2\right)+k_2 *\left(x^2+y^2\right)^2\right) \\ & \hat{y}=y\left(1+k_1 *\left(x^2+y^2\right)+k_2 *\left(x^2+y^2\right)^2\right) \end{aligned}
x^=x(1+k1∗(x2+y2)+k2∗(x2+y2)2)y^=y(1+k1∗(x2+y2)+k2∗(x2+y2)2)
其中 : x ^ , y ^ 为真实观测图像坐标 , x , y 为理想图像坐标 其中 : \hat{x}, \hat{y} 为真实观测图像坐标, x, y 为理想图像坐标 其中:x^,y^为真实观测图像坐标,x,y为理想图像坐标
将上式从图像坐标系转到像素坐标系有:
u
^
=
u
+
(
u
−
u
0
)
(
k
1
∗
(
x
2
+
y
2
)
+
k
2
∗
(
x
2
+
y
2
)
2
)
v
^
=
v
+
(
v
−
v
0
)
(
k
1
∗
(
x
2
+
y
2
)
+
k
2
∗
(
x
2
+
y
2
)
2
)
(15)
\begin{aligned} & \hat{u}=u+\left(u-u_0\right)\left(k_1 *\left(x^2+y^2\right)+k_2 *\left(x^2+y^2\right)^2\right) \\ & \hat{v}=v+\left(v-v_0\right)\left(k_1 *\left(x^2+y^2\right)+k_2 *\left(x^2+y^2\right)^2\right) \end{aligned}\tag{15}
u^=u+(u−u0)(k1∗(x2+y2)+k2∗(x2+y2)2)v^=v+(v−v0)(k1∗(x2+y2)+k2∗(x2+y2)2)(15)
其中 : u ^ , v ^ 为真实观测像素坐标 , u , v 为理想像素坐标 其中 : \hat{u}, \hat{v} 为真实观测像素坐标, u, v 为理想像素坐标 其中:u^,v^为真实观测像素坐标,u,v为理想像素坐标
将上式转换到矩阵形式:
[
(
u
−
u
0
)
(
x
2
+
y
2
)
(
u
−
u
0
)
(
x
2
+
y
2
)
2
(
v
−
v
0
)
(
x
2
+
y
2
)
(
v
−
v
0
)
(
x
2
+
y
2
)
2
]
[
k
1
k
2
]
=
[
u
^
−
u
v
^
−
v
]
\left[\begin{array}{cc} \left(u-u_0\right)\left(x^2+y^2\right) & \left(u-u_0\right)\left(x^2+y^2\right)^2 \\ \left(v-v_0\right)\left(x^2+y^2\right) & \left(v-v_0\right)\left(x^2+y^2\right)^2 \end{array}\right]\left[\begin{array}{l} k 1 \\ k 2 \end{array}\right]=\left[\begin{array}{l} \hat{u}-u \\ \hat{v}-v \end{array}\right]
[(u−u0)(x2+y2)(v−v0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)2][k1k2]=[u^−uv^−v]
因此每个图像上的模型点可以提供上面两个方程,则n张图像m个模型点有2mn个方程,矩阵形式为:
D
k
=
d
其中
:
k
=
[
k
1
,
k
2
]
T
D k=d\\ 其中 :\\ k=[k 1, k 2]^T
Dk=d其中:k=[k1,k2]T
线性最小二乘解可由公式得出:
k
=
(
D
T
D
)
−
1
D
T
d
(16)
k=\left(D^T D\right)^{-1} D^T d\tag{16}
k=(DTD)−1DTd(16)
一旦估计了k1和k2,就可以通过(15)求得的投影点带入公式(14)来细化其他参数的估计,交替使用这两个方法,直到收敛为止。
实验结果表明,上述交替技术的收敛速度较慢。对(14)的一个自然扩展是通过最小化以下函数来估计完整的参数集
∑
i
=
1
n
∑
j
=
1
m
∥
m
i
j
−
m
^
(
A
,
k
1
,
k
2
,
R
i
,
t
i
,
M
j
)
∥
2
其中
:
m
^
(
A
,
R
i
,
t
i
,
M
j
)
为通过公式
(
1
)
对图像
i
中
M
j
点投影
,
然后根据
(
14
)
进行变形的点。
(17)
\sum_{i=1}^n \sum_{j=1}^m\left\|m_{i j}-\hat{m}\left(A, k 1, k 2, R_i, t_i, M_j\right)\right\|^2\\ 其中: \\ \hat{m}\left(A, R_i, t_i, M_j\right) 为通过公式 (1) 对图像 i 中 M_j 点投影, 然后根据 (14) 进行变形的点。\tag{17}
i=1∑nj=1∑m∥mij−m^(A,k1,k2,Ri,ti,Mj)∥2其中:m^(A,Ri,ti,Mj)为通过公式(1)对图像i中Mj点投影,然后根据(14)进行变形的点。(17)
上式使用LM算法来求解。需要的初始参数值:A,{Ri,ti|i=1…n}可以使用2.2.3.1中所求的参数解或者2.2.3.2中所求的参数解或者简单设为0.
张正友标定法标定步骤
(1)打印图案(如棋盘格)并将其附着到平面表面上;
(2)通过移动平面或摄像机,拍摄不同方向的图像;
(3)检测图像中的特征点;
(4)利用2.2.3.1所述的封闭解估计五个内在参数和所有外部参数。
(5)通过求解线性最小二乘法(16)来估计径向畸变的系数;
(6)通过最小化(17)来细化所有参数。