Python实验四:全景拼接

一、全景拼接原理介绍

全景视图是指在一个固定的观察点,能够提供水平方向上方位角360度,垂直方向上180度的自由浏览,简化的全景只能提供水平方向360度的浏览。

通常全景图像的获得有两种方法:全景拍摄和通过图像拼接来获得全景图像。前者需要特殊的设备,但是操作起来非常方便,简单易行,但是,这种设备价格非常昂贵,不适合普及。后者只需要普通的相机就可,但是需要进行相应的图像投影和拼接,所谓图像投影是指把实景图像投摄到一个统一的圆柱或者球体表面的过程,这样可以消除图像间存在的旋转关系,只保留平移关系,适合拼接。图像拼接是指两幅不同视角方向具有一定重叠部分的图像合成一幅图像。显然后者的重点在于图像的拼接和融合上,一般建议每两幅图像的重叠度应该在50%左右,全景图的变换示意如图所示,该全景图是圆柱全景图。获得全景图后,用户选取任意视角进行观察,相应视角图像的绘制过程其实质是纹理图像取景变换后在简单景物几何上重投影的过程。把平面全景图反投影回圆柱或者球体,使人们能够进行逼真的浏览。基于全景的方法的最大特点和优点是易于实现、效率高、漫游速度快、不需要很高的硬件配置,在普通计算机上都能够实现场景的漫游。全景图是预先处理好的,这种方法也存在缺点:固定视点漫游,如果视点进行移动,图像会存在变形,这个是一个很大的局限。

1. 图像拼接传统做法:

    1).特征点提取:sift、surf、orb等特征点提取;
    2)基于特征点的配准:RANSAC方法剔除匹配点并拟合图像变换矩阵(全局单应性矩阵);
    3).图像融合:先确定缝合线,再利用加权融合、多频带融合的方法融合;

    RANSAC算法的原理
    RANSAC算法需要寻找一个最优单应性矩阵H,矩阵大小为3×3。利用RANSAC算法找到的最优单应性矩阵H需要使得满足该矩阵的匹配特征点最多。由于常常令h33=1来归一化矩阵,所以单应性矩阵H只有8个未知参数,所以至少需要8个线性方程才能进行求解,而对应到点位置信息上,一组特征匹配点可以得到两个线性方程,因此至少需要4组特征匹配点对才能求解得到单应性矩阵H。
Python实验四:全景拼接
  其中(x,y)表示目标图像角点位置,(x’,y’)为场景图像角点位置,s为尺度参数。
  RANSAC算法从匹配数据集中随机抽出4个样本,并保证这四个样本之间不共线。然后计算出其单应性矩阵,然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数)。若此模型为最优模型,则对应的代价函数最小,计算代价函数的公式如下:
Python实验四:全景拼接

方法:除了按照上文提到的顺序利用opencv进行拼接,还可以用opencv自带的stitch类,拼接很方便,效果也很好。

2.图像拼接出现的问题:
对于大视差的物体(可以理解为离摄像头比较近的物体,或者待拼接的图片上有远景有近景)
可采用的方法,分为两种,一种是基于缝合线的方法,可以参看确定Seam- Driven 、Content preserving warp 、Parallax-toleranting stitching 这三种方法,很经典的。
二是采用基于网格优化及网格约束的方法,代表有DHW、SVAS,APAP,SPHP、AANAP等方法。

二、针对不同场景做全景拼接
1)室内场景

Python实验四:全景拼接

2)室外景深落差较大的场景
3)室外景深落差较小的场景

Python实验四:全景拼接Python实验四:全景拼接
Python实验四:全景拼接

三、实验结果分析

1.室内拼接效果还可以,光线亮度比较统一。
2.室外景深落差较小的场景,右边拼接得很不成功,估计是两张图片光线明暗不同的