鱼眼参数的数值计算优化方法

        在下面两篇文章中,我们大概介绍了开源图像处理软件 Hugin 中鱼眼图像的矫正方法,即如何将目标全景图上的坐标映射到鱼眼图像上,从而获取相应的像素信息。

  1. https://blog.csdn.net/qq_33552519/article/details/107362517
  2. https://blog.csdn.net/qq_33552519/article/details/121039023

对于以上前面两篇文章,我们忽略了一个问题,即以上矫正所用到的参数大部分都是不准确或者未知的,这样会导致不同的鱼眼图像经过矫正后不能很好地拼接在一起,最直接的后果是在拼接缝处出现断层,从而使得全景图像的画面不连续,影响观感。因此我们需要对一些参数进行优化。这里主要还是参考 Hugin 中的方法,一种基于数值计算迭代优化的方法。

图1 鱼眼图像矫正流程

        首先,我们对鱼眼矫正的流程做个总结,如图 1 所示。那么,我们可优化的一些参数如表 1 所示。一般来说,为了覆盖整张全景图像即达到 360 ° × 180 ° 360 \degree \times 180 \degree 360°×180° 的视场,需要至少两张鱼眼图像,例如典型的用两个视场大于 180 ° 180 \degree 180° 的鱼眼镜头分别在偏航为 0 ° 0 \degree 0° 180 ° 180 \degree 180° 的进行拍摄,这样就可以保证覆盖整张全景图,同时保留一定的重叠区域以方便参数的优化以及保证图像融合的效果。当然使用更多的鱼眼镜头可以使得画面更加精细,毕竟鱼眼镜头越远离光轴的景象越被压缩,而且重叠区面积增大也可以提供更多的控制点对,提升参数优化和图像融合的质量,但也会带来成本增加,机械设备误差或者故障发生的风险增大的问题。另外,增加一个相机意味着增加一组参数,那么参数优化的复杂度也会相应提升。

表1 可优化参数列表
参数类型参数列表备注
镜头参数镜头有效视场FOVField of View,圆形
镜头径向畸变参数a, b, c径向畸变矫正参数
传感器倾斜参数tilt, slant, rotate较少使用
传感器中心偏移offset_x, offset_y
剪切效应参数shear_x, shear_y较少使用
方位参数镜头姿态yaw, pitch, roll偏航,俯仰,旋转
光心偏移X, Y, Z详见文章 2
平面偏航、俯仰plane_y, plane_p详见文章 2

        在系统参数优化问题中,参数的数量越多,所需要的约束条件就越多,同时优化问题收敛的条件就越苛刻。为了减少需要优化的参数的数量,通常假设这些相机的固有镜头参数是相同的,即包括视场、径向畸变参数、传感器倾斜和中心偏移等这些外部一般不能改变的参数,因此只需要优化一组镜头参数。另外,通常也会选定一个相机作为全景图像的基准,称为主相机,这样就可以减少一组需要优化的方位参数,其他的相机则可以主相机为基准进行优化。注意,这里是参数优化,而不是纯粹的参数从无到有的求解,所以每个相机都应该首先提供一个合理的参数初始值,否则会大大地提升参数优化的难度,导致无法收敛。

        为了进行参数优化,我们首先得确定一个优化的目标。我们知道,物理空间的一个点以不同的方位参数拍摄会落在不同的鱼眼图像的不同位置,把这些对应着物理空间同一个点的不同位置称为控制点,一般来说以两个作为一对。因为目标全景图像只有一张,那么该物理空间点可以通过球面透视表示为唯一的球面坐标。因此,利用这些鱼眼图像各自的参数将控制点对根据图 1 从下至上的过程逆推回全景图像对应的球面时,理论上这些坐标应该是重合的。所以,我们的目标就是在不同的鱼眼图像上找出一系列的控制点对,然后优化出最佳的参数,使得这些控制点对逆映射到球面上时,彼此之间的距离最小。

        假设图 1 从下至上的逆映射过程可定义为一个非线性函数,即

x p = g ( x f ; θ f ) ,   x f ∈ R 2 ,   x p ∈ R 3 ,   ∥ x p ∥ = 1. (1) {{\mathbf{x}}_p} = {\mathbf{g}}\left( {{{\mathbf{x}}_f};{{\mathbf{\theta }}_f}} \right),{\text{ }}{{\mathbf{x}}_f} \in {\mathbb{R}^2},{\text{ }}{{\mathbf{x}}_p} \in {\mathbb{R}^3},{\text{ }}\left\| {{{\mathbf{x}}_p}} \right\| = 1.\tag{1} xp=g(xf;θf), xfR2, xpR3, xp=1.(1)

