python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python OpenCV全景拼接

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

作者:燕鹏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('无法拼接为全景图')

4. 主程序入口

if __name__ == '__main__':
    ps = PanoramaStitching()
    ps.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全景拼接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文