鱼眼图像的全景矫正

18 篇文章 22 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

1 球面透视投影与展开

       鱼眼镜头的成像通常首先要进行球面透视投影,即将三维空间中的点沿着经过镜头光学中心的直线投影到以光心为原点的单位半径球体 内表面 上,从而球面上的每一个点,可通过相应的经纬度来表示。如图 1 所示,以镜头光学中心为原点建立三维直角坐标系,其中 X Y Z XYZ XYZ 轴满足右手定则。通常令 Y Y Y 轴与镜头光轴重合,并指向相机外部; Z Z Z 轴指向镜头顶部; X X X 轴指向镜头右侧。那么空间中任意一点 P P P 沿着直线 O P OP OP 投影到单位球面上的点 P 1 P_1 P1 的经度(longitude)可表示为直线 O P OP OP 投影到 X O Y XOY XOY 平面上的直线与 Y Y Y 轴的夹角,常用符号 θ \theta θ 表示,其中位于 Y Y Y 轴左侧的称为西经, − π ≤ θ ≤ 0 - \pi \le \theta \le 0 πθ0,位于右侧的称为东经, 0 ≤ θ ≤ π 0 \le \theta \le \pi 0θπ。点 P 1 P_1 P1 的纬度(latitude)可表示为直线 O P OP OP X O Y XOY XOY 平面的夹角,常用符号 φ \varphi φ 表示,其中位于 X O Y XOY XOY 平面上方的称为北纬, 0 ≤ φ ≤ π / 2 0 \le \varphi \le \pi /2 0φπ/2,位于下方的称为南纬, − π / 2 ≤ φ ≤ 0 - \pi /2 \le \varphi \le 0 π/2φ0。不同的系统可能会采用不同的坐标轴方向定义,但通常需要满足右手定则,例如在开源软件 Hugin 中,其坐标系方向为图 1 坐标系绕 X X X 轴逆时针(脸朝 X X X 轴负方向)旋转了 90 度,即 Z Z Z 轴与光轴重合并指向相机内部, Y Y Y 轴则指向镜头顶部;对于经纬度的定义也可能与上述存在少许差异,但基本原理类似,不再赘述。因为我们基本没法做出一个球面的成像传感器,所以对于投影到球面上的点,可根据一定的鱼眼投影模型进一步投影到成像平面得到相应的鱼眼图像。因此,鱼眼图像的矫正过程实际上就是找出球面上每个经纬度对应的鱼眼图像坐标,从而可以通过插值获得该经纬度的像素信息,然后将球面展开为所需要的平面图像。

图1 球面透视投影模型

       球面的展开通常基于等矩形(equirectangular)也叫等距圆柱投影模型,即将球面展开为矩形网格,其中网格的大小与相应的经度与纬度区间大小成正比,如图2所示。如果是基于圆柱(cylindric)投影的话垂直方向的坐标实际上表示的是纬度的正切值,这时只需要将其换算回弧度即可,不过要注意由于正切的原因纬度是不能接近 π / 2 \pi/2 π/2 的,剩余的矫正过程与等矩形投影完全一致。由于球面展开后水平视场(Field of View, FOV)为 2 π 2\pi 2π,而垂直视场为 π \pi π,所以全景图像的横竖比例通常为 2:1,但也可以根据需要进行裁剪。假设其宽度为 W W W,高度为 H H H,以 ( x , y ) (x, y) (x,y) 代表从图像 左下角 起水平第 x x x 个,垂直第 y y y 个像素,则其经纬度可表示为

θ = 2 π W ⋅ ( x − W − 1 2 ) , φ = π H ⋅ ( y − H − 1 2 ) . (1-1) \theta = \frac{{2\pi }}{W} \cdot \left( {x - \frac{{W - 1}}{2}} \right),{\rm{ }}\varphi = \frac{\pi }{H} \cdot \left( {y - \frac{{H - 1}}{2}} \right).\tag{1-1} θ=W2π(x2W1),φ=Hπ(y2H1).(1-1)

图2 球面的等矩形投影

2 鱼眼投影成像模型

       球面上的点通过鱼眼镜头投影到相机成像平面得到鱼眼图像的过程通常基于光线折射的原理,即光线进入鱼眼镜头后会发生折射,且在成像平面上的落点和光轴之间的距离 r r r 与入射光线和光轴的夹角即入射角 θ \theta θ 相关,落点处在入射光线与光轴所组成的平面上。不同的函数关系 r = f ( θ ) r = f\left( \theta \right) r=f(θ) 对应了不同的鱼眼投影模型。图 3 展示了几种比较经典的 鱼眼投影模型,其对应名称如表 1 所示。

图3 经典鱼眼投影模型

