先来看看OpenCV官方的例子得到效果是非常的好,输入的images如下:
效果:
#Stitcher类与detail命名空间
OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑太多的细节。
低级别函数封装在detail命名空间中,展示了OpenCV算法实现的很多步骤和细节,使熟悉如下拼接流水线的用户,方便自己定制。
可见OpenCV图像拼接模块的实现是十分精密和复杂的,拼接的结果很完善,但同时也是费时的,完全不能够实现实时应用。
我在研究detail源码时,由于水平有限,并不能自由灵活地对各种部件取其所需,取舍随意。
官方提供的stitching和stitching_detailed使用示例,分别是高级别和低级别封装这两种方式正确地使用示例。两种结果产生的拼接结果相同,后者却可以允许用户,在参数变量初始化时,选择各项算法。如下所示:
这涉及到以下算法流程:
命令行调用程序,输入源图像以及程序的参数
特征点检测,判断是使用surf还是orb,默认是surf。
对图像的特征点进行匹配,使用最近邻和次近邻方法,
将两个最优的匹配的置信度保存下来。
对图像进行排序以及将置信度高的图像保存到同一个集合中,
删除置信度比较低的图像间的匹配,得到能正确匹配的图像序列。
这样将置信度高于门限的所有匹配合并到一个集合中。
对所有图像进行相机参数粗略估计,然后求出旋转矩阵
使用光束平均法进一步精准的估计出旋转矩阵。
波形校正,水平或者垂直
拼接
融合,多频段融合,光照补偿。
另外在拼接的时候可以设置不同warper,这样会对拼接之后的图像生成不同效果,常见的效果包括
- 鱼眼相机
- 环视(平面曲翘)
- 默认
如下图所示:
代码演示:
#include #include using namespace cv;using namespace std;int main(int argc, char** argv) { vector files; glob("D:/images/zsxq/1