Python Opencv实践 - 全景图片拼接stitcher

做一个全景图片切片的程序Spliter

        由于手里没有切割好的全景图片资源,因此首先写了一个切片的程序spliter。

        如果有现成的切割好的待拼接的切片文件,则不需要使用spliter。

        对于全景图片的拼接,需要注意一点,各个切片图片之间要有重复的内容以便opencv能够提取到关键点并能匹配上。如果简单地将全景图均分几乎是不可能成功的,stitcher一般会返回错误1(ERR_NEED_MORE_IMGS)。下面是我写的切片程序spliter代码,仅供参考:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltimg = cv.imread('../../SampleImages/panoramaOriginal.jpg')
numSlices = 5
print(img.shape)
(height,width,channels) = img.shapesliceWidth = width / numSlices
#全景拼接需要匹配两幅图中的特征点,因此需要预留一部分重复的列
#sliceDuplicateOffset设置了两幅图重复的列的数量
sliceDuplicateOffset = sliceWidth / 2
print(sliceWidth)
sliceStartX = 0
for i in range(0, numSlices):sliceX = sliceStartX;#第一个切片不需要减去sliceDuplicateOffsetif (sliceStartX != 0):sliceX = sliceX - sliceDuplicateOffsetimgSlice = img[0:height,int(sliceX):int(sliceStartX + sliceWidth)]sliceStartX += sliceWidthcv.imwrite('panoramaSlice' + str(i) + ".jpg", imgSlice, [cv.IMWRITE_JPEG_QUALITY,100])

        我下载的原始全景图片为:

        经过spliter切片后

读取切片文件使用Stitcher进行拼接

        将切片文件全部放到相同目录下,通过os库进行读取放到一个list中,然后使用Stitcher进行拼接,代码如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import osslices = []
imageDir = '../../SampleImages/panoramaSlices/'
imageFiles = os.listdir(imageDir)
#读取所有切片文件
for file in imageFiles: img = cv.imread(imageDir+file)slices.append(img)#plt.imshow(slices[0])#创建stitcher对象
#cv.Stitcher.Create()
#参考资料:https://blog.csdn.net/qq_41112170/article/details/124634544
stitcher = cv.Stitcher.create()
#调用stitch做全景拼接
#参考资料:https://blog.csdn.net/weixin_48911487/article/details/122721333
#         https://www.cnblogs.com/rainsoul/p/8430074.html
(status,result) = stitcher.stitch(slices)
if status == cv.STITCHER_OK:print("Panorama stitched successfully!")plt.imshow(result[:,:,::-1])
else:print("Panorama stitch failed! Status=" + str(status))

        运行效果:

        

        如果状态返回失败,请参考代码里的链接看看是什么问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NX二次开发UF_CSYS_map_point 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_map_point Defined in: uf_csys.h int UF_CSYS_map_point(int input_csys, double input_point [ 3 ] , int output_csys, double output_point [ 3 ] ) overview 概述 Ma…

Android11编译第七弹:串口文件读写

问题:需要对SIM卡进行管理,支持APP切换SIM卡。此功能需要访问串口文件,并且对串口文件进行读写。APP操作串口文件/dev/ttyUSB1时,串口文件打开失败。 2023-11-23 10:59:44.092 14264-14264 MULTI_CARD_SerialHandle com.wellnkio…

三分钟快速理解 ChatGPT 背后的大模型技术

在过去的十年中,人工智能领域取得了重大突破,其中自然语言处理(NLP)是其重要子领域之一。NLP使用的模型之一是大型语言模型(LLMs)。LLMs被设计用于处理大量文本数据,采用先进的神经网络架构&…

nodejs 文件目录监听 chokidar watchpack