表1 经典鱼眼投影模型
名称别名投影函数
RectilinearPerspective r = f ⋅ t a n ( θ ) {r=f \cdot tan(\theta)} r=ftan(θ)
Stereographic r = 2 f ⋅ t a n ( θ / 2 ) {r=2f \cdot tan(\theta/2)} r=2ftan(θ/2)
EquidistantEqui-angular r = f ⋅ θ {r=f \cdot \theta} r=fθ
EquisolidEqual-area r = 2 f ⋅ s i n ( θ / 2 ) {r=2f \cdot sin(\theta/2)} r=2fsin(θ/2)
OrthographicSine-law r = f ⋅ s i n ( θ ) {r=f \cdot sin(\theta)} r=fsin(θ)

       直线投影(Rectilinear)或者说透视投影(Perspective)相当于小孔成像,三维空间中的直线投影到鱼眼图像中同样是一条直线。虽然该直线首先被投影在球面上看上去是一条曲线,但由于 tan ⁡ \tan tan 函数的原因,在最终的鱼眼图像上,我们又重新得到了一条平面直线,因此我们可以认为这种投影并没有产生畸变。然而,从其投影函数可以看出,当入射角趋近于 90 度时,其在图像平面上的落点将趋近于无穷远,所以不能作为超广角镜头的投影模型。从名字可以看出,等距投影(Equidistant)或者说等角投影(Equiangular)中落点到光轴的距离与入射角成线性正比例关系,从而相同的角差对应相同的距差,类似于图 2 中球面的等矩形展开。由于其投影函数比较简单,而且在接近光轴位置的图像畸变较小,同时能够在有限且较小的图像平面上的反映入射角大于 90 度的空间点,所以在鱼眼成像分析以及实际生产中比较常用。当鱼眼镜头的视场 F O V FOV FOV 以及对应的图像半径 R R R 确定时,对于等距投影模型,我们可以得到其等效焦距 f = 2 R / F O V f=2R/FOV f=2R/FOV

图4 鱼眼镜头参数校正示意图

       实际上,表 1 中所提到的几种投影模型属于比较简单的近似,由于生产环境以及生产工艺的限制,实际的投影函数可能与上述的理想函数存在偏差,从而导致计算的落点与实际的落点出现偏差,如 图4 所示,其中 r s r c r_{src} rsrc 对应原始即实际的落点距离, r d e s t r_{dest} rdest 对应表 1 中理想即近似计算的落点距离。一般来说这种偏差只是对于落点距离 r r r 而言(径向畸变),而不会对共面性造成破坏(切向畸变)。对于高端的鱼眼镜头,其厂商通常会提供相应 r − θ r-\theta rθ 曲线,从而可以用高阶的多项式进行拟合,称为镜头校正函数,相应的多项式系数称为镜头校正参数。校正函数的形式并不固定,不同的系统可能使用不同的多项式阶数以及自变量和因变量。一种常用的校正函数形式是以 r r r 作为自变量, θ \theta θ 作为因变量, 即

θ ( r ) = a 0 + a 1 r + a 2 r 2 + ⋯ + a n r n . (2-1) \theta \left( r \right) = {a_0} + {a_1}r + {a_2}{r^2} + \cdots + {a_n}{r^n}.\tag{2-1} θ(r)=a0+a1r+a2r2++anrn.(2-1)

由于通常假设鱼眼具有径向对称性,因此零阶项取 0,基本上采用 4 阶的多项式即可拟合大部分的镜头校正曲线。但是,在鱼眼图像矫正过程中,通常是从目标即如图 2 中的全景图像坐标倒推到鱼眼图像坐标,因此所需要的其实是上述镜头校正函数的反函数,然而获取反函数并不是一件易事。所以, PanoTools 工具库使用了一种 4 阶的从理想落点距离 r d e s t r_{dest} rdest 到实际落点距离 r s r c r_{src} rsrc 的多项式拟合函数, 即

r s r c = ( a r d e s t 3 + b r d e s t 2 + c r d e s t + d ) r d e s t , r d e s t = f ⋅ θ f o r E q u i d i s t a n t . (2-2) {r_{src}} = \left( {ar_{dest}^3 + br_{dest}^2 + c{r_{dest}} + d} \right){r_{dest}},{\rm{ }}{r_{dest}} = f \cdot \theta {\rm{ }}for{\rm{ }}Equidistant{\rm{.}}\tag{2-2} rsrc=(ardest3+brdest2+crdest+d)rdest,rdest=fθforEquidistant.(2-2)

对于一个理想的基于等距投影模型的鱼眼镜头,有 a = b = c = 0 , d = 1 a=b=c=0,d=1 a=b=c=0,d=1。由于校正后的落点可能超出鱼眼图像的尺寸范围,因此在某些应用中为了保持相同的尺寸,需要令 d = 1 − ( a + b + c ) d=1-(a+b+c) d=1(a+b+c),注意这时 r r r 已被归一化。

3 鱼眼图像矫正

       有了前述的铺垫,我们可以很容易地推导目标全景图像到鱼眼图像的坐标映射关系。对于全景图像上的任意一个像素点 ( m , n ) (m, n) (m,n),由式(1-1)可得到单位球面上相应的经度 θ \theta θ 和纬度 φ \varphi φ,那么球面上相应的三维直角坐标为

x = cos ⁡ φ sin ⁡ θ , y = cos ⁡ φ cos ⁡ θ , z = sin ⁡ φ . (3-1) x = \cos \varphi \sin \theta ,{\rm{ }}y = \cos \varphi \cos \theta ,{\rm{ }}z = \sin \varphi .\tag{3-1} x=cosφsinθ,y=cosφcosθ,z=sinφ.(3-1)