其中 x f {\mathbf{x}}_f xf 代表鱼眼图像上的坐标, x p {\mathbf{x}}_p xp 代表全景图像对应的球面坐标, θ f {\mathbf{\theta}}_f θf 代表表 1 中的参数,不同鱼眼图像对应着不同的参数。我们假设这个函数是连续可导的。虽然在开头两篇文章的分析中,我们主要讨论了图 1 从上至下的推导过程,但我们也能很容易推导出其逆向映射过程,除了镜头径向畸变校正这一步。因为我们采用的畸变校正模型中,实际落点距离 r r r 是关于入射角 θ \theta θ 的多项式函数,那么在逆映射的过程中,我们需要从实际落点距离 r r r 逆推回入射角 θ \theta θ,即使用校正模型的反函数。然而,该反函数我们很难推导,因此可以采用数值近似的方法,一种常用的方法是牛顿迭代法,这里不细说。

        如果我们有一对控制点 ( x f 1 , x f 2 ) ({\mathbf{x}}_{f1}, {\mathbf{x}}_{f2}) (xf1,xf2),可以得到它们的球面坐标对 ( x p 1 , x p 2 ) ({\mathbf{x}}_{p1}, {\mathbf{x}}_{p2}) (xp1,xp2),那么定义这一对控制点的代价函数为

l ( x ; θ ) = ψ ( x p 1 , x p 2 ) , x = [ x f 1 T , x f 2 T ] T , θ = [ θ f 1 T , θ f 2 T ] T . (2) l\left( {{\bf{x}};{\bf{\theta }}} \right) = \psi \left( {{{\bf{x}}_{p1}},{\rm{ }}{{\bf{x}}_{p2}}} \right),{\rm{ }} {\bf{x}} = {\left[ {{\bf{x}}_{f1}^T,{\rm{ }}{\bf{x}}_{f2}^T} \right]^T},{\bf{\theta }} = {\left[ {{\bf{\theta }}_{f1}^T, {\rm{ }}{\bf{\theta }}_{f2}^T} \right]^T}.\tag{2} l(x;θ)=ψ(xp1,xp2),x=[xf1T,xf2T]T,θ=[θf1T,θf2T]T.(2)

图2 球面距离示意图

其中 ψ {\psi} ψ 是两点的距离函数,可根据实际情况选择。通常来说,因为这两个点是在球面上的,因此一般使用球面距离,而不使用欧几里德距离。如图 2 所示,假如球面上有两点 A ( φ 1 , θ 1 ) A({\varphi}_1, {\theta}_1) A(φ1,θ1), B ( φ 2 , θ 2 ) B({\varphi}_2, {\theta}_2) B(φ2,θ2),其中 φ \varphi φ, θ \theta θ 分别是纬度和经度。那么我们可定义其球面距离为 A, B 之间的大圆劣弧长度,即

ψ ( a , b ) = R ⋅ ∠ A O B = R ⋅ arccos ⁡ ( a T b ∥ a ∥ ∥ b ∥ ) = R ⋅ arcsin ⁡ ( ∥ a × b ∥ ∥ a ∥ ∥ b ∥ ) . (3) \psi \left( {{\bf{a}},{\rm{ }}{\bf{b}}} \right) = R \cdot \angle AOB = R \cdot \arccos \left( {\frac{{{{\bf{a}}^T}{\bf{b}}}}{{\left\| {\bf{a}} \right\|\left\| {\bf{b}} \right\|}}} \right) = R \cdot \arcsin \left( {\frac{{\left\| {{\bf{a}} \times {\bf{b}}} \right\|}}{{\left\| {\bf{a}} \right\|\left\| {\bf{b}} \right\|}}} \right).\tag{3} ψ(a,b)=RAOB=Rarccos(abaTb)=Rarcsin(aba×b).(3)

那么,根据式(3)我们就得到了一条约束方程。另外,我们也可以分别计算 A, B 两点的南北和东西方向距离,其中东西方向距离可定义为平均纬度上的小圆劣弧长度,南北方向距离则可定义为纬度之间沿着经线的弧线长度,即

ψ φ ( a , b ) = R ⋅ ( ∣ φ 1 − φ 2 ∣ ) , (4.1) {\psi _\varphi }\left( {{\bf{a}},{\rm{ }}{\bf{b}}} \right) = R \cdot \left( {\left| {{\varphi _1} - {\varphi _2}} \right|} \right), \tag{4.1} ψφ(a,b)=R(φ1φ2),(4.1)

ψ θ ( a , b ) = R ⋅ cos ⁡ ( φ 1 + φ 2 ) ⋅ ( ∣ θ 1 − θ 2 ∣ ) . (4.2) {\psi _\theta }\left( {{\bf{a}},{\rm{ }}{\bf{b}}} \right) = R \cdot \cos \left( {{\varphi _1} + {\varphi _2}} \right) \cdot \left( {\left| {{\theta _1} - {\theta _2}} \right|} \right).\tag{4.2} ψθ(a,b)=Rcos(φ1+φ2)(θ1θ2).(4.2)

这样,我们实际上就得到了两个约束方程。一般来说,在优化过程中,我们不会同时使用式(3)和式(4)。

        由此,我们可以定义参数优化所用到的代价函数为

