利用OpenCV实现图像拼接Stitching模块讲解
https://zhuanlan.zhihu.com/p/71777362
1.1 图像拼接基本步骤

图像拼接的完整流程如上所示,首先对输入图像提取鲁棒的特征点,并根据特征描述子完成特征点的匹配,然后根据已经匹配的特征点对得到相邻图像的位置关系从而进行图像配准,由于直接进行图像配准会破坏视场的一致性,因而先将图像投影在球面或者柱面上,最后计算相邻图像的拼缝并完成重叠区域的融合,得到最终的全景图像。
2.1 输入图像
2.2 特征点提取和特征匹配
特征点指的是图像灰度值发生剧烈变化的点或者在图像边缘上曲率较大的点,用直白的话来说就是指,从不同的角度对同一个场景进行拍照,在每一幅照片中都能鲁棒的提取的图像的点就是特征点。一个好的特征点提取算法需要具有以下的特征:数量多,在不同场景下都能提取得到足够数量的特征点;独特性好,从而便于对特征点进行匹配;抗旋转,抗亮度变化,抗尺度缩放等,常用的特征点提取算法包括SIFT,SURF,ORB等,OpenCV的拼接模块集成了SURF/ORB两种特征点提取算法,代码如下:
特征描述子就是描述一个特征点的属性,比如sift算法就是使用一个128维的向量,通过比较不同图像特征点的特征向量的欧式距离从而判断这两个特征点是否能进行匹配。
2.3 图像配准
该步骤的计算思路是计算两幅图像的单应性矩阵,从而得到一幅图像相对于另一幅图像的位置,用公式描述为

由于每个特征点都有 两个坐标,因此只需要四个点即可求解出该八参数模型的解,同时考虑到前面利用特征向量匹配得到的特征点对可能存在误匹配,因此使用RANSAC算法进行求解,简单地说就是,每次随机抽取四个点求解单应性矩阵,然后根据该单应性矩阵判断剩余的匹配对是否为正确匹配,选择正确匹配数量最多的一组来进行求解,一个简单的算法流程图为:

另外前面的算法孤立求解两幅图像之间的位置,如果直接进行多幅图像的拼接会造成误差的累积,因此使用光束平差法进行联合优化,可以同时优化多个相机参数,从而得到更准确的图像位置,
水平矫正


2.4 图像投影
在得到相机的相对位置,如果直接进行拼接会破坏视场的一致性,使得拼接得到的全景图看起来不够连贯,因此需要通过投影变换将所有图像都投影在球面,柱面等,投影平面的选择与相机拍摄的方式有关系,一般来说球面投影,柱面投影是最为常用的投影方式。OpenCV代码为:
到这一步为止,图像拼接可以认为基本完成了,但是此时拼接得到的结果可能存在明显的亮暗变化,可能存在部分错位,图像与图像之间的重叠区域也会有明显的过渡痕迹,为了解决这些问题,通过下面的后处理手段可以得到更好的结果。
2.5曝光补偿
如果在拍摄过程中,由于未固定曝光,就会导致不同时刻拍摄得到的图片的整体亮度不同,那么直接进行拼接就会出现明显的明暗上的变化,因此需要设置曝光补偿,使得不同照片的整体亮度一致:
2.6 拼缝计算和图像融合
拼缝就是指图像之间重叠区域中最为相似的那条线,在得到相邻两幅图像的拼缝位置后,在拼缝附近的若干个像素使用融合算法,对于重叠区域中远离拼缝的位置只选择一侧的图像,通过这样的方法,可以有效的去除图像之间的错位,伪像,得到更好的拼接结果。
常用的融合算法有羽化融合和拉普拉斯融合算法,羽化融合就是对拼缝附近的位置根据与接缝的距离求出权重,加权融合,而拉普拉斯融合算法相当于求出图像不同频率的分量,然后按频率进行融合,显然拉普拉斯融合算法效果更好,但计算复杂度也更高。
利用OpenCV实现图像拼接Stitching模块讲解的更多相关文章
- opencv笔记--stitching模块
opencv 提供了全景图像拼接的所有实现,包括: 1)stitching 模块提供了图像拼接过程中所需要的基本元素,该模块主要依赖于 features2d 模块: 2)提供了 stitching_d ...
- 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)
一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...
- Stitching模块中对特征提取的封装解析(以ORB特性为例)
titching模块中对特征提取的封装解析(以ORB特性为例) OpenCV中Stitching模块(图像拼接模块)的拼接过程可以用PipeLine来进行描述,是一个比较复杂的过程.在这个过程 ...
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- 【OpenCV开发】使用OpenCV的OpenCL(ocl)模块
参加OpenCV的OpenCL模块(以下称OCL)移植工作已经有2个月了.这里我说移植而不是开发,是因为大部分OCL模块的函数都是从已经很成熟的GPU模块移植过来的.于是目前阶段OCL模块所支持的函数 ...
- 小白的Python之路 day5 shelve模块讲解
shelve模块讲解 一.概述 之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,有什么方法可以向dump多少次就dump多少次,并且load不会出 ...
- #利用openCV裁脸
#利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...
- 利用OpenCV给图像添加中文标注
利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html 和https://blog.csdn.net/ ...
- 善于利用python中的os模块
作为一个程序猿,平时善于利用python中的os模块进行路径等操作,会省去很多麻烦,下面总结一下我平时经常用到的方法: import os os.getcwd() # 获取当前文件所在的目录 os.p ...
随机推荐
- day91_11_13Local与偏函数
一.local 在线程的处理中,常常遇到这样的问题.当一系列线程遇到io操作的时候,就会执行其他线程,这时候就会出现数据冲突,发生数据方面的问题: from threading import Thre ...
- Scrum会议(第十一周)
十一周会议 1.任务分配: github相关代码 2.会议记录: 总结并阐述了自己在上周存在的问题以及解决了自己把自己的issue发在了自己的github,并没有把问题发在我们项目小组的项目的issu ...
- Linux 小工具
1. 截图工具 shutter 安装 sudo add-apt-repository ppa:shutter/ppa sudo apt-get update sudo apt-get install ...
- vue项目里面使用脚手架实现跨域
今天在做vue项目的时候,项目在本地,接口数据在阿里云,这就造成了跨域,在网上找了好久,网上大部分的方法都是找到config文件夹下面的index进行修改的,可是我找到的Index却和他们描述的不一样 ...
- Vue自定义指令使用方法详解 和 使用场景
Vue自定义指令的使用,具体内容如下 1.自定义指令的语法 Vue自定义指令语法如下: Vue.directive(id, definition) 传入的两个参数,id是指指令ID,definitio ...
- .net core入门-跨域访问配置
Asp.net Core 跨域配置 一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is prese ...
- python爬取 “得到” App 电子书信息
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 静觅 崔庆才 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- Spring之 JDBC 异常
JDBC异常抽象 Spring会将数据操作的异常转换为DataAccessException 解析错误码 SQLErrorCodeSQLExceptionTranslator ErrorCode定义 ...
- JavaWeb之Servlet(3)
Servlet(3) HttpServletRequest 该类的对象封装了所以客户端提交过来的数据 获取所有请求头数据 public java.util.Enumeration<E> g ...
- python 通过使用pandas的实现的Excel的批量转换CSV文件的处理
---恢复内容开始--- 最近同事在处理文件导入的时候需要把一批文件换成CSV的格式,但是直觉修改后缀是不生效的,而且xlsx和xls的文件没法直接换成CVS的文件,所以找了一下方式,并且自己实现了p ...