计算机视觉(五)--图像全景拼接原理及实现_Shar-bh的博客-程序员秘密

技术标签: 图像拼接  

一、图像全景拼接的原理

图像全景拼接就是将多张图片(两两间存在一定的重叠部分,可以是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。也就是将两幅存在一定重合部分的图像,通过算法(如SIFT)进行特征点匹配从而得到对应点,将这些得到的对应点重合并保留两张图片的未重合部分,就可运行出次两张图片的拼接结果。

1.特征点匹配

本次实验主要采用了SIFT算法进行,之前的博客中有讲SIFT算法的基本原理等,链接:
https://blog.csdn.net/weixin_42104269/article/details/88630089

2.图片匹配

2.1 RANSAC随机一致性采样

RANSAC算法的基本假设是样本中包含正确数据(可以被模型描述的数据),也包含异常数据(偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
基本思想描述如下:
A.首先,考虑一个最小抽样集的势为n的模型(n为初始化模型参数所需的最小样本数)和一个样本集P,集合P的样本数#§>n,从P中随机抽取包含n个样本的P的子集S初始化模型M;
B.余集SC=P\S中与模型M的误差小于某一设定阈值t的样本集以及S构成S*。S可认为是内点集,它们构成S的一致集;
C.若#(S
)≥N,认为得到正确的模型参数,并利用集S采用最小二乘等方法重新计算新的模型M;重新随机抽取新的S,重复以上过程。
D.在完成一定的抽样次数后,若未找到一致集则算法失败,否则选取抽样后得到的最大一致集判断内外点,算法结束。

2.2 Homography透视变换

Homography就是将图像投影到一个新的视平面。
在全景图像拼接的时候,很多图像会由于拍摄角度等问题出现一些方向上的不同步,有时需要将图片进行旋转。而控制这个变换的方式就是通过透视矩阵与原图像的矩阵形式相乘从而得到新的图像矩阵。

PS:因为我现在对这个也没有理解的很清楚,所以写的比较简略,不理解的地方建议多参考其他资料。

二、图像全景拼接的实现

首先要找到PVC文件夹下的tools文件,打开里面的ransac.py,找到下图的代码
在这里插入图片描述
print格式加括号,然后重装PVC

注意:图片要从右向左

1.室内全景图

这里先温馨提示一下,室内图拼出了科幻虚空的感觉(hiahiahia~)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实看到有一些的特征点匹配(从天匹配到地上那种),已经能预感到它飞一般的结果了

在这里插入图片描述
我觉得主要还是图片的问题,场景选择的不好,有太多相似的场景结构,导致特征点匹配的时候出现了错误,没有得出足够的正确对应点,以至于在重叠图片对应点坐标的时候产生了很大的空间误差,导致图片的拼接发生了扭曲的情况。
而且,可以明显的观察到,较中间的图片比较清晰完整,两头的图像则会有点被拉伸的感觉,比较模糊。

2.室外全景图

对于景深落差的问题…我的理解就是,景深落差小即正常拍摄的风景图片,景深落差大就是镜头前有离镜头较近的某个参照物,图片中有远景与近景较大的落差。

景深落差小

下图是集美大学中山纪念馆和嘉庚图书馆的全景拼接图(为了实现的效果能好一点,我在拍摄时是竖着手机拍的,并且重叠的部分个人觉得还是蛮多的。不过事实证明效果还不错)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我觉得总体来说这张室外拼接图还是比较不错的(毕竟对比前面的室内-全是柱子-图,简直天差地别),与上面的失败图片作对比就能跟好的看出,对图片的要求:要较为平稳 的拍摄,远景效果好于近景即图片内同一参照物大小差越小的效果越好(图片取景较近往往会出现两边图片会被拉伸、像素模糊的问题)、取景要尽量避免相似区域多的场景等。

景深落差大

我是在上图的基础上,找了一根灯柱作为离镜头近的参照物,以此来拉大景深(?不知道对不对,反正就是这样啦)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这次的拼接效果没有景深小的图片效果好,图片的拼接缝隙比较明显,连接的也不是很平滑(反正我的图片是这样,不知道是不是大家做出来都类似)。而且灯柱有点歪了,我觉得我拍的时候挺直的,不过有可能是因为拍摄角度的问题出现了一些方向上的不同步,图片被扭曲旋转了?(诶,好好一根灯柱,就给扭曲掰弯了)

3.总结

1.可能是因为图片比较清晰,所以运行的时间会非常的慢(之前有了解一点点surf算法,有时间或许可以试试)。
2.选取的场景最好不要有太多的相似区域,会影响到特征点的匹配导致错误对应点数量过多影响到拼接,使得图片拼接失败(问题大的就会看到极其科幻的拼接结果)。
3.拍摄图片时要尽量使得图片内的同一参照物大小差不多。近景(室内)图片拼接的中间比较清晰完整,两边会被拉伸、像素会变得模糊,远景(室外)图片拼接时拉伸小,不会出现很夸张的问题。
4.个人实验结果中景深落差小的图片效果会更好,景深落差大的图片,在拼接时缝隙会较大,连接不够平滑;而且由于要选择一个离镜头较近的参照物,可能会使拍摄角度等问题出现一些方向上的不同步之类的,会需要将图片进行旋转,可能会导致效果不够理想(比如我可怜的灯柱)。
5.同组图片的运行结果会不同(有时候还会突然失败,可能是玄学吧),主要应该是因为特征点的匹配不同,所选取出的正确和错误的对应点集不同,有时会进行程度不同的透视变换。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42104269/article/details/88936616

智能推荐

NS3基本知识_tttabcgy的博客-程序员资料

转载自http://blog.sina.com.cn/s/blog_61e2420a0101jy5j.html3 NS3快速入门本章节通过阅读分析一个例子程序(first.cc)的源代码,并通过运行该例子程序,快速理解ns3中的几个概念。3.1 NS3中的几个关键概念3.1.1 节点Node在网络术语中,任何一台连接到网络的计算设备被称为主机,亦称为终端。NS3是一个网络模拟器

pandas常用操作_桥豆麻袋XQXQXQ的博客-程序员资料

python 数据分析学习笔记(二)基于pandas的数据清洗和数据操作1.处理丢失数据丢失数据类型:nonenp.nan(NaN)type(None) ##对象类型不可以参与运算type(np.nan) #浮点型数据可以参与计算在pandas中如果遇到None形式的空值,则pandas会自动转化成Nan形式处理空值的方法isnull+anynotnull+alldata=DataFrame(data=np.random.randint(1,100,size=(7,5))

HttpClient访问https,设置忽略SSL证书验证_衣兜里的博客-程序员资料_httpclient 忽略ssl

报错:sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtargetimport java.security.cert.CertificateException;import java...

浅谈两轮平衡车的控制原理(续)_吾理小子的博客-程序员资料_两轮平衡车控制原理

前言:上次云里雾里的说了一通,不知道对平衡车的控制有没有说到点子上。单纯的讲解原理可能会很无聊,但是作为一个技术宅来说,就算头皮发麻也要接着看下去。哈哈,吾理小子争取用通俗的语言把自己懂的知识讲解出来。好了,闲话少说,进入正题。上文已经做好了平衡车站立起来的全部准备工作,接下来就是控制的核心了,如果对上面讲到的内容还没有看到,建议先看上一篇,否则会有莫名其妙的感觉。首先,说说陀螺仪的安装位...

springcloud——hystrix图形化dashboard服务监控_weixin_43925059的博客-程序员资料

监控模块与被监控服务必须添加的图形化依赖: <!--springboot框架web项目起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

摇一摇(根据传感器和加速器实现)_qq_45480938的博客-程序员资料

摇一摇(根据传感器和加速器实现)mainactivitypackage com.example.myyaoyiyaoimport android.content.Contextimport android.content.Intentimport android.hardware.Sensorimport android.hardware.SensorEventimport and...

随便推点

ViewModel-Flow-LiveData,我们还是好朋友_eclipse_xu的博客-程序员资料

点击上方蓝字关注我,知识会给你力量在Android应用程序中加载UI数据可能是一个挑战。各种屏幕的生命周期需要被考虑在内,还有配置的变化导致Activity的破坏和重新创建。当用户在一个应...

c#里获取checkboxlist所有选中项【原创】_宝莲灯Joey的博客-程序员资料_c#怎么获取checkboxlist

这两天终于有个在线survey的应用需求了,终于,可以有个正式的机会完整地好好地接触和考虑survey应用中所需要涉及到的方方面面的编程需要了。先说个多选框。public static string GetChecked(CheckBoxList checklist) { string result=""; for (int i = 0; i

How to Install and Configure VNC on Ubuntu 14.04_weixin_34268753的博客-程序员资料

为什么80%的码农都做不了架构师?>>> ...

windows事件查看器_牛板筋不筋的博客-程序员资料_windows事件查看器

打开方式:右键左下角的windows ,然后按v                        或者 Windows+R 后 输入eventvwr.msc 也行主要看:Windows 日志——系统,这里会有一些你程序出现问题的日志,其他地方并没有太大作用右键最近一个日志,并点击事物属性,如下图出错原因这个就是我Tor Browser 连接不上的原因 问题:w...

新高考计算机学业水平考试,解密新高考——学业水平考试_咔咔伊的博客-程序员资料

原标题:解密新高考——学业水平考试新高考本质上是普通高校考试招生录取制度的改革,目的是根据“两依据,一参考”的标准,形成综合评价、多元录取考试招生格局。其中,“两依据”就是依据高考成绩和学业水平考试成绩,“参考”就是将高中学生的综合素质评价档案作为录取的参考。其中学业水平考试提到了前所未有的新高度,也是高中学生需要引起重视的考试之一。 一、什么是学业水平考试学业水平考试是用来衡量学生各个科目学习情...

linux启动界面中的initrd,在Linux系统上开启Initrd文件系统的方法_weixin_39850143的博客-程序员资料

initial RAM diskLinux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd 就是最终的根文件系统。本文将探索 Linux 2.6 的初始 RAM磁盘,...

推荐文章

热门文章

相关标签