在前述内容中,我们知道 Y Y Y 轴对应了鱼眼镜头的光轴并指向镜头前方,为了便于理解,将图 1 的坐标系绕着 X X X 轴逆时针旋转 90 度(注意这只是转换视角, Y Y Y 轴还是与光轴重合),如图 5 所示。假设鱼眼图像的中心在镜头光轴延长线上,根据鱼眼的折射模型,可以得到球面上点 P P P 在鱼眼图像平面上的投影点 P 1 P_1 P1,其中 P 1 P_1 P1 到图像中心的距离为 r r r。由于此时鱼眼图像与实际拍摄物体发生了 180 度旋转,因此不妨令点 P P P 在鱼眼图像上的投影点为 P 2 P_2 P2,其在鱼眼图像上的位置如图 6 所示,这里假设该鱼眼图像为正方形,边长为 W f W_f Wf,有效投影区域为相应的内切圆,即未被裁剪。实际上,内切圆外部的四个角也可认为是鱼眼图像的一部分,只是对应更大的入射角。令入射角为 φ f \varphi_f φf,其取值范围为 [ 0 , π ] [0, \pi] [0,π]。可以看出鱼眼镜头最大入射角的两倍即是该鱼眼镜头的有效视场 F O V f FOV_f FOVf。令 P 2 P_2 P2 相对于 X X X 轴正半轴的偏转角为 θ f \theta_f θf,其取值范围为 [ − π , π ] [-\pi, \pi] [π,π]

图5 鱼眼投影示意图
图6 鱼眼图像点坐标示意图

       由图5容易可求得

φ f = arctan ⁡ 2 ( x 2 + z 2 , y ) , θ f = arctan ⁡ 2 ( z , x ) . (3-2) {\varphi _f} = \arctan 2\left( {\sqrt {{x^2} + {z^2}} ,{\rm{ }}y} \right),{\rm{ }}{\theta _f} = \arctan 2\left( {z,{\rm{ }}x} \right).\tag{3-2} φf=arctan2(x2+z2 ,y),θf=arctan2(z,x).(3-2)

根据等距投影模型, P 2 P_2 P2 点在鱼眼图像上与图像中心的距离 r = f ⋅ φ f r=f \cdot \varphi_f r=fφf,其中 f f f 称为鱼眼镜头的等效焦距。由于 r r r 的最大值对应于入射角的最大值,因此可得

f = r m a x φ f m a x = W f / 2 F O V f / 2 = W f F O V f , r = W f F O V f φ f . (3-3) f = \frac{{{r_{max}}}}{{{\varphi _{fmax}}}} = \frac{{{W_f}/2}}{{FO{V_f}/2}} = \frac{{{W_f}}}{{FO{V_f}}},{\rm{ }}r = \frac{{{W_f}}}{{FO{V_f}}}{\varphi _f}. \tag{3-3} f=φfmaxrmax=FOVf/2Wf/2=FOVfWf,r=FOVfWfφf.(3-3)

那么可求得 P 2 P_2 P2 相对于鱼眼图像中心的坐标为

( x f , y f ) = ( r cos ⁡ θ f , r sin ⁡ θ f ) . (3-4) \left( {{x_f},{\rm{ }}{y_f}} \right) = \left( {r\cos {\theta _f},{\rm{ }}r\sin {\theta _f}} \right).\tag{3-4} (xf,yf)=(rcosθf,rsinθf).(3-4)

由式(3-4)通过如双线性或者双三次等插值算法即可得到目标全景图相应像素点对应的经纬度的像素值。对于较低分辨率的目标全景图还可以采用超采样方法即先将目标全景图放大一定倍数进行坐标映射然后再缩小回原来的尺寸,从而在一定程度上减少边缘锯齿现象。

       通过前面的分析可以看到,对于同一张如图 6 所示的鱼眼图像,采用不同的有效视场(即内切圆对应视场)参数 F O V f FOV_f FOVf,得到的全景矫正图像是不一样的。图 7 展示了一些 例子,其中红色边缘对应图 6 的正方形边框,蓝色边缘对应了其内切圆即有效投影区域。当视场小于 180 度时,我们无法看到两极以及背后的景物,因此全景图的上下左右边缘部分都是空白的;而当视场刚好为 180 度时,我们刚好能够看到一半的球面,包括两个极点,这时内切圆被矫正为一个正方形;而当视场大于180度时,我们不仅能看到两极,还能看到靠近两极的背面部分,即这部分展开后的水平视场可以大于 180 度甚至达到 360 度,类似于地球两极的极昼现象,视场越大,能够看到的背面部分就越多。由于实际生产中制造 360 度视场的鱼眼镜头几乎是不可能的,所以单个鱼眼镜头矫正后是不能填满整张全景图的,因此可通过朝着多个方向拍摄多张鱼眼图像矫正后通过重叠区的匹配再拼接成一张完整的 360 度全景图。

图7 不同鱼眼镜头视场参数的矫正效果

4 镜头偏航、俯仰与旋转处理

       在前面的分析中,目标全景图即图 2 是以图 1 所示的直角坐标系为参考的,其 Y Y Y 轴指向了全景图像的中心,也就是我们所期望拍摄的方向,而鱼眼图像即图 6 是以图 5 所示的直角坐标系为参考的,其以鱼眼镜头为基准, Y Y Y 轴实际上与镜头的光轴重合,并指向镜头的正前方,也就是相机实际拍摄的方向。一般情况下,暂不考虑坐标原点即镜头光心的平移,相机实际拍摄的方向就是我们所期望拍摄的方向,所以图 5 的直角坐标系相和图 1 的直角坐标系是重合的。然而,当两者方向不一致时,坐标系发生了偏转,因此通过式(3-1)求得的三维直角坐标并不能直接用于式(3-2)的求解,因为两者对应了不同的空间点,从而会导致坐标映射出现错误。因此,需要将式(3-1)求得的以图 1 坐标系为参考的直角坐标变换到以图 5 坐标系为参考的空间中。

       镜头相对于目标拍摄方向的偏转可通过三个角度参数定义,即 偏航角(yaw)、俯仰角(pitch)和旋转角(roll),其定义如图 8 所示,其中 Y Y Y 轴与镜头光轴重合并指向镜头前方。偏航角反映光轴的水平偏离程度,即绕着 Z Z Z 轴旋转,可定义向左为正角度。偏航只会改变经度而不会改变纬度,因此其基于等矩形投影展开得到的全景图像的垂直可视区间不会发生改变,而水平可视区间则只是平移,所以偏航处理也是最简单的,除了通过常规的仿射变换得到图 5 参考系的坐标,也可以直接按照无偏航处理,最后将矫正后的全景图按照偏航的方向和角度进行相应的像素平移即可,如图 9 右上角图所示。通常 360 度全景拼接就是采用两个有效视场大于 180 度的鱼眼镜头分别在偏航为 0 和 180 度的方向各拍摄一张鱼眼图像,从而得到足够重叠区域以进行后续的融合操作。

图8 偏航角、俯仰角、旋转角示意图

图9不同偏航、俯仰、旋转参数下的矫正结果

       俯仰角反映了光轴的垂直偏离程度,即绕着 X X X 轴旋转,可定义向上为正角度。俯仰会导致经度和纬度同时发生改变,因此需要通过仿射变换来获取新参考系的坐标以及进行后续的坐标映射。以镜头向上抬仰为例,北半球高纬度的区域水平可视范围增加直至达到360度,而南半球高纬度的区域水平可视范围缩减直至全部消失,如图 9 左下角图所示。这类似于太阳的直射点的变化,但不同的是镜头是在球体的内部,被拍摄物通过透视被投影在球体的内表面上。当仰角达到 90 度时,全景图像中鱼眼镜头有效视场对应的纬度下方的区域将全部不可见。通常来说,对于正常拍摄,其俯仰角应该是一个较小的数值。

       旋转角反映了镜头的旋转程度,即绕着 Y Y Y 轴旋转,可定义逆时针(脸朝 Y Y Y 轴正方向)为正角度。实际上,鱼眼镜头具有旋转对称性,因此鱼眼镜头的旋转并不会导致拍摄区域的改变。然而,由于镜头与成像平面即感光器件如 CCD 的位置是相对固定的,所以镜头旋转实际上反映了感光器件的旋转,从而导致鱼眼图像发生了旋转,相当于图 5 所定义的参考系发生了偏转。旋转同样会导致经度和纬度同时发生改变,因此也需要通过仿射变换来获取新参考系的坐标以及进行后续的坐标映射。作为示例,图 9 右下角图反映了旋转参数为 45 度的鱼眼图像矫正结果。通常来说,对于正常拍摄,其旋转角应该是一个较小的数值。

图10 坐标点的旋转

       偏航、俯仰和旋转的处理可通过仿射变换来实现。由于三者都是绕着坐标轴旋转,实际上等价于二维平面上坐标点绕着原点的旋转。以图 10 为例,点 A A A 的坐标为 ( x , y ) = ( c o s θ , s i n θ ) (x, y)=(cosθ, sinθ) (x,y)=(cosθ,sinθ),其绕着原点逆时针旋转 φ \varphi φ 得到 A ′ A' A,其坐标为 ( x ′ , y ′ ) (x', y') (x,y),那么有