文件监听实现,推荐使用chokidar: chokidar 默认是基于事件监听文件 const chokidar require("chokidar"); const folderToWatch path.join(__dirname, "lib"); const watcher chokidar.watch(folderToWatch, { ignored: /(^|[…

在Vue中使用Echarts

文章目录 Echarts1. 介绍2. 体验NPM 安装 Echarts定义 Echarts 容器引入 Echarts 3. 基础配置 Echarts 1. 介绍 常见的数据可视化库: D3.js 目前 Web 端评价最高的 Javascript 可视化工具库(入手难)ECharts.js 百度出品的一个开源 Javascript 数据可视化库Highch…

鼠标拖拽问题,不选中文本不触发单击事件

文章目录 1. 为什么鼠标单击的时候触发了mousemove事件?明明鼠标没有移动2. 鼠标拖拽元素怎么能不触发单击事件?怎么处理鼠标在元素内的相对定位,而不是每次定位到左上角?方式一:拖拽的元素没有注册click监听就不会触发…

10年测试老鸟,自动化测试经验10条建议,一路狂飙...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、哪一刻&#x…

Java面试题(每天10题)-------连载(37)

目录 Mysql篇 1、Mysql如何优化DISTINCT? 2、如何输入字符为十六进制数字? 3、如何显示前50行? 4、可以使用多少列创建索引? 5、NOW()和CURRENT_DATE()有什么区别? 6、什么样的对象可以使用CREATE语句创建&…

Postman如何使用(二):Postman Collection的创建/使用/导出分享等

一、什么是Postman Collection? Postman Collection是可让您将各个请求分组在一起。 您可以将这些请求组织到文件夹中。中文经常将collection翻译成收藏夹。如果再下文中看到这样的翻译不要觉得意外。Postman Collection会使你的工作效率更上一层楼。Postman Colle…

【洛谷 B2080】计算多项式的值 题解(顺序结构+四则运算)

计算多项式的值 题目描述 假定多项式的形式为 x n x ( n − 1 ) x^nx^{(n-1)} xnx(n−1) … x 2 x 1 x^2x1 x2x1,请计算给定单精度浮点数 x x x 和正整数 n n n 值的情况下这个多项式的值。多项式的值精确到小数点后两位,保证最终结果在 doub…

NFS 速度变慢问题排查 性能优化

NFS 使用 RPC 来进行客户端和服务器之间的通信。而在 RPC 的底层,NFS 使用 TCP 来进行数据的可靠传输,以便客户端和服务器之间能够有效地传输文件和进行远程调用(默认为TCP,也可调整为udp) 1.首先服务器端启动RPC服务portmap&…

教师工作就业前景

在这个知识爆炸的时代,当老师无疑是社会发展的重要基石。随着科技的进步和社会的发展,教育行业的需求也在不断增长。那么,教师工作的就业前景如何呢? 我们来看看教师工作的市场需求。随着国家对教育的重视和投入的增加&#xff0c…

C/C++ 实现Socket交互式服务端

在 Windows 操作系统中,原生提供了强大的网络编程支持,允许开发者使用 Socket API 进行网络通信,通过 Socket API,开发者可以创建、连接、发送和接收数据,实现网络通信。本文将深入探讨如何通过调用原生网络 API 实现同…

「Java开发中文指南」IntelliJ IDEA插件安装(一)

IntelliJ IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 插件扩展了Intel…

【分布式】分布式中的时钟

一、物理时钟 vs 逻辑时钟 时钟的存在主要是为了标识事件的发生顺序。 分布式系统不使用物理时钟记录事件,分布式系统中每个节点记录的时间并不一样,即使设置了 NTP 时间同步节点间也存在毫秒级别的偏差 所以需要有另外的方法记录事件顺序关系&#x…

vue2中使用echarts

1,安装echarts npm install --save echarts 2&#xff0c;具体页面 <template><div class"app-container"><div class"aa" id"main" style"width: 500px; height: 400px;"></div></div> </te…

PDF 批量处理软件BatchOutput PDF mac中文版介绍

BatchOutput PDF mac是一款适用于 Mac 的 PDF 批量处理软件。它可以帮助用户将多个 PDF 文件进行异步处理&#xff0c;提高工作效率。 BatchOutput PDF 可以自动化执行许多任务&#xff0c;包括 PDF 文件的打印、转换、分割、压缩、加密、重命名等&#xff0c;而且它还可以将自…

Elasticsearch知识

目录 Elasticsearch逻辑设计和物理设计 逻辑设计物理设计Elasticsearch原理 倒排索引文档的分析过程保存文档搜索文档写数据的底层原理 数据刷新&#xff08;fresh&#xff09;事务日志的写入ES在大数据量下的性能优化 文件系统缓存优化数据预热文档&#xff08;Document&…

【数据分享】2023年我国省市县三级的瞪羚企业数量(免费获取/Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

《opencv实用探索·二》根据RGB的像素排列来理解图像深度、像素深度和位深度

通常对于RGB图像主要分为RGB16&#xff0c;RGB24和RGB32。RGB16从高位到低位的排列为R->G->B&#xff0c;RGB24和RGB32从高位到低位的排列为B->G->R。 RGB16: 16 位为一个存储单元&#xff08;一个像素&#xff09;&#xff0c;来存储一个RGB像素;因为人眼对绿色比…