360全景图像拼接

2024-06-18 22:58
文章标签 图像 360 拼接 全景

本文主要是介绍360全景图像拼接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

刚到实验室,做了一个全景图像拼接的training project,自己前前后后搞了1个多月(汗啊,只能自我安慰是接触到的第一个图形学的东西),尝试了几种方法,写了很多无用代码,下面把我一路曲曲折折的过程抛出来,希望能对大家有些许帮助吧。

    一. 做拼接的第一步一定是warp,就是把每张图像投影到柱面或者球面,我将每张图片做了柱面投影,而这么做的理由呢,就是将图像投影到统一的面上以方便拼接,根据我做的过程中的理解就是使拼接的图像很平滑,当然如果只是拼接两张图片的话,完全可以省略这一步。

    二. 图像拼接的第二步就是提取特征点(也可以采用边特征的提取),特征点的提取方法有很多,我使用了lowe的SIFT,SIFT是一个非常鲁棒的算法,但是速度很慢,如果想程序运行速度很快,可以使用其他特征点提取方法,lowe提供了SIFT的源码,可以直接使用。

    三. 提取出两张图片的特征点以后,就要找到特征点间的对应关系,这一步是一个简单的距离比值删选的过程,我自己实现了一个暴力筛选的方法,还是比较简单的,但是这样肯定会很影响速度,所以要使用一个k-d tree的approximate nearest neighbour算法,可以用ann库实现,当然也可以直接用rob hess的特征点匹配算法实现。

    四. 上一步找到对应特征点以后,接下就是用RANSAC对已有匹配进行筛选并求出对应的homography,实际上就是一个简单的迭代过程。

    五. 求出homography以后就可以进行alignment了,这一步可以用opencv提供的WarpPerspective函数实现,但是用这个函数一张图像经过几次align之后,拼接后图像越靠右边越有发散效果,所以用这个函数只有两张图片好用(如果有人知道多张图片怎么用这个函数进行拼接,请您不吝赐教),这一步还有一个很重要的边界问题,及拼接图像转换后的坐标可能出现负值,这一点一定要考虑进去,否则会出现拼接后的图像包含不全的情况。

    六. alignment之后就是blend的问题,以使拼接边界不那么明显,我采用了一个简单的线性的距离权值算法,效果还可以看,即pixel=pixel_a*alpha+pixel_b*(1-alpha),alpha为当前像素点距拼接左边界的距离除以整个重叠区域的宽度。下面两张图分别是4张,3张图像用WarpPerspective函数拼接的。



    七. 如果你只需要拼接两张图片,那到上一步就可以了,以下是360度拼接的额外过程,即图片有n张的情况,我只考虑了所有图片都属于一个全景图没有噪音图片的乱序图片的情况。要先将图片排好序,以下为排序过程:①在所有图像对间找到inliers个数最多两张图像②在两张图片的基础上向前向后依次找出与当前图像邻接的图像直到结束。

    八. 经过上一步就可以进行alignment了,因为之前用提过的WarpPerspective函数使用中的问题,这一步只使用了homography中的水平和垂直平移分量tx,ty,依旧采用线性权值的方法进行blend,多长图像拼接还有一个很重要的问题就是拼接后首尾不能相接的情况,这就需要惊醒调整,比较好的方法是bundle adjustment,我也分别用opencv和sba实现了,但是估计还是实现的方法不对,调了好长时间没有出效果,无奈只能先放弃了,以后比较闲的时候再实现吧(如果有人在这一步用bundle adjustment实现,请赐教)。转去实现了一个比较简单的线性调整的方法,最后结果看起来还可以,有些模糊的地方,我估计可能是blend方法的问题,但是没有继续实现multi-blend,所以结果只能是现在这样了。

    总之呢,整个拼接程序还比较粗糙,有很多地方有待完善,欢迎大家有问题可以和我交流。下面为两个17张图片的全景图


这篇关于360全景图像拼接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073293

相关文章

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3