[ x ′ y ′ ] = [ cos ⁡ ( θ + φ ) sin ⁡ ( θ + φ ) ] = [ cos ⁡ θ cos ⁡ φ − sin ⁡ θ sin ⁡ φ sin ⁡ θ cos ⁡ φ + cos ⁡ θ sin ⁡ φ ] = [ x cos ⁡ φ − y sin ⁡ φ y cos ⁡ φ + x sin ⁡ φ ] = [ cos ⁡ φ − sin ⁡ φ sin ⁡ φ cos ⁡ φ ] [ x y ] , [ x y ] = [ cos ⁡ ( − φ ) − sin ⁡ ( − φ ) sin ⁡ ( − φ ) cos ⁡ ( − φ ) ] [ x ′ y ′ ] = [ cos ⁡ φ sin ⁡ φ − sin ⁡ φ cos ⁡ φ ] [ x ′ y ′ ] . (4-1) \begin{array}{c} \left[ {\begin{array}{c} {x'}\\ {y'} \end{array}} \right] = \left[ {\begin{array}{c} {\cos \left( {\theta + \varphi } \right)}\\ {\sin \left( {\theta + \varphi } \right)} \end{array}} \right] = \left[ {\begin{array}{c} {\cos \theta \cos \varphi - \sin \theta \sin \varphi }\\ {\sin \theta \cos \varphi + \cos \theta \sin \varphi } \end{array}} \right]\\ \\ = \left[ {\begin{array}{c} {x\cos \varphi - y\sin \varphi }\\ {y\cos \varphi + x\sin \varphi } \end{array}} \right] = \left[ {\begin{array}{c} {\cos \varphi }&{ - \sin \varphi }\\ {\sin \varphi }&{\cos \varphi } \end{array}} \right]\left[ {\begin{array}{c} x\\ y \end{array}} \right],\\ \\ \left[ {\begin{array}{c} x\\ y \end{array}} \right] = \left[ {\begin{array}{c} {\cos \left( { - \varphi } \right)}&{ - \sin \left( { - \varphi } \right)}\\ {\sin \left( { - \varphi } \right)}&{\cos \left( { - \varphi } \right)} \end{array}} \right]\left[ {\begin{array}{c} {x'}\\ {y'} \end{array}} \right] = \left[ {\begin{array}{c} {\cos \varphi }&{\sin \varphi }\\ { - \sin \varphi }&{\cos \varphi } \end{array}} \right]\left[ {\begin{array}{c} {x'}\\ {y'} \end{array}} \right]. \end{array} \tag{4-1} [xy]=[cos(θ+φ)sin(θ+φ)]=[cosθcosφsinθsinφsinθcosφ+cosθsinφ]=[xcosφysinφycosφ+xsinφ]=[cosφsinφsinφcosφ][xy],[xy]=[cos(φ)sin(φ)sin(φ)cos(φ)][xy]=[cosφsinφsinφcosφ][xy].(4-1)

