欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用OpenCV實(shí)現(xiàn)全景拼接功能

 更新時(shí)間:2024年11月05日 09:05:27   作者:燕鵬01  
全景拼接是將多張圖像拼接成一張全景圖的技術(shù),本文將詳細(xì)介紹如何使用 Python 和 OpenCV 庫(kù)進(jìn)行全景拼接,感興趣的小伙伴可以了解一下

概述

全景拼接是將多張圖像拼接成一張全景圖的技術(shù)。本文將詳細(xì)介紹如何使用 Python 和 OpenCV 庫(kù)進(jìn)行全景拼接,并通過(guò)具體的代碼示例來(lái)展示整個(gè)過(guò)程。

環(huán)境準(zhǔn)備

在開(kāi)始編寫(xiě)代碼之前,確保已經(jīng)安裝了 OpenCV 庫(kù)??梢允褂靡韵旅畎惭b:

pip install opencv-python

效果演示

原圖

拼接效果

代碼詳解

1. 導(dǎo)入必要的模塊

import cv2

import cv2:導(dǎo)入 OpenCV 庫(kù),用于圖像處理和拼接。

2. 定義全景拼接類

class PanoramaStitching:
    """
    全景拼接
    """
    def __init__(self):
        # 讀取圖像
        images = [cv2.imread(r'./img/1.jpg'), cv2.imread('./img/2.jpg'), cv2.imread('./img/3.jpg')]
        '''
        這段代碼使用了列表推導(dǎo)式,目的是對(duì)讀取的圖像進(jìn)行縮放處理。我們可以逐步分解并詳細(xì)解釋這一行代碼:
        self.images = [...]:這部分表示將處理后的圖像存儲(chǔ)在對(duì)象的 self.images 屬性中。self 指代對(duì)象的實(shí)例,這意味著這些圖像是特定于該對(duì)象的屬性。
        [cv2.resize(...) for img in images]:這是列表推導(dǎo)式,它是在對(duì) images 列表中的每個(gè)圖像(img)進(jìn)行操作。for img in images 的含義是遍歷 images 列表中的每個(gè)圖像。
        cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5):這是 OpenCV 庫(kù)中的一個(gè)函數(shù),用于調(diào)整圖像的大小。
        src=img:指定要調(diào)整大小的源圖像,即當(dāng)前遍歷到的圖像 img。
        dsize=None:表示不指定目標(biāo)圖像的大小。此參數(shù)為 None 意味著目標(biāo)大小將由縮放因子 fx 和 fy 決定。
        fx=0.5 和 fy=0.5:表示在水平方向和垂直方向上都將圖像縮小到原始大小的 50%。具體來(lái)說(shuō),fx 和 fy 分別是橫向和縱向的縮放因子。
        結(jié)合以上分析,這行代碼的主要作用是將讀取的圖像列表中的每個(gè)圖像都縮小到原來(lái)的一半,并將它們存儲(chǔ)在對(duì)象的 self.images 屬性中。
        '''
        self.images = [cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5) for img in images]

class PanoramaStitching::定義一個(gè)名為 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]:使用列表推導(dǎo)式對(duì)每張圖像進(jìn)行縮放處理,并存儲(chǔ)在 self.images 屬性中。

3. 定義拼接方法

    def run(self):
        # 創(chuàng)建拼接器實(shí)例
        stitcher = cv2.Stitcher().create()
        '''
        創(chuàng)建拼接器實(shí)例:
        stitcher = cv2.Stitcher().create()
        cv2.Stitcher():這是 OpenCV 庫(kù)中的一個(gè)類,用于進(jìn)行圖像拼接。拼接器的主要作用是將一系列的輸入圖像拼接成一個(gè)全景圖。
        .create():該方法用于創(chuàng)建一個(gè)拼接器對(duì)象,準(zhǔn)備執(zhí)行拼接操作。此時(shí),stitcher 變量就引用了一個(gè)已初始化的拼接器實(shí)例。
        '''
        # 執(zhí)行拼接操作
        status, pano = stitcher.stitch(self.images)
        '''
        執(zhí)行拼接操作:
        status, pano = stitcher.stitch(self.images)
        stitcher.stitch(self.images):調(diào)用拼接器的 stitch 方法,對(duì)之前已準(zhǔn)備好的圖像列表 self.images 進(jìn)行拼接。此方法會(huì)返回兩個(gè)值:
        status:拼接操作的狀態(tài),其值可以是多個(gè)預(yù)定義的常量。具體來(lái)說(shuō),cv2.STITCHER_OK 表示拼接成功,其他值則表示拼接過(guò)程中出錯(cuò)。
        pano:拼接生成的全景圖像,當(dāng)拼接成功時(shí),該變量將保存拼接后的結(jié)果圖像。
        '''
        # 檢查拼接狀態(tài)
        if status == cv2.STITCHER_OK:
            cv2.imshow('pano', pano)
            cv2.waitKey(0)
        else:
            print('無(wú)法拼接為全景圖')
  • def run(self)::定義一個(gè)名為 run 的方法,用于執(zhí)行全景拼接。
  • stitcher = cv2.Stitcher().create():創(chuàng)建一個(gè)拼接器實(shí)例。
  • status, pano = stitcher.stitch(self.images):調(diào)用拼接器的 stitch 方法進(jìn)行圖像拼接,返回拼接狀態(tài)和拼接后的全景圖像。
  • if status == cv2.STITCHER_OK::檢查拼接狀態(tài),如果拼接成功則顯示全景圖。
  • cv2.imshow('pano', pano):顯示拼接后的全景圖像。
  • cv2.waitKey(0):等待用戶按鍵,防止窗口立即關(guān)閉。
  • else::如果拼接失敗,打印錯(cuò)誤信息。