F ( Θ ) = 1 2 ∑ i = 1 m ( f i ( Θ ) ) 2 = 1 2 ∥ f ( Θ ) ∥ 2 , , (5.1) F\left( {\mathbf{\Theta }} \right) = \frac{1}{2}\sum\limits_{i = 1}^m {{{\left( {{f_i}\left( {\mathbf{\Theta }} \right)} \right)}^2}} = \frac{1}{2}{\left\| {{\mathbf{f}}\left( {\mathbf{\Theta }} \right)} \right\|^2},{\tag{5.1}}, F(Θ)=21i=1m(fi(Θ))2=21f(Θ)2,,(5.1)

f i ( Θ ) = l i ( x i ; θ i ) ,   Θ = θ 1 ∪ θ 2 ∪ ⋯ ∪ θ m ∈ R n . (5.2) {f_i}\left( {\mathbf{\Theta }} \right) = {l_i}\left( {{{\mathbf{x}}_i};{{\mathbf{\theta }}_i}} \right),{\text{ }}{\mathbf{\Theta }} = {{\mathbf{\theta }}_1} \cup {{\mathbf{\theta }}_2} \cup \cdots \cup {{\mathbf{\theta }}_m} \in {\mathbb{R}^n}. \tag{5.2} fi(Θ)=li(xi;θi), Θ=θ1θ2θmRn.(5.2)

其中 m m m 代表总共有 m m m 个约束方程,注意其不一定等于控制点的对数,因为在式(4)中一个控制点对可以定义两个约束方程。 n n n 代表总共有 n n n 个需要优化的参数,主要每个控制点对用到的鱼眼图像可能不同,所以其参数也就不一定相同,但也有一些公共的参数,例如镜头参数,因此这里使用了它们的并集。尽管在式(3)和(4)中我们使用的是球面距离,但在求所有控制点对的整体距离时还是使用了平方和,这相当于把球面距离当作一种样本误差,我们的目标是要最小化整体的误差平方和。对于 F ( Θ ) F\left( {\mathbf{\Theta }} \right) F(Θ) 来说我们其实并不知道其真正的函数形式,但为了方便一般假设其是一个高度非线性的连续函数,这时可将问题形式化为

Θ ∗ = arg ⁡ min ⁡ Θ { F ( Θ ) } . (6) {{\bf{\Theta }}^ * } = \arg {\min _{\bf{\Theta }}}\left\{ {F\left( {\bf{\Theta }} \right)} \right\}.\tag{6} Θ=argΘmin{F(Θ)}.(6)

        由于 F ( Θ ) F\left( {\mathbf{\Theta }} \right) F(Θ) 为平方和形式,因此也将式(6)称为最小二乘问题,相关的优化算法也有很多,比较常用的是 LM 算法,其原理可参考我的另一篇博客。注意,在 LM 算法优化过程中需要用到 F ( Θ ) F\left( {\mathbf{\Theta }} \right) F(Θ) 的 Jacobian 矩阵,也就是各 f i ( Θ ) {f_i}\left( {\mathbf{\Theta }} \right) fi(Θ) 关于各个参数的一阶偏导组成的矩阵,由于我们并不知道各 f i ( Θ ) {f_i}\left( {\mathbf{\Theta }} \right) fi(Θ) 的具体形式,因此可通过一些数值近似方法,例如比较简单的有限差分法,即给某一个参数增加非常小的步长 δ \delta δ,其他的参数保持不变,求解出新的函数值,那么函数值的差值除以 δ \delta δ 即为关于该参数的近似导数,即

f ( x + δ ) = f ( x ) + f ′ ( x ) δ + o ( δ ) , (7.1) f(x + \delta ) = f(x) + f'(x)\delta + o(\delta) , \tag{7.1} f(x+δ)=f(x)+f(x)δ+o(δ),(7.1)

f ′ ( x ) ≈ f ( x + δ ) − f ( x ) δ , δ  is  sufficient  samll. (7.2) f'(x) \approx \frac{{f(x + \delta ) - f(x)}}{\delta },{\rm{ }}\delta \text{{\rm{ is {\rm{ }}sufficient {\rm{ }}samll}}{\rm{.}}} \tag{7.2} f(x)δf(x+δ)f(x),δ is  sufficient  samll.(7.2)

不过这种方法计算量比较大,而且 δ \delta δ 应该足够小,否则不一定能满足有限差分的收敛性条件。

        在 LM 算法中,我们需要保证 F ( Θ ) F\left( {\mathbf{\Theta }} \right) F(Θ) 的 Jacobian 矩阵是列满秩的,一般来说也就要求约束方程要比需要优化的参数多,所以我们应该提供足够多的质量好的控制点对。PanoTools 全景工具库中使用了两种优化策略,也就是式(3)和(4)的区别。式(3)中一个控制点对只能提供一个约束方程,由于约束性相对不那么强,因此收敛速度会慢一些,但是稳定性相对较好。而式(4)中一个控制点对提供了两个约束方程,约束性要强一些,因此在初始参数设置较好时会有较快的收敛速度,但如果初始参数较差时稳定性会差一些。因此 PanoTools 中也采用了混合的优化策略,即前期使用式(3),只要每次迭代 F ( Θ ) F\left( {\mathbf{\Theta }} \right) F(Θ) 的下降比例都达到一定要求,否则切换到式(4)继续优化,这样就可以提高收敛速度和稳定性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值