令以图 5 坐标系为参考系的点坐标为 ( x ′ , y ′ , z ′ ) (x', y', z') (x,y,z),以图 1 坐标系为参考系的点坐标为 ( x , y , z ) (x, y, z) (x,y,z),图 5 坐标系即镜头方向相对于图 1 坐标系即目标方向的偏航角为 φ y \varphi_y φy,俯仰角为 φ p \varphi_p φp,旋转角为 φ r \varphi_r φr,其正方向为图 8 所定义的方向,因为坐标系逆时针旋转对于坐标点来说实际上是顺时针旋转的,那么对于偏航,有

[ x ′ y ′ z ′ ] = [ cos ⁡ φ y sin ⁡ φ y 0 − sin ⁡ φ y cos ⁡ φ y 0 0 0 1 ] [ x y z ] = A y [ x y z ] . (4-2) \left[ {\begin{array}{c} {x'}\\ {y'}\\ {z'} \end{array}} \right] = \left[ {\begin{array}{c} {\cos {\varphi _y}}&{\sin {\varphi _y}}&0\\ { - \sin {\varphi _y}}&{\cos {\varphi _y}}&0\\ 0&0&1 \end{array}} \right]\left[ {\begin{array}{c} x\\ y\\ z \end{array}} \right] = {{\bf{A}}_y}\left[ {\begin{array}{c} x\\ y\\ z \end{array}} \right].\tag{4-2} xyz = cosφysinφy0sinφycosφy0001 xyz =Ay xyz .(4-2)

同理,对俯仰和旋转,有

A p = [ 1 0 0 0 cos ⁡ φ p sin ⁡ φ p 0 − sin ⁡ φ p cos ⁡ φ p ] , A r = [ cos ⁡ φ r 0 sin ⁡ φ r 0 1 0 − sin ⁡ φ r 0 cos ⁡ φ r ] . (4-3) {{\bf{A}}_p} = \left[ {\begin{array}{c} 1&0&0\\ 0&{\cos {\varphi _p}}&{\sin {\varphi _p}}\\ 0&{ - \sin {\varphi _p}}&{\cos {\varphi _p}} \end{array}} \right],{\rm{ }}{{\bf{A}}_r} = \left[ {\begin{array}{c} {\cos {\varphi _r}}&0&{\sin {\varphi _r}}\\ 0&1&0\\ { - \sin {\varphi _r}}&0&{\cos {\varphi _r}} \end{array}} \right].\tag{4-3} Ap= 1000cosφpsinφp0sinφpcosφp ,Ar= cosφr0sinφr010sinφr0cosφr .(4-3)

如果同时有偏航、俯仰和旋转,那么

[ x ′ y ′ z ′ ] T = A y A p A r [ x y z ] T . (4-4) {\left[ {\begin{array}{c} {x'}&{y'}&{z'} \end{array}} \right]^T} = {{\bf{A}}_y}{{\bf{A}}_p}{{\bf{A}}_r}{\left[ {\begin{array}{c} x&y&z \end{array}} \right]^T}.\tag{4-4} [xyz]T=AyApAr[xyz]T.(4-4)

       在图 5 中我们假设成像平面即感光器件是严格垂直于镜头光轴且其中心在光轴延长线上,如果不满足上述假设,例如成像平面出现倾斜、旋转或者中心与光轴出现偏移等现象,另外还有运动物体由于逐行扫描而产生的错切现象,类似于前面镜头姿态的分析,可以对坐标再进一步调整。由于通常来说这些现象都比较细微,在此不详细讨论。

5 鱼眼矫正示例

       以上介绍了鱼眼图像到全景图像的基本矫正原理,在实际应用中,我们其实还有很多问题需要解决。例如,通常两个鱼眼的光心不在同一点上,这时就会导致视差的出现,那我们应该怎么去解决?另外就是我们以上讨论了那么多参数,但这些参数又怎么求解?这些都需要进一步的讨论。但是,基于以上原理,给定一张鱼眼图像,以及相应的如视场、偏航等等参数,我们至少可以得到该鱼眼图像在目标全景图像上的基本效果了。以下提供了简单的基于 Python 的鱼眼矫正实现,以及相应的 示例。注意,因为 Python 是解释性语言,处理循环通常比较低效,而我们需要对目标全景图上的每一个像素进行插值以获得相应的像素值,这个过程需要比较长的时间,所以目标全景图的尺寸不要设置得太高,基本 400x200 都需要十几秒。



# -*- coding: utf-8 -*-

from __future__ import print_function, division
import numpy as np
import cv2
from scipy.interpolate import interp2d

""" ------------------ parameters ----------------- """

src = cv2.imread('exampleleft.jpg', -1) / 255.     # source fisheye image
h, w, c = src.shape

rx, ry = 1024., 1024.               # center of the fisheye circle, (0, 0) for bottom left corner
R = 1024.                           # radius of the fisheye circle

fov = 210 * np.pi / 180.            # field of view of the fishye circle
W, H = 600, 300                     # size of the output panorama

interp_method = 'cubic'             # must in ['linear', 'cubic', 'quintic']
upsample = 2                        # factor of super-sampling anti-aliasing

yaw, pitch, roll = 0, 0, 0          # degree 


""" ----------------- processing -------------------- """

up_W, up_H = W *upsample, H * upsample

yaw = yaw * np.pi / 180.              # rotate around z, angle from x+ to y+
yaw_m = np.array([[np.cos(-yaw), -np.sin(-yaw), 0], [np.sin(-yaw), np.cos(-yaw), 0], [0, 0, 1]])

pitch = pitch * np.pi / 180.          # rotate around x, angle from y+ to z+
pitch_m = np.array([[1, 0, 0], [0, np.cos(-pitch), -np.sin(-pitch)], [0, np.sin(-pitch), np.cos(-pitch)]])

roll = roll * np.pi / 180.            # rotate around y, angle from x+ to z+
roll_m = np.array([[np.cos(-roll), 0, -np.sin(-roll)], [0, 1, 0], [np.sin(-roll), 0, np.cos(-roll)]])

affine_m = yaw_m.dot(pitch_m).dot(roll_m)

# by default, the horizontal FOV is [-pi, pi], the verticle FOV is [-pi/2, pi/2]
phi   = np.linspace(1, -1, up_H, endpoint=False) * np.pi * 0.5   # latitude of the equirectangular
theta = np.linspace(-1, 1, up_W, endpoint=False) * np.pi         # longitude of the equirectangular

theta, phi = np.meshgrid(theta, phi)

x = np.cos(phi) * np.sin(theta)     # 3D space x
y = np.cos(phi) * np.cos(theta)     # 3D space y
z = np.sin(phi)                     # 3D space z

# yaw, pitch, roll inverse affine tranformation
xyz = np.vstack([mat.reshape(-1) for mat in [x, y, z]])
no_rpy_xyz = affine_m.dot(xyz)

x, y, z = [coord.reshape([up_H, up_W]) for coord in no_rpy_xyz]

phi_f   = np.arctan2(np.sqrt(x*x + z*z), (y + 1e-12))     # incident angle of the fisheye
theta_f = np.arctan2(z, (x + 1e-12))                      # projection angle of the fisheye plane

r_f = phi_f * 2 * R / fov          # equidistant model, where r = C * theta
x_f = rx + r_f * np.cos(theta_f)   # x coordinate on the fisheye plane
y_f = ry + r_f * np.sin(theta_f)   # y coordinate on the fisheye plane
    
dst = np.zeros([up_H, up_W, c])
for i in range(c):
    interp = interp2d(np.arange(w), np.arange(h)[::-1], src[:, :, i], interp_method, fill_value=0)
    for j in range(up_H):
        for k in range(up_W):
            if (x_f[j, k] < w and y_f[j, k] < h):
                dst[j, k, i] = interp(x_f[j, k], y_f[j, k])
                
dst = (np.clip(dst, 0, 1) * 255).astype('uint8')
if upsample > 1:
    dst = cv2.resize(dst, (W, H), cv2.INTER_CUBIC)
cv2.imwrite('panorama.png', dst)

参考资料

  • http://michel.thoby.free.fr/Fisheye_history_short/Projections/Models_of_classical_projections.html
  • http://paulbourke.net/dome/dualfish2sphere/
  • http://michel.thoby.free.fr/Fisheye_history_short/Projections/Fisheye_projection-models.html
  • http://paulbourke.net/dome/fisheyecorrect/
  • https://wiki.panotools.org/Lens_correction_model
  • http://paulbourke.net/dome/fish2/
全景拍摄—焦距与对焦教程
VRRainbow的博客
07-21 2069
镜头上两个重要参数: 焦距 光圈 焦距定义:相机的镜头是一组透镜,当平行于主光轴的光线穿过透镜时,光会聚到一点上,这个点叫做焦点,焦点到透镜中心(即光心)的距离,就称为焦距。 简单来说,焦距决定的是我们的视角,也即是决定了取景范围。数字越小,焦距越短,视角越宽广,取景范围越大 18mm焦距拍摄 55mm拍摄 对焦分为自动对焦和手动对焦,一般来说,全手动挡(即M档)下,变焦镜头上会有两个可以转动的环(定焦镜头一个),一个就是用来调整焦距的,另一个就是对焦环 手动对焦:调整镜头为M档,...
鱼眼图像校正
10-15
鱼眼图像的参数标定和畸变校正,希望对大家有帮助,对学习鱼眼镜头摄像机很有帮助
等距模型鱼眼图像校正(校正+线性+双线性插值)
11-11
资源包含了基于等距模型的鱼眼图像校正算法的Matlab实现,同时代码中给出了Matlab实现的线性插值和双线性插值。下载后添加图片直接运行即可。(适当调节rows1,cols1的数值,改变映射图像的效果,最好效果建议rows1=rows;cols1=cols)
鱼眼摄像头畸变校正方法概述
最新发布
人无远虑,必有近忧
04-13 1233
非对称径向畸变是类似于上述的径向畸变效应,但与对称径向畸变不同,非对称径向畸变表征的是依赖于图像中心距离以及被成像对象距离有多远的畸变效应。与以往的径向畸变模型不同,后者是基于点距离图像中心的远近(半径),康拉-布兰特将畸变表征为通过镜头的光的入射角度的函数。在本节中,我们讨论了各种用于鱼眼相机畸变校正的最新方法,旨在将畸变的鱼眼图像转换为经过校正的图像,使其类似于理想针孔相机捕获的图像。通过在大量畸变和未畸变鱼眼图像对的数据集上训练CNNs,它们可以学习预测给定鱼眼图像的无畸变版本的基本模式和关系。
鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
大胡子大叔的专栏
10-03 6760
1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。
一文讲透鱼眼相机畸变矫正,及目标检测项目应用
3D视觉工坊
09-03 6499
点击上方“3D视觉工坊”,选择“星标”干货第一时间送达1个人介绍大家好,我是潘大强。目前博士毕业4年,主要从事智能安防行业。之前也分享过AI从业的一些心得,个人介绍链接。应大白的邀请,从A...
鱼眼图像的校正(Python实现)
Megurine_Luka_的博客
12-05 7139
问题描述 本文承接上文《鱼眼图像提取有效区域》,链接:https://blog.csdn.net/Megurine_Luka_/article/details/110563049 相对于常规镜头,鱼眼镜头拍摄的图像视角广,能看到很大范围的东西。但这会以所拍摄的图像产生一定程度的扭曲为代价(畸变)。图像校正就是修正畸变图像的过程。 方案 本文的校正策略仍是参考论文《鱼眼成像全景漫游系统的研究》,链接:https://xueshu.baidu.com/usercenter/paper/show?pape
鱼眼图像的校正算法
11-09
图像处理提供参考,希望对初学者提供一定的帮助
鱼眼镜头畸变矫正【亲自改的,可用】
07-18
说一下其中出现的函数作用及大致流程:读图→灰度化→测角点→亚像素角点→画角点(可画可不画,画是为了自己能imshow出来看到,我画了,但没有imshow,各位可以自行添加)→计算世界坐标→求相机的内参K和畸变系数D→求矫正后图片的坐标mapx和mapy→用remap映射到图上→最终imshow
鱼眼图像畸变校正最终版
09-14
鱼眼标定校正 opencv3.0 ,效果还可以,运行环境vs2010,里面配有网格图片,稍微配一下opencv路径,就可以看矫正效果。简单快捷
鱼眼矫正fisheye
06-29
对于鱼眼相机形成的畸变进行矫正矫正效果比较理想。对于鱼眼矫正这一块初学者来说,有较大的意义
鱼眼校正fisheye correction
09-08
鱼眼校正最常见的经度校正、双经度校正、透视投影校正的相关算法文档和matlab code 适合刚刚入门做鱼眼校正、几何变换的同学作为参考资料。
基于鱼眼矫正的原理
07-31
基于鱼眼矫正的原理,大于180° 矫正
opencv3.0 鱼眼镜头标定校正代码
05-22
opencv3.0 鱼眼镜头标定校正 来自http://blog.csdn.net/qq_15947787/article/details/51441031 内有部分标定图
opencv全景图片(鱼眼)的平面映射矫正源码.zip
07-30
该代码亲测,能够在vs2013 2015 opencv2.4.13,opencv2.4.10正常运行。针对全景鱼眼相机的矫正效果比较好。原理是:全景图片的 在球面图片的平面映射。
全景鱼眼图像校正测试算法
04-09
对于球面鱼眼镜头有很大的校正效果,绝对可靠,已经验证过,内附matlab代码,检查标定代码。学习研究很有必要
经纬度映射法校正鱼眼图像 程序
09-07
使用matlab方法对鱼眼相机拍摄的畸变图像进行经纬映射方法矫正 矫正效果相对较好,大家可以试试看!希望对各位有所帮助
鱼眼畸变矫正 固定内外径法
09-08
本文介绍一种对鱼眼相机拍摄的全景图像进行畸变矫正的方法,主要采用的是固定内外径法对鱼眼图像进行畸变矫正。测试结果需要反复调试,找到一个合适的半径和圆心
鱼眼镜头全景图像拼接
07-12
你可以使用拼接算法将多个鱼眼镜头捕捉到的图像拼接成全景图像。拼接算法主要分为以下几个步骤: 1. 图像校正:校正鱼眼镜头的畸变,将其转换为等距投影或其他几何投影方式。这可以通过使用镜头校正模型或者几何变换方法来实现。 2. 特征提取和匹配:使用特征提取算法(如SIFT、SURF或ORB)在图像中提取关键点和描述子,然后使用匹配算法(如FLANN、BFMatcher或者RANSAC)来匹配这些特征点。 3. 图像对齐:基于特征匹配结果,通过计算图像之间的变换矩阵(如单应性矩阵或仿射矩阵)来对齐图像。 4. 图像融合:将对齐后的图像进行融合,可以通过平均值融合、渐变融合或者多重分辨率融合等方法来实现。 5. 后处理:对融合后的全景图像进行色彩校正、边缘处理、补洞等后处理操作,以提高全景图像的质量和逼真度。 需要注意的是,多鱼眼镜头全景图像拼接是一个复杂的任务,涉及到图像处理、计算机视觉和几何学等多个领域的知识。因此,实现该功能可能需要使用一些开源库或者自行编写代码来完成。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 传统图像降噪算法之BM3D原理详解 28411
  • 维纳滤波原理与一般定义 14527
  • 图解格拉姆-施密特正交化和改进的格拉姆-施密特正交化 12438
  • 离散傅里叶变换DFT、离散余弦变换DCT、离散正弦变换DST,原理与公式推导 10950
  • 鱼眼图像的全景矫正 10034

分类专栏

  • 数字信号处理 9篇
  • 算法 18篇
  • 深度学习 2篇
  • 鱼眼图像处理 3篇
  • C/C++笔记 7篇
  • 工具 2篇

最新评论

  • VVC/VTM: 自适应环路滤波(ALF, Adaptive Loop Filtering)中维纳滤波(Wiener Filtering)的公式推导

    你好,请叫我靓仔: 就这样 哈哈 可爱

  • 传统图像降噪算法之BM3D原理详解

    峡谷相对论: 我把直流系数改为0,也就是相当于先把数据减去均值,不然这个值很大。除了直流也可以按需把部分低频系数置零,直到看起来作图比较合适就行了。

  • 传统图像降噪算法之BM3D原理详解

    小十二的三三: 大佬,您好,我想请教一个问题,关于您画的DCT变换系数图,x,y轴分别是怎么处理的吖?我用DCT变换之后我的大部分系数都是0?x轴和Y轴是频率做映射了嘛?谢谢您

  • 图解格拉姆-施密特正交化和改进的格拉姆-施密特正交化

    峡谷相对论: 这个没用过不清楚,如果是QR分解的话应该是Householder方法比较多,因为这个的复杂度比较低。

  • 图解格拉姆-施密特正交化和改进的格拉姆-施密特正交化

    JZY370: envi5.6里面用的是哪种方法呀

最新文章

  • 拉普拉斯金字塔的频谱分析
  • 高斯函数的傅里叶变换与离散化频谱分析
  • OpenCV中的RGB与YUV转换
2024年1篇
2023年9篇
2022年9篇
2021年2篇
2020年11篇
2019年3篇

目录

目录

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司和县网站优化按天扣费公司白银优化公司荆门百姓网标王公司连云港seo网站优化价格龙岗网站seo优化报价朝阳关键词按天收费推荐呼和浩特外贸网站设计推荐秦皇岛网站推广方案商洛网站优化软件价格衡水设计网站报价平湖高端网站设计推荐嘉兴外贸网站制作多少钱昭通推广网站报价乐山网站排名优化公司通辽企业网站改版多少钱广州网站设计模板报价那曲阿里店铺运营商洛seo哪家好迁安企业网站设计哪家好武威seo网站优化南澳百度seo价格来宾网站建设设计价格铁岭阿里店铺运营公司吉祥SEO按天收费价格大芬企业网站建设多少钱漳州网页设计公司珠海企业网站建设哪家好潍坊百度爱采购安阳阿里店铺托管价格白城关键词排名公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化