开篇不知道说啥了,直接开始吧。
模型介绍
这个相机模型在其它地方又被叫做 Omnidirectional 相机模型,我做了一个简单的图来表示这个模型,这个模型的本质其实是将原始的光心在光轴方向上进行移动,得到一个虚拟的光心,从而达到模拟畸变的目的。用这个模型可以模拟针孔相机的成像过程,也可以模拟广角以及鱼眼相机的成像过程。需要注意的是,在广角或鱼眼相机中,该模型不会完全模拟畸变过程,所以还需要搭配一些其他畸变模型,比如 相机模型–针孔相机投影(pinhole camera model)中讲的Brown畸变模型。
接下来结合这个示图对这个模型进行详细说明。首先是投影过程,假设相机坐标系下一个点
P
=
(
x
,
y
,
z
)
P=(x, y, z)
P=(x,y,z), 将其归一化到以光心为中心的单位球面上
P
s
=
(
x
s
,
y
s
,
z
s
)
P_s=(x_s, y_s, z_s)
Ps=(xs,ys,zs),若在无畸变的情况下,可以直接得到归一下像点
p
=
(
x
s
z
s
,
y
s
z
s
,
1
)
p=({{x_s} \over {z_s}},{{y_s} \over {z_s}},1)
p=(zsxs,zsys,1), 在有畸变的情况下,可以找到一个以虚拟光心(与原光心只存在光轴上的平移,设平移量为
ξ
\xi
ξ)为原点的虚拟相机坐标系,那么此时
P
s
P_s
Ps在虚拟相机坐标系下的坐标变为
(
x
s
,
y
s
,
z
s
+
ξ
)
(x_s, y_s, z_s + \xi )
(xs,ys,zs+ξ),投影到像平面中可以得到畸变后的归一化像点
p
d
=
(
x
s
z
s
+
ξ
,
y
s
z
s
+
ξ
,
1
)
p_d = {({x_s \over {z_s + \xi}}, {y_s \over {z_s + \xi}} , 1)}
pd=(zs+ξxs,zs+ξys,1)。
上述的是投影的过程,然后我们来看反投影的过程,反投影就是已知
p
d
=
(
x
d
,
y
d
)
p_d=(x_d, y_d)
pd=(xd,yd)求
P
s
=
(
x
s
,
y
s
,
z
s
)
P_s=(x_s,y_s,z_s)
Ps=(xs,ys,zs)的过程,在
O
P
s
OP_s
OPs上存在一点
P
s
′
=
(
x
d
,
y
d
,
z
′
)
P_s'=(x_d, y_d, z')
Ps′=(xd,yd,z′),将其归一化后就是
P
s
P_s
Ps,可见
P
s
P_s
Ps和
P
s
′
P_s'
Ps′实际对应同一个像素点。按照上边的投影过程可得到
p
d
p_d
pd,即
(
x
d
z
′
+
ξ
z
′
2
+
r
2
,
y
d
z
′
+
ξ
z
′
2
+
r
2
,
1
)
=
(
x
d
,
y
d
,
1
)
({{x_{d}}\over{z'+\xi \sqrt{z'^2+r^2}}}, {{y_{d}}\over{z'+\xi \sqrt{z'^2+r^2}}}, 1) = (x_{d}, y_{d}, 1)
(z′+ξz′2+r2xd,z′+ξz′2+r2yd,1)=(xd,yd,1) 从而
z
′
+
ξ
z
′
2
+
r
2
=
1
z'+\xi\sqrt{z'^2+r^2}=1
z′+ξz′2+r2=1
求解可以得到
syms r xi z
solve(z + xi * sqrt(z^2 + r^2) == 1, z)
z ′ = ξ 1 + r 2 ( 1 − ξ 2 ) − 1 ξ 2 − 1 z' ={ {\xi \sqrt{1+r^2(1-\xi^2)}-1} \over {\xi^2-1}} z′=ξ2−1ξ1+r2(1−ξ2)−1
投影过程
- 设相机坐标系下一点 P c = ( x c , y c , z c ) P_c=(x_c, y_c, z_c) Pc=(xc,yc,zc),将其归一化到单位球面上 P s = ( x s , y s , z s ) = ( x c ∣ ∣ P c ∣ ∣ , y c ∣ ∣ P c ∣ ∣ , z c ∣ ∣ P c ∣ ∣ ∣ ) P_s=(x_s, y_s, z_s) = ({{x_c}\over||P_c||}, {y_c \over ||P_c||}, {{z_c} \over ||P_c||}|) Ps=(xs,ys,zs)=(∣∣Pc∣∣xc,∣∣Pc∣∣yc,∣∣Pc∣∣zc∣)。
- 转换到虚拟像平面上得到 p = ( x p , y p , 1 ) = ( x s z s + ξ , y s z s + ξ , 1 ) p=(x_p, y_p, 1)=({x_s \over {z_s + \xi}}, {y_s \over {z_s + \xi}}, 1) p=(xp,yp,1)=(zs+ξxs,zs+ξys,1) 。
- 对 p p p添加畸变(参考针孔模型加畸变),得到 p d = ( x d , y d , 1 ) p_d=(x_d, y_d, 1) pd=(xd,yd,1)。
- 得到像素坐标 u = f x x d + c x , v = f y y d + c y u = f_xx_d + cx, v = f_yy_d + cy u=fxxd+cx,v=fyyd+cy。
反投影过程
- 设图像上某个点 p = (u, v);
- 得到归一化焦平面上坐标 p d = ( u − c x f x , u − c y f y , 1 ) p_d=({{u-cx}\over f_x}, {{u-cy}\over f_y},1) pd=(fxu−cx,fyu−cy,1).
- 进行去畸变处理,可参考针孔相机模型去畸变,得到 p u d = ( x u d , y u d , 1 ) p_ud = (x_{ud}, y_{ud},1) pud=(xud,yud,1) 。
- 转换到相机坐标系下 P c = ( x u d , y u d , 1 − ξ ( r 2 + 1 ) ξ + 1 + r 2 ( 1 − ξ 2 ) ) P_c = (x_{ud}, y_{ud}, 1-{{\xi(r^2+1)}\over{\xi+\sqrt{1+r^2(1-\xi^2)}}}) Pc=(xud,yud,1−ξ+1+r2(1−ξ2)ξ(r2+1)),其中, r 2 = x u d 2 + y u d 2 r^2=x_{ud}^2+y_{ud}^2 r2=xud2+yud2。
- 归一化到单位球平面上。
雅可比计算
同针孔相机模型和鱼眼相机模型中介绍的,先贴代码,再贴公式
syms x y z xi fx fy cx cy
u = x / (z + xi);
v = y / (z + xi);
u = fx * u + cx;
v = fy * v + cy;
alphaE_alphaK = - [diff(u, xi), diff(u, fx), diff(u, fy), diff(u, cx), diff(u, cy);
diff(v, xi), diff(v, fx), diff(v, fy), diff(v, cx), diff(v, cy)]
alphaE_alphaP = -[diff(u, x), diff(u, y), diff(u, z);
diff(v, x), diff(v, y), diff(v, z)]
alphaP_alphaR = [1, 0, 0, 0, z, -y;
0, 1, 0, -z, 0, x;
0, 0, 1, y, -x, 0]
alphaE_alphaP * alphaP_alphaR
假设相机坐标系下归一化到球面的3D点坐标坐标为 P s = ( X s , Y s , Z s ) P_s=(X_s, Y_s, Z_s) Ps=(Xs,Ys,Zs)
-
误差项关于内参的偏导数
-
误差项关于相机坐标系下点 P P P的偏导
-
误差项在李代数上的扰动模型
根据链式法则可得
∂ e r r ∂ δ ζ = ∂ e r r ∂ P s ∂ P s ∂ δ ζ {{\partial err} \over {\partial \delta\zeta }} = {{\partial err} \over {\partial {P_s}}}{{\partial {P_{\rm{s}}}} \over {\partial \delta \zeta }} ∂δζ∂err=∂Ps∂err∂δζ∂Ps
其中,
∂
P
c
∂
δ
ζ
{{\partial {P_{\rm{c}}}} \over {\partial \delta \zeta }}
∂δζ∂Pc的推导后续会有专门篇幅进行总结,在这个先用起来再说。