4. 主程序入口

if __name__ == '__main__':
    ps = PanoramaStitching()
    ps.run()
  • if __name__ == '__main__'::檢查是否直接運(yùn)行此腳本。
  • ps = PanoramaStitching():創(chuàng)建 PanoramaStitching 類的實(shí)例。
  • ps.run():調(diào)用 run 方法執(zhí)行全景拼接。

5.測(cè)試

確保你有三張圖像文件(例如 1.jpg、2.jpg 和 3.jpg)放在 ./img 目錄下。

運(yùn)行腳本:

python3 panorama_stitching.py

如果拼接成功,會(huì)彈出一個(gè)窗口顯示拼接后的全景圖。如果失敗,會(huì)打印錯(cuò)誤信息。

完整代碼

import cv2


class PanoramaStitching:
    """
    全景拼接
    """
    def __init__(self):
        images = [cv2.imread(r'./img/1.jpg'), cv2.imread('./img/2.jpg'), cv2.imread('./img/3.jpg')]
        '''
        這段代碼使用了列表推導(dǎo)式,目的是對(duì)讀取的圖像進(jìn)行縮放處理。我們可以逐步分解并詳細(xì)解釋這一行代碼:
        self.images = [...]:這部分表示將處理后的圖像存儲(chǔ)在對(duì)象的self.images屬性中。self指代對(duì)象的實(shí)例,這意味著這些圖像是特定于該對(duì)象的屬性。
        [cv2.resize(...) for img in images]:這是列表推導(dǎo)式,它是在對(duì)images列表中的每個(gè)圖像(img)進(jìn)行操作。for img in images的含義是遍歷images列表中的每個(gè)圖像。
        cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5):這是OpenCV庫(kù)中的一個(gè)函數(shù),用于調(diào)整圖像的大小。
        src=img:指定要調(diào)整大小的源圖像,即當(dāng)前遍歷到的圖像img。
        dsize=None:表示不指定目標(biāo)圖像的大小。此參數(shù)為None意味著目標(biāo)大小將由縮放因子fx和fy決定。
        fx=0.5和fy=0.5:表示在水平方向和垂直方向上都將圖像縮小到原始大小的50%。具體來(lái)說(shuō),fx和fy分別是橫向和縱向的縮放因子。
        結(jié)合以上分析,這行代碼的主要作用是將讀取的圖像列表中的每個(gè)圖像都縮小到原來(lái)的一半,并將它們存儲(chǔ)在對(duì)象的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)
        '''
        創(chuàng)建拼接器實(shí)例:
        stitcher = cv2.Stitcher().create()
        CopyInsert
        cv2.Stitcher():這是OpenCV庫(kù)中的一個(gè)類,用于進(jìn)行圖像拼接。拼接器的主要作用是將一系列的輸入圖像拼接成一個(gè)全景圖。
        .create():該方法用于創(chuàng)建一個(gè)拼接器對(duì)象,準(zhǔn)備執(zhí)行拼接操作。此時(shí),stitcher變量就引用了一個(gè)已初始化的拼接器實(shí)例。
        執(zhí)行拼接操作:
        
        status, pano = stitcher.stitch(self.images)
        CopyInsert
        stitcher.stitch(self.images):調(diào)用拼接器的stitch方法,對(duì)之前已準(zhǔn)備好的圖像列表self.images進(jìn)行拼接。此方法會(huì)返回兩個(gè)值:
        status:拼接操作的狀態(tài),其值可以是多個(gè)預(yù)定義的常量。具體來(lái)說(shuō),cv2.STITCHER_OK表示拼接成功,其他值則表示拼接過(guò)程中出錯(cuò)。
        pano:拼接生成的全景圖像,當(dāng)拼接成功時(shí),該變量將保存拼接后的結(jié)果圖像。
        '''
        if status == cv2.STITCHER_OK:
            cv2.imshow('pano', pano)
            cv2.waitKey(0)
        else:
            print('無(wú)法拼接為全景圖')


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

總結(jié)

本文詳細(xì)介紹了如何使用 Python 和 OpenCV 庫(kù)進(jìn)行全景拼接,并通過(guò)具體的代碼示例展示了整個(gè)過(guò)程。通過(guò)使用 cv2.imread 讀取圖像,cv2.resize 縮放圖像,cv2.Stitcher 進(jìn)行圖像拼接,最終實(shí)現(xiàn)了將多張圖像拼接成一張全景圖的功能。

到此這篇關(guān)于Python使用OpenCV實(shí)現(xiàn)全景拼接功能的文章就介紹到這了,更多相關(guān)Python OpenCV全景拼接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論