Python使用OpenCV实现全景拼接功能

 更新时间:2024年11月05日 09:05:27   作者:燕鹏01  
全景拼接是将多张图像拼接成一张全景图的技术,本文将详细介绍如何使用 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 方法执行全景拼接。

5.测试

确保你有三张图像文件(例如 1.jpg、2.jpg 和 3.jpg)放在 ./img 目录下。

运行脚本:

python3 panorama_stitching.py

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

完整代码

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 进行图像拼接,最终实现了将多张图像拼接成一张全景图的功能。

到此这篇关于Python使用OpenCV实现全景拼接功能的文章就介绍到这了,更多相关Python OpenCV全景拼接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python类的定义和使用详情

    Python类的定义和使用详情

    这篇文章主要介绍了Python类的定义和使用详情,在Python中,类表示具有相同属性和方法的对象的集合,文章围绕主题相关资料展开更多的相关介绍,需要的小伙伴可以参考一下
    2022-06-06
  • 10种检测Python程序运行时间、CPU和内存占用的方法

    10种检测Python程序运行时间、CPU和内存占用的方法

    这篇文章主要介绍了10种检测Python程序运行时间、CPU和内存占用的方法,包括利用Python装饰器或是外部的Unix Shell命令等,需要的朋友可以参考下
    2015-04-04
  • Python爬虫获取基金变动信息

    Python爬虫获取基金变动信息

    这篇文章主要介绍了Python爬虫获取基金变动信息,问基于上一篇文章得内容介绍围绕python的相关资料展开全文,需要的小伙伴可以参考一下
    2022-05-05
  • python查询sqlite数据表的方法

    python查询sqlite数据表的方法

    这篇文章主要介绍了python查询sqlite数据表的方法,涉及Python操作SQLite数据库的基本技巧,需要的朋友可以参考下
    2015-05-05
  • Numpy 将二维图像矩阵转换为一维向量的方法

    Numpy 将二维图像矩阵转换为一维向量的方法

    今天小编就为大家分享一篇Numpy 将二维图像矩阵转换为一维向量的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 详解python百行有效代码实现汉诺塔小游戏(简约版)

    详解python百行有效代码实现汉诺塔小游戏(简约版)

    这篇文章主要介绍了详解python百行有效代码实现汉诺塔小游戏(简约版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python Deque 模块使用详解

    Python Deque 模块使用详解

    Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除.
    2014-07-07
  • python实现画一颗树和一片森林

    python实现画一颗树和一片森林

    这篇文章主要为大家详细介绍了python实现画一颗树和一片森林,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • tensorflow mnist 数据加载实现并画图效果

    tensorflow mnist 数据加载实现并画图效果

    TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。这篇文章给大家介绍tensorflow mnist 数据加载实现并画图效果,感兴趣的朋友一起看看吧
    2020-02-02
  • pyqt5 子线程如何操作主线程GUI(示例代码)

    pyqt5 子线程如何操作主线程GUI(示例代码)

    这篇文章主要介绍了pyqt5 子线程如何操作主线程GUI,在使用pyqt5编写gui时遇到两个问题,会导致界面崩溃,今天就围绕这两个问题来简单说明和改进,需要的朋友可以参考下
    2024-05-05

最新评论