本文为CSDN原创文章,转载请注明出处
本章主要讲opencv stitching_detail的图像拼接算法
对原理性的东西不多赘述,具体可以参见该大佬的文章
https://blog.csdn.net/zhaocj/article/details/78798687
关于目前的全景拼接算法综述,可参考知乎大佬全面的叙述:https://www.zhihu.com/question/34535199/answer/135169187
本文的图像拼接是基于opencv的图像拼接,对6幅图进行拼接,效果如下,
6图拼接效果
给出一个opencv全景拼接器的下载链接,可达到上图效果,其中包含下面博文的图片素材
https://download.csdn.net/download/qq_28901541/10747238
其opencv的拼接速度极慢,博主对其进行了一定的优化,使得速度大为提升,并对比了各个算法的速度和质量优劣,并给出了实验数据,流程分为以下几步:
图像拼接算法流程图
特征点检测与提取算法的介绍
opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。
原理不赘述,给出其实验结果对比和分析,
原始图像1
SURF特征点提取
ORB特征点提取
其中SURF提取特征点所用时间为0.233115秒,ORB提取特征点所用时间为0.0189878秒。在提取特征点的速度上ORB明显快于SURF,但是在特征点提取的数量上,ORB明显少于SURF。
特征点匹配
采用2-NN和次近邻算法实现匹配,线性计算单应矩阵并归一化,同时用RANSAC算法筛选出内点,并用LM算法再次计算得到更为精确的单应矩阵H
原始图像1
原始图像2
SURF提取特征点并经过相应算法进行匹配后的图像
ORB提取特征点并经过相应算法进行匹配后的图像
其中SURF算法获得的内点数量为243,耗费的总时间为0.693864秒,ORB获得的内点数量为80,耗费的总时间为0.118437秒。可以发现,ORB速度明显快于SURF,但是提取的特征点也远少于SURF,图像特征是图像拼接质量的关键,在进行图像拼接时,需要在速度与质量之间进行取舍。
相机参数计算
由单应矩阵H通过相应计算得到相机的内参矩阵K和外参矩阵R,此过程称为相机标定。但是由于多个图像间的约束,会忽略全局的限制,参数会产生累积误差。本设计中,采用光束平差法(Bundle Adjustment)来精确相机参数,减少累积误差。
应用基于LM算法的光束平差法来消除累积误差,其误差指标函数有两个,一个是重映射误差,一个是光束发射误差,射线发射误差为两条射线间的最短距离d,其原因是由两个相机的射线透过相片达到同一个物点后并不会相交所造成的。
实验采用的是光束发射误差的方法,通过基于LM算法的光束平差法来联合两个相机参数,较大程度的减少了两个摄像头之间的累积误差。但是光束平差法容易引起波形效应,使得拼接的图像呈现出蛇型分布,需要引入一个全局矫正矩阵来对图像进行波形校正。
相机参数计算
图像投影变换
实验时两个相机是处于不同角度拍摄图片的,两幅图片并不会在同一个投影平面上, 因此,为了保证拼接图像视觉的一致性使得拼接图像处于同一个投影平面,需要对待拼接的两幅图像进行投影变化。
根据计算机视觉库,实验中的投影方式有很多种,诸如平面投影、横轴墨卡托投影、柱面投影、墨卡托投影、球面投影、鱼眼投影、立体投影等。
下面通过对上面原始图像进行相关平面的投影,比较五种投影平面的耗时以及投影效果图,
下面仅给出原始图像1的实验效果图:
立方体投影
球面投影
鱼眼投影
柱面投影
平面投影
下表为各投影方式的耗时
曝光补偿
通过投影变换后,图像得到了很好的拼接,且具有了一定的视觉一致性,但是由于出厂时,两个相机自身的参数不可能完全一致,虽然其内参通过相机参数估计及光束平差法所解决,但是并未解决其曝光程度差异的问题。因此,可能存在一幅图像明显较亮,而另一幅图像明显较暗,从而造成拼接后的图像重合区域存在一定的亮度差异,出现明显的边缘,所以需要对两幅图像进行曝光补偿,使得两幅图具有相似或相同的曝光程度。实验中补偿方式有两种,一种是增益补偿,一种是分块补偿。
增益补偿是分别对两幅图赋予一个增益,使得两幅图的重叠部分增益相等或者相似;而分块补偿,其补偿精度较好,是将图像分成大小相同的不同块,然后给予不同块不同的增益系数,相当于分块进行增益补偿,由于存在多个块多个增益系数,就如同多个相机拍摄的多个图片一样,将会存在不同程度的曝光,所以为了使产生的效果不呈现出“块”形态,需要对所有块的增益系数应用分割线性滤波方法进行平滑滤波实验中采用的滤波核为[1/4, 1/2,1/4]。
可以看出,两幅原始图像的重叠区域有相对明显的亮度差异,原始图1曝光补偿后变亮了,原始图2曝光补偿后变暗了,使得两幅图像的亮度十分接近。而曝光补偿的目的正是通过给予重叠部分不同的增益,调节两幅图像的亮度差异,使得两幅图像的亮度接近。
缝合线估计
当处理完上述步骤之后,需要进行缝合线估计。倘若不进行缝合线估计,拼接图像的重合区域可能会出现明显的鬼影以及模糊现象。通过在两幅图像的重叠区域内寻找一条缝合线,在重叠区域,缝合线的左侧选择该侧图像部分,右侧选择右侧图像部分。缝合线对处理视差有着特别明显的效果,特别是对于大场景环境。选取最佳缝合线,可以选择两幅图像重合区域差异最小的位置,避开错位的坐标点,但是消耗的计算机资源较多,不利于实时拼接。
缝合线的寻找方法有三种可选择,分别为逐点法,动态规划法,图割法。
不使用缝合线,浅蓝色框中的图像是柱面投影变换后的图像,其他三种方法寻找的缝合线在两幅图的重叠区域,可以看出,该条缝合线即为分界线,拼接图像的左侧选择分界线左边的图像,右侧选择分界线右边的图像。
各方法寻找缝合线的耗费时间如下,
其中逐点法寻找缝合线的方法是基于距离计算的,运算速度自然最快,但是寻找到的缝合线与其他方法对比,缝合线十分粗糙。而动态规划法与最大流检测法相比,虽然速度快了两倍多,但是其精准度显然要次于图割法,质量稍差。因此,在速度相差并不是很大的情况下,选择缝合线质量最好的最大流检测法。
图像融合
得到缝合线之后, 基于缝合线,对图像融合处理,是图像拼接的最后一步。由于待拼接图像之间存在视差、光照、色差以及若干配准偏差等误差的存在,使得待拼接图像在重叠区域会有一定的差异,而图像融合处理可使待拼接图像的重合区域有一个比较自然且平滑的过渡,较大程度地较少重叠区域不连贯的现象以及减少拼接图像重合区域的突兀,可以消除明显的拼接缝隙,使拼接图像看起来更加自然。图像融合常用的方法有加权融合、渐入渐出融合、多频段融合。,原理不再此做赘述。
下面给出实验效果图,
简单融合
简单融合耗费的时间为0.0140秒,可以通过效果图看出,虽然拼接缝不明显,但是中间部分仍有突兀。
对比三幅渐入渐出融合的效果图,其羽化锐度只是一个加权系数,对融合速度并不会造成影响。对两幅原始图像中进行实验,三个羽化锐度参数所对应的融合速度在0.33S~0.36S之间,而其融合效果相差十分明显,羽化锐度越大,线性加权平均效果越好,拼接缝越不明显,图像重合区域的过度看起来更加的自然。实际运用中,通过改变加权系数,找到合适的值,来调整图像重叠区域的平滑过渡,使重叠区域看起来更加自然。
多频段融合时,选用四层金字塔所用的时间为0.0543秒,选用八层金字塔用时0.1041秒,选用16层金字塔用时0.2283秒。对比三幅不同金字塔层数的多频段融合图像,可以发现,金字塔层数越多,即频段分的越多,图像重叠区域过度越自然,融合效果越好,但是耗费的时间随层数翻倍而翻倍。
如果进行图像拼接时,对算法速度要求不高,首先选择多频段融合,并且设置的频段数量尽可能的多,如果对算法速度比较苛刻,不追求极限,优先选择渐入渐出融合,并通过调整加权系数来使重叠区域自然过渡。