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 plt

img = cv.imread('../../SampleImages/panoramaOriginal.jpg')
numSlices = 5
print(img.shape)
(height,width,channels) = img.shape

sliceWidth = width / numSlices
#全景拼接需要匹配两幅图中的特征点,因此需要预留一部分重复的列
#sliceDuplicateOffset设置了两幅图重复的列的数量
sliceDuplicateOffset = sliceWidth / 2
print(sliceWidth)
sliceStartX = 0
for i in range(0, numSlices):
    sliceX = sliceStartX;
    #第一个切片不需要减去sliceDuplicateOffset
    if (sliceStartX != 0):
        sliceX = sliceX - sliceDuplicateOffset
    imgSlice = img[0:height,int(sliceX):int(sliceStartX + sliceWidth)]
    sliceStartX += sliceWidth
    cv.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 os

slices = []
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.mfbz.cn/a/184041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是机器学习

前言 机器学习(Machine Learning, ML)是一个总称,用于解决由各位程序员自己基于 if-else 等规则开发算法而导致成本过高的问题,想要通过帮助机器 「发现」 它们 「自己」 解决问题的算法来解决 ,而不需要程序员将所有…

影响语音芯片识别率的因素概述

语音芯片识别率是指芯片对人类语音信号的识别能力。在实际应用中,语音芯片识别率的高低直接影响了用户对芯片的体验和满意度。因此,提高语音芯片识别率是当前语音技术领域的重要任务之一。 1.、语音芯片的硬件设计:设计良好的芯片可以更好地…

竹云参编《公共数据授权运营平台技术要求》团体标准正式发布

2023年11月23日,第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开,国家数据局党组书记、局长刘烈宏,浙江省委常委、常务副省长徐文光出席会议并致辞。会上,国家工业信息安全发展研究中心发布并解读了我国首部…

大厂前沿技术导航

百度Geek说 - 知乎 腾讯技术 - 知乎 美团技术团队

Java 项目中常用注解汇总!! (自整理)

Spring框架的注解 PostMapping("/getDetails") post请求 映射到接口 RequestBody 用来接收HTTP请求体中参数 GetMapping("/getDetails") get请求 映射到接口 RequestParam 用来接收URL中的查询参数 PutMappi…

Tomcat 配置

1: 打开 2:选择版本号,我这边是 1.7 3:添加 web 4: 添加jar包 5:添加 6:添加 Tomcat

逆矩阵相关性质与例题

1.方阵的行列式:就是将方阵中的每一个元素转换至行列式中。 1.性质一:转置方阵的行列式等于转置前的行列式。(对标性质:行列式与它的转置行列式相等) 2.性质二:|ka||a|*k的n次方,n为方阵阶数。 …

平台工程时代的 Kubernetes 揭秘:2023年生产状况报告深度剖析

Kubernetes 在生产环境中的复杂性已经成为常态,在2023年这个平台工程盛行的时代,容器管理的最大亮点可能在于其灵活性,然而在运维政策和治理等方面仍然存在诸多挑战。八年过去了,在生产环境中使用 Kubernetes 仍然需要面临许多挑战…

目前比较好用的护眼台灯,小学生适合的护眼台灯推荐

随着技术的发展,灯光早已成为每家每户都需要的东西。但是灯光不好可能会对眼睛造成伤害是很多人没有注意到的。现在随着护眼灯产品越来越多,市场上台灯的选择越来越多样化,如何选择一个对眼睛无伤害、无辐射的台灯成为许多家长首先要考虑的问…

mysql:修改密码的几种方式

背景 当我们 brew install mysql 新安装 mysql 的时候,是没有密码的,我们可以直接通过 mysql -u root 连接上。但是密码还是要设置的,一是为了安全,二是有些数据库软件如 Sequel 连接都是必须要密码的,接下来我们来看…

自监督LIGHTLY SSL教程

Lightly SSL 是一个用于自监督学习的计算机视觉框架。 github链接:GitHub - lightly-ai/lightly: A python library for self-supervised learning on images. Documentation:Documentation — lightly 1.4.20 documentation 以下内容主要来自Documen…

ElasticSearch 7 SQL 详解

平时使用Elasticsearch的时候,会在Kibana中使用Query DSL来查询数据.每次要用到Query DSL时都基本忘光了,需要重新在回顾一遍,最近发现Elasticsearch已经支持SQL查询了(6.3版本以后),整理了下一些用法. 简介 Elasticsearch SQL是一个X-Pack组件,它允许针对Elasticsearch实时执…

Zabbix-Liunx服务器内存使用率测试

要在Python 2.7中运行内存消耗脚本并安装psutil,您需要先安装pip。以下是完整的步骤,包括如何在Python 2.7环境中安装pip,然后安装psutil,以及最后如何运行内存消耗脚本。 步骤1: 安装pip 在Python 2.7中安装pip: 首先…

2016年8月15日 Go生态洞察:Go 1.7版本发布

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

JVM内存模型及调优

本文将为大家详细介绍JVM内存模型及如何对JVM内存进行调优。我们将分为以下几个部分进行讲解: JVM内存模型概述JVM内存区域及作用JVM内存调优方法实战案例与优化技巧 一、JVM内存模型概述 在深入了解JVM内存模型之前,我们需要先了解一下Java内存模型&am…

通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践

最近研究GPT,深入的从transfomer的原理和代码看来一下,现在把学习的资料和自己的理解整理一下。 这个文章写的很通俗易懂,把transformer的来龙去脉,还举例了很多不错的例子。 Transformer通俗笔记:从Word2Vec、Seq2S…

2016年8月18日 Go生态洞察:Go 1.7版本二进制文件缩小

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

MFC所有控件介绍及基本使用

一、前言 本篇文档介绍了MFC控件的基本使用,同时提供了关于MFC控件使用的工程代码,程序界面如下图,有兴趣的可以到文档最后的链接处进行下载。 二、控件介绍 2.1 Button (按钮) 2.2 CheckBox(复选框&am…

【新手解答】深入探索 C 语言:一些常见概念的解析

C语言的相关问题解答 写在最前面目录 问题1变量名与变量的关系与区别变量和数据类型形参(形式参数)的概念 问题2解析延伸解析对于多文件程序的理解总结 问题3类和对象变量和数据类型变量是否为抽象的数据类型?总结 问题4解析源文件&#xff0…

和奇葩领导的相处之道

目录 1 和奇葩部门领导做项目的经历2 奇葩领导对团队产生的影响2.1 不和谐的团队氛围2.2 合作过程中的摩擦和阻碍2.3 下属的挫折批评和不公平对待 3 与奇葩领导相处的经验教训结语 在职场中,与不同的领导和同事打交道是家常便饭。,接触的人多了&#xff…
最新文章