当前位置: 首页 > news >正文

Python 使用 OpenCV 进行全景拼接

概述

全景拼接是将多张图像拼接成一张全景图的技术。本文将详细介绍如何使用 Python 和 OpenCV 库进行全景拼接,并通过具体的代码示例来展示整个过程。

环境准备

在开始编写代码之前,确保已经安装了 OpenCV 库。可以使用以下命令安装:

pip install opencv-python
效果演示
原图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

拼接效果

在这里插入图片描述

代码详解
1. 导入必要的模块
import cv2
  • import cv2:导入 OpenCV 库,用于图像处理和拼接。
2. 定义全景拼接类
class PanoramaStitching:"""全景拼接"""def __init__(self):# 读取图像images = [cv2.imread(r'./img/1.jpg'), cv2.imread('./img/2.jpg'), cv2.imread('./img/3.jpg')]'''这段代码使用了列表推导式,目的是对读取的图像进行缩放处理。我们可以逐步分解并详细解释这一行代码:self.images = [...]:这部分表示将处理后的图像存储在对象的 self.images 属性中。self 指代对象的实例,这意味着这些图像是特定于该对象的属性。[cv2.resize(...) for img in images]:这是列表推导式,它是在对 images 列表中的每个图像(img)进行操作。for img in images 的含义是遍历 images 列表中的每个图像。cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5):这是 OpenCV 库中的一个函数,用于调整图像的大小。src=img:指定要调整大小的源图像,即当前遍历到的图像 img。dsize=None:表示不指定目标图像的大小。此参数为 None 意味着目标大小将由缩放因子 fx 和 fy 决定。fx=0.5 和 fy=0.5:表示在水平方向和垂直方向上都将图像缩小到原始大小的 50%。具体来说,fx 和 fy 分别是横向和纵向的缩放因子。结合以上分析,这行代码的主要作用是将读取的图像列表中的每个图像都缩小到原来的一半,并将它们存储在对象的 self.images 属性中。'''self.images = [cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5) for img in images]
  • class PanoramaStitching::定义一个名为 PanoramaStitching 的类。
  • def __init__(self)::定义类的初始化方法。
  • images = [cv2.imread(r'./img/1.jpg'), cv2.imread('./img/2.jpg'), cv2.imread('./img/3.jpg')]:读取三张图像文件。
  • self.images = [cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5) for img in images]:使用列表推导式对每张图像进行缩放处理,并存储在 self.images 属性中。
3. 定义拼接方法
    def run(self):# 创建拼接器实例stitcher = cv2.Stitcher().create()'''创建拼接器实例:stitcher = cv2.Stitcher().create()cv2.Stitcher():这是 OpenCV 库中的一个类,用于进行图像拼接。拼接器的主要作用是将一系列的输入图像拼接成一个全景图。.create():该方法用于创建一个拼接器对象,准备执行拼接操作。此时,stitcher 变量就引用了一个已初始化的拼接器实例。'''# 执行拼接操作status, pano = stitcher.stitch(self.images)'''执行拼接操作:status, pano = stitcher.stitch(self.images)stitcher.stitch(self.images):调用拼接器的 stitch 方法,对之前已准备好的图像列表 self.images 进行拼接。此方法会返回两个值:status:拼接操作的状态,其值可以是多个预定义的常量。具体来说,cv2.STITCHER_OK 表示拼接成功,其他值则表示拼接过程中出错。pano:拼接生成的全景图像,当拼接成功时,该变量将保存拼接后的结果图像。'''# 检查拼接状态if status == cv2.STITCHER_OK:cv2.imshow('pano', pano)cv2.waitKey(0)else:print('无法拼接为全景图')
  • def run(self)::定义一个名为 run 的方法,用于执行全景拼接。
  • stitcher = cv2.Stitcher().create():创建一个拼接器实例。
  • status, pano = stitcher.stitch(self.images):调用拼接器的 stitch 方法进行图像拼接,返回拼接状态和拼接后的全景图像。
  • if status == cv2.STITCHER_OK::检查拼接状态,如果拼接成功则显示全景图。
  • cv2.imshow('pano', pano):显示拼接后的全景图像。
  • cv2.waitKey(0):等待用户按键,防止窗口立即关闭。
  • else::如果拼接失败,打印错误信息。
4. 主程序入口
if __name__ == '__main__':ps = PanoramaStitching()ps.run()
  • if __name__ == '__main__'::检查是否直接运行此脚本。
  • ps = PanoramaStitching():创建 PanoramaStitching 类的实例。
  • ps.run():调用 run 方法执行全景拼接。
测试
  1. 确保你有三张图像文件(例如 1.jpg2.jpg3.jpg)放在 ./img 目录下。

  2. 运行脚本:

    python3 panorama_stitching.py
    
  3. 如果拼接成功,会弹出一个窗口显示拼接后的全景图。如果失败,会打印错误信息。

完整代码
import cv2class PanoramaStitching:"""全景拼接"""def __init__(self):images = [cv2.imread(r'./img/1.jpg'), cv2.imread('./img/2.jpg'), cv2.imread('./img/3.jpg')]'''这段代码使用了列表推导式,目的是对读取的图像进行缩放处理。我们可以逐步分解并详细解释这一行代码:self.images = [...]:这部分表示将处理后的图像存储在对象的self.images属性中。self指代对象的实例,这意味着这些图像是特定于该对象的属性。[cv2.resize(...) for img in images]:这是列表推导式,它是在对images列表中的每个图像(img)进行操作。for img in images的含义是遍历images列表中的每个图像。cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5):这是OpenCV库中的一个函数,用于调整图像的大小。src=img:指定要调整大小的源图像,即当前遍历到的图像img。dsize=None:表示不指定目标图像的大小。此参数为None意味着目标大小将由缩放因子fx和fy决定。fx=0.5和fy=0.5:表示在水平方向和垂直方向上都将图像缩小到原始大小的50%。具体来说,fx和fy分别是横向和纵向的缩放因子。结合以上分析,这行代码的主要作用是将读取的图像列表中的每个图像都缩小到原来的一半,并将它们存储在对象的self.images属性中。'''self.images = [cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5) for img in images]def run(self):stitcher = cv2.Stitcher().create()status, pano = stitcher.stitch(self.images)'''创建拼接器实例:stitcher = cv2.Stitcher().create()CopyInsertcv2.Stitcher():这是OpenCV库中的一个类,用于进行图像拼接。拼接器的主要作用是将一系列的输入图像拼接成一个全景图。.create():该方法用于创建一个拼接器对象,准备执行拼接操作。此时,stitcher变量就引用了一个已初始化的拼接器实例。执行拼接操作:status, pano = stitcher.stitch(self.images)CopyInsertstitcher.stitch(self.images):调用拼接器的stitch方法,对之前已准备好的图像列表self.images进行拼接。此方法会返回两个值:status:拼接操作的状态,其值可以是多个预定义的常量。具体来说,cv2.STITCHER_OK表示拼接成功,其他值则表示拼接过程中出错。pano:拼接生成的全景图像,当拼接成功时,该变量将保存拼接后的结果图像。'''if status == cv2.STITCHER_OK:cv2.imshow('pano', pano)cv2.waitKey(0)else:print('无法拼接为全景图')if __name__ == '__main__':ps = PanoramaStitching()ps.run()
总结

本文详细介绍了如何使用 Python 和 OpenCV 库进行全景拼接,并通过具体的代码示例展示了整个过程。通过使用 cv2.imread 读取图像,cv2.resize 缩放图像,cv2.Stitcher 进行图像拼接,最终实现了将多张图像拼接成一张全景图的功能。



http://www.mrgr.cn/news/65907.html

相关文章:

  • VSCode 1.82之后的vscode server离线安装
  • MySQL 处理重复数据
  • SystemC简明教程
  • 黑客使用哪些编程语言?
  • git 删除远程不存在本地命令却能看到的分支
  • 大模型面试题:Prefix LM和Causal LM的区别是啥?
  • 获取SKU详细信息API:揭秘商品背后的故事
  • 基于Springboot+安卓的健康饮食APP (含源码数据库)
  • 健康休息,注重休息
  • TreeMap 源码分析
  • 各种网络协议
  • 移门阻尼器 - 控制门的速度并减少冲击。
  • 安装MySQL:从新手到专家的第一步
  • 上升的温度
  • 微信小程序 高校教材征订系统
  • 动态规划(线性DP):DFS->记忆化->DP(Leetcode 746)
  • 【ARM Linux 系统稳定性分析入门及渐进 1.2 -- Crash 工具依赖内容】
  • SpringBoot项目集成ONLYOFFICE
  • 【Python图像处理】入门到精通
  • 笔尖与灵魂的对话:写作,习惯之花绽放
  • Python异常检测 - LSTM(长短期记忆网络)
  • 南宁周边乡村游微信小程序ssm+论文源码调试讲解
  • Qt Event事件系统小探1
  • 跨平台开发时如何避免系统依赖导致的错误(跨平台项目中如何优雅地处理系统特定模块,例如:pywin32)
  • Echarts环形图引线设置
  • 【ARM Linux 系统稳定性分析入门及渐进 1.3 -- Crash工具编译过程】