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

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 cv2


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]

    def run(self):

        stitcher = cv2.Stitcher().create()
        status, pano = stitcher.stitch(self.images)
        '''
        创建拼接器实例:
        stitcher = cv2.Stitcher().create()
        CopyInsert
        cv2.Stitcher():这是OpenCV库中的一个类,用于进行图像拼接。拼接器的主要作用是将一系列的输入图像拼接成一个全景图。
        .create():该方法用于创建一个拼接器对象,准备执行拼接操作。此时,stitcher变量就引用了一个已初始化的拼接器实例。
        执行拼接操作:
        
        status, pano = stitcher.stitch(self.images)
        CopyInsert
        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('无法拼接为全景图')


if __name__ == '__main__':
    ps = PanoramaStitching()
    ps.run()


总结

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



http://www.kler.cn/a/379935.html

相关文章:

  • Docker打包自己项目推到Docker hub仓库(windows10)
  • js.轮转数组和旋转链表
  • 基于Openwrt系统架构,实现应用与驱动的实例。
  • Python并发编程库:Asyncio的异步编程实战
  • Golang | Leetcode Golang题解之第524题通过删除字母匹配到字典里最长单词
  • java、excel表格合并、指定单元格查找、合并文件夹
  • C#:强大而优雅的编程语言
  • 【C++ 曼哈顿距离 数学】1131. 绝对值表达式的最大值|2059
  • [论文阅读]LOGAN: Membership Inference Attacks Against Generative Models
  • uniapp实现书架
  • Session条件竞争--理论
  • 再谈 TCP 连接的源端口选择
  • 吃透StarRock分区、分桶
  • 【软考】Redis不同的数据类型和应用场景。
  • 【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
  • axios请求中的data和params的区别
  • 科普之使用Lableme图像标注—盲道分割与目标检测
  • 参数失配(Mismatch)
  • 文件系统上云的挑战
  • 计算机启动过程中各个步骤
  • w018基于Springboot的母婴商城系统
  • NLP领域的经典算法和模型
  • 从0开始搭建一个生产级SpringBoot2.0.X项目(八)SpringBoot 使用Redis
  • Java面向对象 C语言字符串常量
  • CSS 超出一行省略号...,适用于纯数字、中英文
  • 百货零售行业信息化蓝图整体规划方案|165页PPT