针孔相机模型是使用的较多的模型,下面总结三维模型重建中的针孔相机成像过程。
首先,空间中的一个点要在针孔相机的像平面重建,需要4步。
1.从世界坐标系变化到相机坐标系
世界坐标系可以定义在任意位置,作为参考坐标系,相机坐标系以相机的光心看为远点,相机朝向为Z轴,朝上为Y轴,再根据右手定则确定X轴,如图(Ocam表示相机坐标系原点,Owor表示世界坐标系所选的点的原点):
空间中的一个点表示为
X
w
=
[
x
w
y
w
z
w
]
X_w=\left[\begin{matrix}x_w\\y_w\\z_w \end{matrix}\right]
Xw=⎣⎡xwywzw⎦⎤
这个空间中的点对应的相机中的点表达为:
X
c
=
[
x
c
y
c
z
c
]
X_c=\left[\begin{matrix}x_c\\y_c\\z_c \end{matrix}\right]
Xc=⎣⎡xcyczc⎦⎤
X c X_c Xc和 X w X_w Xw之间可以通过刚体变换来进行转换(刚体变换即变换前后两点的的距离依旧保持不变的变换,可分为平移变换、旋转变换和镜像(或叫翻转)变换):
1- 平移变换
假设存在点(x,y,z),将x移动a,y移动b,z移动c,到新的点
(
x
′
,
y
′
,
z
′
)
(x^{'},y^{'},z^{'})
(x′,y′,z′),则:
x
′
=
x
+
a
x^{'}=x+a
x′=x+a
y
′
=
y
+
b
y^{'}=y+b
y′=y+b
z
′
=
y
+
c
z^{'}=y+c
z′=y+c
平移向量为:
t
=
[
a
b
c
]
t=\left[\begin{matrix}a\\b\\c \end{matrix}\right]
t=⎣⎡abc⎦⎤
写成矩阵形式:
[
x
′
y
′
z
′
1
]
=
[
1
0
0
a
0
1
0
b
0
0
1
c
0
0
0
1
]
[
x
y
z
1
]
\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&a\\0&1&0&b\\0&0&1&c\\0&0&0&1 \end{matrix}\right] \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡100001000010abc1⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤
中间4x4的矩阵叫变换矩阵。可见,如果要平移坐标,要将坐标维度增加1,变成齐次坐标(齐次坐标(homogeneous coordinates)就是将一个原本是n维的向量用一个n+1维向量来表示,常用于投影几何)。
在计算机图形学中,为了实现平移、旋转、缩放等图像操作,需要用到齐次坐标。
例1:世界坐标系wor相对相机坐标系cam的x、y、z分别平移了10,20,30,求次变换齐次矩阵。
[ x ′ y ′ z ′ 1 ] = [ 1 0 0 10 0 1 0 0 0 0 1 0 0 0 0 1 ] × [ 1 0 0 0 0 1 0 20 0 0 1 0 0 0 0 1 ] × [ 1 0 0 0 0 1 0 0 0 0 1 30 0 0 0 1 ] × [ x y z 1 ] = [ 1 0 0 10 0 1 0 20 0 0 1 30 0 0 0 1 ] × [ x y z 1 ] \left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]=\left[\begin{matrix}1&0&0&10\\0&1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}1&0&0&0\\0&1&0&20\\0&0&1&0\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}1&0&0&0\\0&1&0&0\\0&0&1&30\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&10\\0&1&0&20\\0&0&1&30\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right] ⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000100001010001⎦⎥⎥⎤×⎣⎢⎢⎡10000100001002001⎦⎥⎥⎤×⎣⎢⎢⎡10000100001000301⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡1000010000101020301⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤
三个分量矩阵位置可以交换,因为是独立变量,互不影响。
所以,平移齐次矩阵为:
[
1
0
0
10
0
1
0
20
0
0
1
30
0
0
0
1
]
\left[\begin{matrix}1&0&0&10\\0&1&0&20\\0&0&1&30\\0&0&0&1 \end{matrix}\right]
⎣⎢⎢⎡1000010000101020301⎦⎥⎥⎤
2- 旋转变换
例2:世界坐标系wor相对相机坐标系cam绕x轴顺时针旋转了
α
\alpha
α(逆时针旋转为正,所以以下变换均为逆时针旋转):
变换矩阵:
[
x
′
y
′
z
′
1
]
=
[
1
0
0
0
0
c
o
s
α
−
s
i
n
α
0
0
s
i
n
α
c
o
s
α
0
0
0
0
1
]
×
[
x
y
z
1
]
\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&-sin{\alpha}&0\\0&sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosαsinα00−sinαcosα00001⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤
再绕y轴顺时针旋转 β \beta β(应该再左乘一个变换矩阵):
[ x ′ ′ y ′ ′ z ′ ′ 1 ] = [ 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ] × [ x ′ y ′ z ′ 1 ] \left[\begin{matrix}x^{''}\\y^{''}\\z^{''}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&-sin{\alpha}&0\\0&sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right] ⎣⎢⎢⎡x′′y′′z′′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosαsinα00−sinαcosα00001⎦⎥⎥⎤×⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤
旋转变换有两种,一种是向量在当前坐标系内的旋转,一种是坐标系的旋转。这里推导坐标系旋转矩阵。
(1) 绕X轴旋转(逆时针) α \alpha α:
方程为:
{
x
′
=
x
,
y
′
=
y
c
o
s
α
+
z
s
i
n
α
,
z
′
=
−
y
s
i
n
α
+
z
c
o
s
α
\begin{cases} x'=x,\\ y'=ycos{\alpha}+zsin{\alpha},\\ z'=-ysin{\alpha}+zcos{\alpha} \end{cases}
⎩⎪⎨⎪⎧x′=x,y′=ycosα+zsinα,z′=−ysinα+zcosα
写成矩阵形式:
[
x
′
y
′
z
′
1
]
=
[
1
0
0
0
0
c
o
s
α
s
i
n
α
0
0
−
s
i
n
α
c
o
s
α
0
0
0
0
1
]
×
[
x
y
z
1
]
\left[\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1 \end{matrix}\right]= \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&sin{\alpha}&0\\0&-sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x\\y\\z\\1 \end{matrix}\right]
⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤=⎣⎢⎢⎡10000cosα−sinα00sinαcosα00001⎦⎥⎥⎤×⎣⎢⎢⎡xyz1⎦⎥⎥⎤
(2) 绕Y轴旋转(逆时针) β \beta β:
方程为:
{
x
′
′
=
x
′
c
o
s
β
+
z
′
s
i
n
β
,
y
′
′
=
y
′
,
z
′
′
=
−
x
′
s
i
n
β
+
z
′
c
o
s
β
\begin{cases} x''=x'cos{\beta}+z'sin{\beta},\\ y''=y',\\ z''=-x'sin{\beta}+z'cos{\beta} \end{cases}
⎩⎪⎨⎪⎧x′′=x′cosβ+z′sinβ,y′′=y′,z′′=−x′sinβ+z′cosβ
写成矩阵形式:
[
x
′
′
y
′
′
z
′
′
1
]
=
[
c
o
s
β
0
s
i
n
β
0
0
1
0
0
−
s
i
n
α
0
c
o
s
β
0
0
0
0
1
]
×
[
x
′
y
′
z
′
1
]
\left[\begin{matrix}x^{''}\\y^{''}\\z^{''}\\1 \end{matrix}\right]= \left[\begin{matrix}cos{\beta}&0&sin{\beta}&0\\0&1&0&0\\-sin{\alpha}&0&cos{\beta}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x'\\y'\\z'\\1 \end{matrix}\right]
⎣⎢⎢⎡x′′y′′z′′1⎦⎥⎥⎤=⎣⎢⎢⎡cosβ0−sinα00100sinβ0cosβ00001⎦⎥⎥⎤×⎣⎢⎢⎡x′y′z′1⎦⎥⎥⎤
(3)绕Z轴旋转(逆时针) γ \gamma γ:
方程为:
{
x
′
′
′
=
x
′
′
c
o
s
γ
+
y
′
′
s
i
n
γ
,
y
′
′
′
=
−
x
′
′
s
i
n
γ
+
y
′
′
c
o
s
β
,
z
′
′
′
=
z
′
′
\begin{cases} x'''=x''cos{\gamma}+y''sin{\gamma},\\ y'''=-x''sin{\gamma}+y''cos{\beta},\\ z'''=z'' \end{cases}
⎩⎪⎨⎪⎧x′′′=x′′cosγ+y′′sinγ,y′′′=−x′′sinγ+y′′cosβ,z′′′=z′′
写成矩阵形式:
[
x
′
′
′
y
′
′
′
z
′
′
′
1
]
=
[
c
o
s
γ
s
i
n
γ
0
0
−
s
i
n
γ
c
o
s
γ
0
0
0
0
1
0
0
0
0
1
]
×
[
x
′
′
y
′
′
z
′
′
1
]
\left[\begin{matrix}x^{'''}\\y^{'''}\\z^{'''}\\1 \end{matrix}\right]= \left[\begin{matrix}cos{\gamma}&sin{\gamma}&0&0\\-sin{\gamma}&cos{\gamma}&0&0\\0&0&1&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}x''\\y''\\z''\\1 \end{matrix}\right]
⎣⎢⎢⎡x′′′y′′′z′′′1⎦⎥⎥⎤=⎣⎢⎢⎡cosγ−sinγ00sinγcosγ0000100001⎦⎥⎥⎤×⎣⎢⎢⎡x′′y′′z′′1⎦⎥⎥⎤
所以,坐标轴分别依次绕x,y,z轴旋转 α \alpha α, β \beta β, γ \gamma γ的变换矩阵(前后用左乘来连接):
R = R z ( γ ) R y ( β ) R x ( α ) = [ c o s γ s i n γ 0 0 − s i n γ c o s γ 0 0 0 0 1 0 0 0 0 1 ] × [ c o s β 0 s i n β 0 0 1 0 0 − s i n α 0 c o s β 0 0 0 0 1 ] × [ 1 0 0 0 0 c o s α s i n α 0 0 − s i n α c o s α 0 0 0 0 1 ] R=R_z(\gamma)R_y(\beta)R_x(\alpha)=\left[\begin{matrix}cos{\gamma}&sin{\gamma}&0&0\\-sin{\gamma}&cos{\gamma}&0&0\\0&0&1&0\\0&0&0&1 \end{matrix}\right]\times \left[\begin{matrix}cos{\beta}&0&sin{\beta}&0\\0&1&0&0\\-sin{\alpha}&0&cos{\beta}&0\\0&0&0&1 \end{matrix}\right] \times \left[\begin{matrix}1&0&0&0\\0&cos{\alpha}&sin{\alpha}&0\\0&-sin{\alpha}&cos{\alpha}&0\\0&0&0&1 \end{matrix}\right] R=Rz(γ)Ry(β)Rx(α)=⎣⎢⎢⎡cosγ−sinγ00sinγcosγ0000100001⎦⎥⎥⎤×⎣⎢⎢⎡cosβ0−sinα00100sinβ0cosβ00001⎦⎥⎥⎤×⎣⎢⎢⎡10000cosα−sinα00sinαcosα00001⎦⎥⎥⎤
齐次矩阵 R R R为 4 × 4 4\times 4 4×4的矩阵。
3- 综合变换矩阵
空间中的一个点表示为
X
w
=
[
x
w
y
w
z
w
]
X_w=\left[\begin{matrix}x_w\\y_w\\z_w \end{matrix}\right]
Xw=⎣⎡xwywzw⎦⎤
这个空间中的点对应的相机中的点表达为:
X
c
=
[
x
c
y
c
z
c
]
X_c=\left[\begin{matrix}x_c\\y_c\\z_c \end{matrix}\right]
Xc=⎣⎡xcyczc⎦⎤
综合的(平移+旋转)变换矩阵可表示为:
X c = R X w + t X_c=RX_w+t Xc=RXw+t (此处及以下R为非齐次矩阵, 3 × 4 3\times 4 3×4)
写成齐次矩阵形式(
X
c
X_c
Xc下面的1是因为要考虑平移,所以要变成齐次矩阵才加进来的):
[
X
c
1
]
=
[
R
t
0
T
1
]
×
[
X
w
1
]
\left[\begin{matrix}X_c\\1 \end{matrix}\right]= \left[\begin{matrix}R&t\\0^T&1 \end{matrix}\right] \times \left[\begin{matrix}X_w\\1 \end{matrix}\right]
[Xc1]=[R0Tt1]×[Xw1]
(
t
t
t为平移向量:
t
=
[
a
b
c
]
t=\left[\begin{matrix}a\\b\\c \end{matrix}\right]
t=⎣⎡abc⎦⎤)
逆变换:
X
w
=
R
T
X
c
−
R
T
t
X_w=R^TX_c-R^Tt
Xw=RTXc−RTt
齐次矩阵形式:
[
X
w
1
]
=
[
R
T
−
R
T
t
0
T
1
]
×
[
X
c
1
]
\left[\begin{matrix}X_w\\1 \end{matrix}\right]= \left[\begin{matrix}R^T&-R^Tt\\0^T&1 \end{matrix}\right] \times \left[\begin{matrix}X_c\\1 \end{matrix}\right]
[Xw1]=[RT0T−RTt1]×[Xc1]
4.相机中心在世界坐标系中的位置
相机中心在相机坐标系中的位置 O c a m c O_{cam}^c Ocamc
相机中心在世界坐标系中的位置 O c a m w O_{cam}^w Ocamw
把相机原点转化到世界坐标系中:
O c a m c = 0 O_{cam}^c=0 Ocamc=0
使用逆变换公式:
X w = R T X c − R T t X_w=R^TX_c-R^Tt Xw=RTXc−RTt
O c a m w = R T O c a m c − R T t = − R T t O_{cam}^w=R^TO_{cam}^c-R^Tt=-R^Tt Ocamw=RTOcamc−RTt=−RTt
把世界坐标系原点转化到相机坐标系中:
世界坐标系原点在世界坐标系中的位置 O w o r w O_{wor}^w Oworw
世界坐标系原点在相机坐标系中的位置 O w o r c O_{wor}^c Oworc
O w o r w = 0 O_{wor}^w=0 Oworw=0
使用变换公式:
X c = R X w + t X_c=RX_w+t Xc=RXw+t
X O w o r c = R O w o r w + t = t XO_{wor}^c=RO_{wor}^w+t=t XOworc=ROworw+t=t
可见:世界坐标系原点在相机坐标系中的表达就是平移向量 t t t。
4- 相机朝向(Z轴)在世界坐标系中的方向
2. 相机坐标系到归一化像平面坐标系
归一化像平面坐标系:是一个与物理像平面(通常是感光器件CCD所在的平面)平行,并且距离相机光心距离为1个单位的一个虚拟的坐标平面。见下图:
归一化平面坐标 p ^ ( x , y ) \hat{p}(x,y) p^(x,y),由三角形(从三维来看是三棱锥相似)相似有:
x c x = y c y = z c z \frac{x_c}{x}=\frac{y_c}{y}=\frac{z_c}{z} xxc=yyc=zzc (由归一化平面定义知:归一化平面的 z = 1 z=1 z=1)
即:
x
=
x
c
z
c
x=\frac{x_c}{z_c}
x=zcxc
y
=
y
c
z
c
y=\frac{y_c}{z_c}
y=zcyc
写成矩阵形式:
[ x y ] = [ x c z c y c z c ] \left[\begin{matrix}x\\y \end{matrix}\right]= \left[\begin{matrix}\frac{x_c}{z_c}\\ \frac{y_c}{z_c} \end{matrix}\right] [xy]=[zcxczcyc]
写成其次矩阵形式:
[
x
y
1
]
=
1
z
c
[
x
c
y
c
z
c
]
\left[\begin{matrix}x\\y\\1 \end{matrix}\right]=\frac{1}{z_c} \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right]
⎣⎡xy1⎦⎤=zc1⎣⎡xcyczc⎦⎤
经过归一化后,原来的在相机坐标下的三维信息 P c ( x c , y c , z c ) P_c(x_c,y_c,z_c) Pc(xc,yc,zc)变成了二维信息 p ^ ( x , y ) \hat{p}(x,y) p^(x,y),损失了z坐标的信息,由三维点变成了二维的点,这个过程即深度信息损失。
3. 归一化像平面坐标系到物理像平面坐标系
得到归一化坐标
p
^
(
x
,
y
)
\hat{p}(x,y)
p^(x,y)后,要将其转化到理像平面坐标系中(即成像原件所在平面),变成
p
i
m
g
(
x
i
m
g
,
y
i
m
g
)
p_{img}(x_{img},y_{img})
pimg(ximg,yimg)。注意:此处单位与归一化平面不一样,归一化平面与光心的距离可以是1米或毫米(此例子中取毫米),但是物理像平面的单位通常为像素。见下图:
由于物理平面采用的单位是像素,需要把归一化平面的毫米单位转化为像素。
相似三角形关系:
X i m g x = Y i m g y = f z \frac{X_{img}}{x}=\frac{Y_{img}}{y}=\frac{f}{z} xXimg=yYimg=zf (由归一化平面定义知:归一化平面的 z = 1 z=1 z=1; X i m g X_{img} Ximg、 Y i m g Y_{img} Yimg单位为mm)
X
i
m
g
=
f
x
X_{img}=fx
Ximg=fx
Y
i
m
g
=
f
y
Y_{img}=fy
Yimg=fy (单位mm)
x
i
m
g
=
α
U
=
f
α
x
x_{img}=\alpha U=f\alpha x
ximg=αU=fαx
y
i
m
g
=
β
U
=
f
β
y
y_{img}=\beta U=f\beta y
yimg=βU=fβy (在物理平面内,mm坐标转化为像素单位的坐标)
写成矩阵形式:
[ x i m g y i m g ] = [ f α x f β y ] = [ f α x f β y ] \left[\begin{matrix}x_{img}\\y_{img} \end{matrix}\right]= \left[\begin{matrix}f\alpha x\\ f\beta y \end{matrix}\right]=\left[\begin{matrix}f_{\alpha}x\\ f_{\beta}y \end{matrix}\right] [ximgyimg]=[fαxfβy]=[fαxfβy]
f
α
=
f
α
f_{\alpha}=f\alpha
fα=fα
f
β
=
f
β
f_{\beta}=f\beta
fβ=fβ
写成其次矩阵:
[ x i m g y i m g 1 ] = [ f α 0 0 0 f β 0 0 0 1 ] [ x y 1 ] = 1 z c [ f α 0 0 0 f β 0 0 0 1 ] [ x c y c z c ] \left[\begin{matrix}x_{img}\\y_{img}\\1 \end{matrix}\right]= \left[\begin{matrix}f_{\alpha}&0&0\\ 0&f_{\beta}&0\\0&0&1 \end{matrix}\right]\left[\begin{matrix}x\\y\\1 \end{matrix}\right]=\frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&0\\ 0&f_{\beta}&0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right] ⎣⎡ximgyimg1⎦⎤=⎣⎡fα000fβ0001⎦⎤⎣⎡xy1⎦⎤=zc1⎣⎡fα000fβ0001⎦⎤⎣⎡xcyczc⎦⎤
这就是相机中的点 P c ( x c , y c , z c ) P_c(x_c,y_c,z_c) Pc(xc,yc,zc)到物理像平面中对应点 p i m g ( x i m g , y i m g ) p_{img}(x_{img},y_{img}) pimg(ximg,yimg)的变换矩阵。
其中 f f f为焦距,即物理平面到光心的距离,单位毫米。 α \alpha α、 β \beta β分别表示归一化平面上每单位(mm)对应包含物理平面上 x x x、 y y y方向像素的个数。所以, f α f_{\alpha} fα和 f β f_{\beta} fβ分别为以 x x x、 y y y方向上以像素为单位的焦距; x i m g x_{img} ximg、 y i m g y_{img} yimg单位为像素。
4.把物理平面像坐标转到图像坐标系
常用的图像坐标系为以图像左上角为原点,x方向朝右,y朝下的坐标系;但是物理坐标系原点在图像中央:
设图像中央的坐标为
(
u
0
,
v
0
)
(u_0,v_0)
(u0,v0),则图像坐标(
(
u
,
v
)
(u,v)
(u,v),左上角为原点)为:
[
u
v
]
=
[
x
i
m
g
+
u
0
y
i
m
g
+
v
0
]
=
[
f
α
x
+
u
0
f
β
y
+
v
0
]
=
[
f
α
x
+
u
0
f
β
y
+
v
0
]
\left[\begin{matrix}u\\v \end{matrix}\right]=\left[\begin{matrix}x_{img}+u_0\\y_{img}+v_0 \end{matrix}\right]= \left[\begin{matrix}f\alpha x+u_0\\ f\beta y+v_0 \end{matrix}\right]=\left[\begin{matrix}f_{\alpha}x+u_0\\ f_{\beta}y+v_0 \end{matrix}\right]
[uv]=[ximg+u0yimg+v0]=[fαx+u0fβy+v0]=[fαx+u0fβy+v0]
写成其次矩阵:
[ u v 1 ] = 1 z c [ f α 0 u 0 0 f β v 0 0 0 1 ] [ x c y c z c ] \left[\begin{matrix}u\\v\\1 \end{matrix}\right]= \frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right] ⎣⎡uv1⎦⎤=zc1⎣⎡fα000fβ0u0v01⎦⎤⎣⎡xcyczc⎦⎤
一般情况下,像素为正方形,则有 f = f α = f β f=f_{\alpha}=f_{\beta} f=fα=fβ
5.把上述步骤都串起来
把上面四部串起来就是针孔相机的成像过程:
[ u v 1 ] = 1 z c [ f α 0 u 0 0 f β v 0 0 0 1 ] [ x c y c z c ] = 1 z c [ f α 0 u 0 0 f β v 0 0 0 1 ] [ R t ] [ X w 1 ] = 1 z c K [ R t ] [ x w y w z w 1 ] \left[\begin{matrix}u\\v\\1 \end{matrix}\right]= \frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}x_c\\ y_c\\z_c \end{matrix}\right]=\frac{1}{z_c}\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix}R&t \end{matrix}\right] \left[\begin{matrix}X_w\\1 \end{matrix}\right]=\frac{1}{z_c}K \left[\begin{matrix}R&t \end{matrix}\right] \left[\begin{matrix}x_w\\y_w\\z_w\\1 \end{matrix}\right] ⎣⎡uv1⎦⎤=zc1⎣⎡fα000fβ0u0v01⎦⎤⎣⎡xcyczc⎦⎤=zc1⎣⎡fα000fβ0u0v01⎦⎤[Rt][Xw1]=zc1K[Rt]⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
整个投影过程可变为 3 × 4 3\times 4 3×4的矩阵: P 3 × 4 = K [ R t ] P_{3\times 4}=K \left[\begin{matrix}R&t \end{matrix}\right] P3×4=K[Rt]
其中, K = [ f α 0 u 0 0 f β v 0 0 0 1 ] K=\left[\begin{matrix}f_{\alpha}&0&u_0\\ 0&f_{\beta}&v_0\\0&0&1 \end{matrix}\right] K=⎣⎡fα000fβ0u0v01⎦⎤中包含的 f α f_{\alpha} fα, f β f_{\beta} fβ, u 0 u_0 u0, v 0 v_0 v0为相机的内参(还有径向畸变系数 k 1 k_1 k1, k 2 k_2 k2).
R = R z ( γ ) R y ( β ) R x ( α ) = [ c o s γ s i n γ 0 − s i n γ c o s γ 0 0 0 1 ] × [ c o s β s i n β 0 0 1 0 − s i n α 0 c o s β ] × [ 1 0 0 0 c o s α s i n α 0 − s i n α c o s α ] R=R_z(\gamma)R_y(\beta)R_x(\alpha)=\left[\begin{matrix}cos{\gamma}&sin{\gamma}&0&\\-sin{\gamma}&cos{\gamma}&0&\\0&0&1& \end{matrix}\right]\times \left[\begin{matrix}cos{\beta}&sin{\beta}&0\\0&1&0&\\-sin{\alpha}&0&cos{\beta}& \end{matrix}\right] \times \left[\begin{matrix}1&0&0&\\0&cos{\alpha}&sin{\alpha}&\\0&-sin{\alpha}&cos{\alpha}& \end{matrix}\right] R=Rz(γ)Ry(β)Rx(α)=⎣⎡cosγ−sinγ0sinγcosγ0001⎦⎤×⎣⎡cosβ0−sinαsinβ1000cosβ⎦⎤×⎣⎡1000cosα−sinα0sinαcosα⎦⎤
和平移向量 t = [ a b c ] t=\left[\begin{matrix}a\\b\\c \end{matrix}\right] t=⎣⎡abc⎦⎤为外参。
外参确定的过程对应计算机视觉中的姿态估计任务,内参确定过程对应相机标定任务。
关于径向畸变系数
径向畸变成因:相机的透镜不是理想的透镜,因此会产生直线变弯曲现象。
公式:
[
x
~
y
~
]
=
(
1
+
k
1
r
2
+
k
2
r
4
)
[
x
y
]
\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=(1+k_1r^2+k_2r^4)\left[\begin{matrix}x\\y \end{matrix}\right]
[x~y~]=(1+k1r2+k2r4)[xy] (可见径向畸变发生在归一化像平面上)
r 2 = x 2 + y 2 r^2=x^2+y^2 r2=x2+y2
( x x x, y y y为归一化平面上的点, x ~ \tilde{x} x~、 y ~ \tilde{y} y~表示畸变后的在物理像平面上的点(单位为像素))
[ u ~ v ~ ] = f [ x ~ y ~ ] + [ u 0 v 0 ] \left[\begin{matrix}\tilde{u}\\\tilde{v} \end{matrix}\right]=f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]+\left[\begin{matrix}u_0\\v_0 \end{matrix}\right] [u~v~]=f[x~y~]+[u0v0]
k
1
k_1
k1,
k
2
k_2
k2为径向畸变系数;
r
2
r^2
r2表示图像距离中心点的距离的平方,由此可见,距离图像中心越远的点,畸变程度越大,见下图:
径向畸变系数估计方法—最小二乘法:
理想情况投影点的坐标:
[
u
v
]
=
f
[
x
y
]
+
[
u
0
v
0
]
\left[\begin{matrix}u\\v \end{matrix}\right]=f\left[\begin{matrix}x\\y \end{matrix}\right]+\left[\begin{matrix}u_0\\v_0 \end{matrix}\right]
[uv]=f[xy]+[u0v0]
即:
f
[
x
y
]
=
[
u
−
u
0
v
−
v
0
]
f\left[\begin{matrix}x\\y \end{matrix}\right]=\left[\begin{matrix}u-u_0\\v-v_0 \end{matrix}\right]
f[xy]=[u−u0v−v0]
畸变情况下的投影点的坐标:
[ u ~ v ~ ] = f [ x ~ y ~ ] + [ u 0 v 0 ] \left[\begin{matrix}\tilde{u}\\\tilde{v} \end{matrix}\right]=f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]+\left[\begin{matrix}u_0\\v_0 \end{matrix}\right] [u~v~]=f[x~y~]+[u0v0]
即:
f [ x ~ y ~ ] = [ u ~ − u 0 v ~ − v 0 ] f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=\left[\begin{matrix}\tilde{u}-u_0\\\tilde{v}-v_0 \end{matrix}\right] f[x~y~]=[u~−u0v~−v0]
因为畸变是发生在归一化像平面上,对应的也就等价于发生在物理像平面上,所以由公式:
[
x
~
y
~
]
=
(
1
+
k
1
r
2
+
k
2
r
4
)
[
x
y
]
\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=(1+k_1r^2+k_2r^4)\left[\begin{matrix}x\\y \end{matrix}\right]
[x~y~]=(1+k1r2+k2r4)[xy]
得:
公式:
f
[
x
~
y
~
]
=
(
1
+
k
1
r
2
+
k
2
r
4
)
f
[
x
y
]
f\left[\begin{matrix}\tilde{x}\\\tilde{y} \end{matrix}\right]=(1+k_1r^2+k_2r^4)f\left[\begin{matrix}x\\y \end{matrix}\right]
f[x~y~]=(1+k1r2+k2r4)f[xy]
即:
[
u
~
−
u
0
v
~
−
v
0
]
=
(
1
+
k
1
r
2
+
k
2
r
4
)
[
u
−
u
0
v
−
v
0
]
\left[\begin{matrix}\tilde{u}-u_0\\\tilde{v}-v_0 \end{matrix}\right]=(1+k_1r^2+k_2r^4)\left[\begin{matrix}u-u_0\\v-v_0 \end{matrix}\right]
[u~−u0v~−v0]=(1+k1r2+k2r4)[u−u0v−v0]
即:
u
~
−
u
0
=
(
1
+
k
1
r
2
+
k
2
r
4
)
(
u
−
u
0
)
\tilde{u}-u_0=(1+k_1r^2+k_2r^4)(u-u_0)
u~−u0=(1+k1r2+k2r4)(u−u0)
u ~ = ( 1 + k 1 r 2 + k 2 r 4 ) u − ( k 1 r 2 + k 2 r 4 ) u 0 \tilde{u}=(1+k_1r^2+k_2r^4)u-(k_1r^2+k_2r^4)u_0 u~=(1+k1r2+k2r4)u−(k1r2+k2r4)u0
u ~ − u = ( k 1 r 2 + k 2 r 4 ) u − ( k 1 r 2 + k 2 r 4 ) u 0 \tilde{u}-u=(k_1r^2+k_2r^4)u-(k_1r^2+k_2r^4)u_0 u~−u=(k1r2+k2r4)u−(k1r2+k2r4)u0
u ~ − u = k 1 r 2 ( u − u 0 ) + k 2 r 4 ( u − u 0 ) \tilde{u}-u=k_1r^2(u-u_0)+k_2r^4(u-u_0) u~−u=k1r2(u−u0)+k2r4(u−u0)
同理:
v
~
−
v
=
k
1
r
2
(
v
−
v
0
)
+
k
2
r
4
(
v
−
v
0
)
\tilde{v}-v=k_1r^2(v-v_0)+k_2r^4(v-v_0)
v~−v=k1r2(v−v0)+k2r4(v−v0)
写成矩阵:
[
(
u
−
u
0
)
r
2
(
u
−
u
0
)
r
4
(
v
−
v
0
)
r
2
(
v
−
v
0
)
r
4
]
[
k
1
k
2
]
=
[
u
~
−
u
v
~
−
v
]
\left[\begin{matrix}(u-u_0)r^2&(u-u_0)r^4\\(v-v_0)r^2&(v-v_0)r^4 \end{matrix}\right]\left[\begin{matrix}k_1\\k_2 \end{matrix}\right]=\left[\begin{matrix}\tilde{u}-u\\\tilde{v}-v \end{matrix}\right]
[(u−u0)r2(v−v0)r2(u−u0)r4(v−v0)r4][k1k2]=[u~−uv~−v]
左边表示无畸变的点,右边表示有畸变的点。所以,只需要知道 [ u ~ v ~ ] \left[\begin{matrix}\tilde{u}\\\tilde{v} \end{matrix}\right] [u~v~]和 [ u v ] \left[\begin{matrix}u\\v \end{matrix}\right] [uv]的对应关系,就可以用最小二乘法计算 k 1 k_1 k1和 k 2 k_2 k2了。