图像拼接:即把来自多个不同视角相机打图像变换到同一视角下,无缝拼接成一张宽视野图像。
A、一些说明:
什么情况下不同位置,视角打相机可以变换到同一视角下拼接?
一是各相机几何中心重合;当相机打几何中心重合时,其在一个相机视角下的像点在另一个相机视角下总有一个与其对应的像点。由此,可利用单应变换,把两张不同视角下拍摄打照片变换到同一视角下,从而能够实现两张图像的拼接。如下图所示。
具体说明:
××:当相机打几何中心不重合时,其单应性变换被破坏,即两相机打像点不存在一一对应打关系,此时一个相机视角下所呈现打像在另一个视角下可能并不存在,故由此无法将两张图变换到同一视角下。如下图所示:
详细说明如下:
二是各相机位置任意,但场景是一个平面。此时也存在单应变换。
注:曲面投影——解决平面投影下宽视场角下的拼接问题。
另外为实现良好的拼接效果,仍又很多问题需要考虑,其中最典型的有:一、如何解决不同照片中曝光不一致的问题;二、如何在拼接处更好地融合两张图像。
对于问题一:计算两图片打曝光差值,然后进行曝光补偿;对于问题二:最为经典打方法是利用Multi-band融合方法Multi-band说明 。
B、图像拼接流程详解:
其中Step1中的模型也即拼接后图像所呈现的效果平面。
图像拼接流程 这篇博文对于整个拼接的流程说得很具体,比较容易理解每一步需要处理的任务。其中在特征提取中说到的ORB特征可参见《ORB特征提取描述算法》中的说明。
实践过程:
现有的opencv中有现有的算法stitch(image,res),其中image是指待拼接的图像向量,res指拼接后返回的图像。代码可见下图:
效果展示:
需要注意到的是,带拼接的图像需要有部分区域的重叠才能实现拼接,否则会返回无法拼接;另外,该算法的拼接速度较慢,因为其算法首先是要找到在图像向量中的所有图片两两相拼接的图是哪张,也就是说,对于输入的图片并不在乎其相互间的顺序,而如果我们可以得到一系列在时间上有序的图片时,则可以在拼接的时候无需遍历所有的图片来寻找需要拼接的是哪两张图片,直接将待拼接的下一张图片与前一张图片进行拼接即可。
所以有必要来了解一下opencv中的Stitcher类是如何实现的。相关函数Stitcher类中的相关函数
在这儿附上stitching的pipeline,根据具体问题的不同,所需要涉及到的处理操作也会不同: