C++ OpenCV如何进行图像全景拼接
C++ OpenCV如何进行图像全景拼接
C++OpenCV如何进行图像全景拼接,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
前言
下面将使用OpenCV C++ 进行图像全景拼接。目前使用OpenCV对两幅图像进行拼接大致可以分为两类。
一、使用OpenCV内置API Stitcher 进行拼接。
二、使用特征检测算法匹配两幅图中相似的点、计算变换矩阵、最后对其进行透视变换就可以了。
一、OpenCV Stitcher
imageA
imageB
原图如图所示。本案例的需求是将上述两幅图片拼接成一幅图像。首先使用OpenCV提供的Stitcher进行拼接。关于Stitcher的具体原理请大家自行查找相关资料。
1.功能源码
boolOpenCV_Stitching(MatimageA,MatimageB){vector
2.效果
这就是使用OpenCV 内置Stitcher拼接出来的效果。
二、图像全景拼接
1.特征检测
使用方法二进行图像全景拼接。目前网上教程大致流程归为:
1、使用特征检测算子提取两幅图像的关键点,然后进行特征描述子匹配。我这里使用的是SURF算子。当然SIFT等其他特征检测算子也可以。
//创建SURF特征检测器intHessian=800;Ptr
如图为使用FLANN算法进行特征描述子匹配的结果。我们需要把那些匹配程度高的关键点筛选出来用以下面计算两幅图像的单应性矩阵。
2、筛选出匹配程度高的关键点
doubleMax=0.0;for(inti=0;i
如图为imageA筛选出来的关键点。
如图为imageB筛选出来的关键点。
从上图可以看出,我们已经筛选出imageA,imageB共有的关键点部分。接下来,我们需要使用这两个点集计算两幅图的单应性矩阵。
2.计算单应性矩阵
计算单应性变换矩阵
//获取图像A到图像B的投影映射矩阵,尺寸为3*3MatH=findHomography(goodkeypointA,goodkeypointB,RANSAC);MatM=(Mat_
3.透视变换
根据计算出来的单应性矩阵对imageA进行透视变换
//进行透视变换MatDstImg;warpPerspective(imageA,DstImg,Homo,Size(imageB.cols+imageA.cols,imageB.rows));imshow("透视变换",DstImg);
如图所示为imageA进行透视变换得到的结果。
4.图像拼接
根据上述操作,我们已经得到了经透视变换的imageA,接下来只需将imageA与imageB拼接起来就可以了。
imageB.copyTo(DstImg(Rect(imageA.cols,0,imageB.cols,imageB.rows)));imshow("图像全景拼接",DstImg);
5.功能源码
boolImage_Stitching(MatimageA,MatimageB,booldraw){//创建SURF特征检测器intHessian=800;Ptr
6.效果
最终拼接效果如图所示。
三、源码
#include 小编使用OpenCV C++进行图像全景拼接,关键步骤有以下几点。 1、使用特征检测算子提取两幅图像的关键点,然后进行特征描述子匹配。 2、筛选出匹配程度高的关键点计算两幅图的单应性矩阵。 3、利用计算出来的单应性矩阵对其中一张图片进行透视变换。 4、将透视变换的图片与另一张图片进行拼接。 看完上述内容,你们掌握C++OpenCV如何进行图像全景拼接的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
推荐阅读
-
Linux如何安装和使用 OpenCV 计算机视觉库
-
C++之list容器模拟怎么实现
C++之list容器模拟怎么实现这篇“C++之list容器模拟怎么...
-
C++深浅拷贝及简易string类怎么实现
C++深浅拷贝及简易string类怎么实现这篇“C++深浅拷贝及简...
-
C++之list容器如何使用
C++之list容器如何使用今天小编给大家分享一下C++之list...
-
C++内存对齐如何实现
C++内存对齐如何实现本篇内容介绍了“C++内存对齐如何实现”的有...
-
C/C++如何获取CAN信号
C/C++如何获取CAN信号本篇内容主要讲解“C/C++如何获取C...
-
C/C++程序链接与反汇编工具objdump如何使用
C/C++程序链接与反汇编工具objdump如何使用这篇文章主要介...
-
C++聚合体初始化的方法是什么
C++聚合体初始化的方法是什么本篇内容介绍了“C++聚合体初始化的...
-
C++引用如何使用
C++引用如何使用这篇文章主要介绍“C++引用如何使用”的相关知识...
-
C++类和对象之封装及class与struct的区别是什么