Python使用OpenCV實現(xiàn)全景拼接功能
概述
全景拼接是將多張圖像拼接成一張全景圖的技術(shù)。本文將詳細介紹如何使用 Python 和 OpenCV 庫進行全景拼接,并通過具體的代碼示例來展示整個過程。
環(huán)境準備
在開始編寫代碼之前,確保已經(jīng)安裝了 OpenCV 庫??梢允褂靡韵旅畎惭b:
pip install opencv-python
效果演示
原圖
拼接效果
代碼詳解
1. 導(dǎo)入必要的模塊
import cv2
import cv2:導(dǎo)入 OpenCV 庫,用于圖像處理和拼接。
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)式,目的是對讀取的圖像進行縮放處理。我們可以逐步分解并詳細解釋這一行代碼: self.images = [...]:這部分表示將處理后的圖像存儲在對象的 self.images 屬性中。self 指代對象的實例,這意味著這些圖像是特定于該對象的屬性。 [cv2.resize(...) for img in images]:這是列表推導(dǎo)式,它是在對 images 列表中的每個圖像(img)進行操作。for img in images 的含義是遍歷 images 列表中的每個圖像。 cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5):這是 OpenCV 庫中的一個函數(shù),用于調(diào)整圖像的大小。 src=img:指定要調(diào)整大小的源圖像,即當前遍歷到的圖像 img。 dsize=None:表示不指定目標圖像的大小。此參數(shù)為 None 意味著目標大小將由縮放因子 fx 和 fy 決定。 fx=0.5 和 fy=0.5:表示在水平方向和垂直方向上都將圖像縮小到原始大小的 50%。具體來說,fx 和 fy 分別是橫向和縱向的縮放因子。 結(jié)合以上分析,這行代碼的主要作用是將讀取的圖像列表中的每個圖像都縮小到原來的一半,并將它們存儲在對象的 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]:使用列表推導(dǎo)式對每張圖像進行縮放處理,并存儲在 self.images 屬性中。
3. 定義拼接方法
def run(self): # 創(chuàng)建拼接器實例 stitcher = cv2.Stitcher().create() ''' 創(chuàng)建拼接器實例: stitcher = cv2.Stitcher().create() cv2.Stitcher():這是 OpenCV 庫中的一個類,用于進行圖像拼接。拼接器的主要作用是將一系列的輸入圖像拼接成一個全景圖。 .create():該方法用于創(chuàng)建一個拼接器對象,準備執(zhí)行拼接操作。此時,stitcher 變量就引用了一個已初始化的拼接器實例。 ''' # 執(zhí)行拼接操作 status, pano = stitcher.stitch(self.images) ''' 執(zhí)行拼接操作: status, pano = stitcher.stitch(self.images) stitcher.stitch(self.images):調(diào)用拼接器的 stitch 方法,對之前已準備好的圖像列表 self.images 進行拼接。此方法會返回兩個值: status:拼接操作的狀態(tài),其值可以是多個預(yù)定義的常量。具體來說,cv2.STITCHER_OK 表示拼接成功,其他值則表示拼接過程中出錯。 pano:拼接生成的全景圖像,當拼接成功時,該變量將保存拼接后的結(jié)果圖像。 ''' # 檢查拼接狀態(tài) if status == cv2.STITCHER_OK: cv2.imshow('pano', pano) cv2.waitKey(0) else: print('無法拼接為全景圖')
- def run(self)::定義一個名為 run 的方法,用于執(zhí)行全景拼接。
- stitcher = cv2.Stitcher().create():創(chuàng)建一個拼接器實例。
- status, pano = stitcher.stitch(self.images):調(diào)用拼接器的 stitch 方法進行圖像拼接,返回拼接狀態(tài)和拼接后的全景圖像。
- if status == cv2.STITCHER_OK::檢查拼接狀態(tài),如果拼接成功則顯示全景圖。
- cv2.imshow('pano', pano):顯示拼接后的全景圖像。
- cv2.waitKey(0):等待用戶按鍵,防止窗口立即關(guān)閉。
- else::如果拼接失敗,打印錯誤信息。
4. 主程序入口
if __name__ == '__main__': ps = PanoramaStitching() ps.run()
- if __name__ == '__main__'::檢查是否直接運行此腳本。
- ps = PanoramaStitching():創(chuàng)建 PanoramaStitching 類的實例。
- ps.run():調(diào)用 run 方法執(zhí)行全景拼接。
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')] ''' 這段代碼使用了列表推導(dǎo)式,目的是對讀取的圖像進行縮放處理。我們可以逐步分解并詳細解釋這一行代碼: self.images = [...]:這部分表示將處理后的圖像存儲在對象的self.images屬性中。self指代對象的實例,這意味著這些圖像是特定于該對象的屬性。 [cv2.resize(...) for img in images]:這是列表推導(dǎo)式,它是在對images列表中的每個圖像(img)進行操作。for img in images的含義是遍歷images列表中的每個圖像。 cv2.resize(src=img, dsize=None, fx=0.5, fy=0.5):這是OpenCV庫中的一個函數(shù),用于調(diào)整圖像的大小。 src=img:指定要調(diào)整大小的源圖像,即當前遍歷到的圖像img。 dsize=None:表示不指定目標圖像的大小。此參數(shù)為None意味著目標大小將由縮放因子fx和fy決定。 fx=0.5和fy=0.5:表示在水平方向和垂直方向上都將圖像縮小到原始大小的50%。具體來說,fx和fy分別是橫向和縱向的縮放因子。 結(jié)合以上分析,這行代碼的主要作用是將讀取的圖像列表中的每個圖像都縮小到原來的一半,并將它們存儲在對象的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)建拼接器實例: stitcher = cv2.Stitcher().create() CopyInsert cv2.Stitcher():這是OpenCV庫中的一個類,用于進行圖像拼接。拼接器的主要作用是將一系列的輸入圖像拼接成一個全景圖。 .create():該方法用于創(chuàng)建一個拼接器對象,準備執(zhí)行拼接操作。此時,stitcher變量就引用了一個已初始化的拼接器實例。 執(zhí)行拼接操作: status, pano = stitcher.stitch(self.images) CopyInsert stitcher.stitch(self.images):調(diào)用拼接器的stitch方法,對之前已準備好的圖像列表self.images進行拼接。此方法會返回兩個值: status:拼接操作的狀態(tài),其值可以是多個預(yù)定義的常量。具體來說,cv2.STITCHER_OK表示拼接成功,其他值則表示拼接過程中出錯。 pano:拼接生成的全景圖像,當拼接成功時,該變量將保存拼接后的結(jié)果圖像。 ''' if status == cv2.STITCHER_OK: cv2.imshow('pano', pano) cv2.waitKey(0) else: print('無法拼接為全景圖') if __name__ == '__main__': ps = PanoramaStitching() ps.run()
總結(jié)
本文詳細介紹了如何使用 Python 和 OpenCV 庫進行全景拼接,并通過具體的代碼示例展示了整個過程。通過使用 cv2.imread 讀取圖像,cv2.resize 縮放圖像,cv2.Stitcher 進行圖像拼接,最終實現(xiàn)了將多張圖像拼接成一張全景圖的功能。
到此這篇關(guān)于Python使用OpenCV實現(xiàn)全景拼接功能的文章就介紹到這了,更多相關(guān)Python OpenCV全景拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你如何用Pycharm2020.1.1配置遠程連接的詳細步驟
這篇文章主要介紹了如何用Pycharm2020.1.1配置遠程連接,分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-08-08Python Pygame實戰(zhàn)之實現(xiàn)經(jīng)營類游戲夢想小鎮(zhèn)代碼版
作為一名模擬經(jīng)營類游戲的發(fā)燒友,各種農(nóng)場類、醫(yī)院類、鐵路類的游戲玩兒了很多年。今天用代碼給大家打造一款夢想小鎮(zhèn)游戲,希望大家喜歡啦2022-12-12解決python和pycharm安裝gmpy2 出現(xiàn)ERROR的問題
這篇文章主要介紹了python和pycharm安裝gmpy2 出現(xiàn)ERROR的解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08python中pandas.DataFrame的簡單操作方法(創(chuàng)建、索引、增添與刪除)
這篇文章主要介紹了python中pandas.DataFrame的簡單操作方法,其中包括創(chuàng)建、索引、增添與刪除等的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03Python OpenCV實現(xiàn)識別信用卡號教程詳解
本文將介紹如何通過 OpenCV 和 Python 使用模板匹配來執(zhí)行光學(xué)字符識別 (OCR),再應(yīng)用我們的模板匹配 OCR 方法來識別信用卡類型以及 16 位信用卡數(shù)字。代碼具有一定價值,感興趣的童鞋可以了解一下2021-11-11python數(shù)據(jù)分析之DateFrame數(shù)據(jù)排序和排名方式
這篇文章主要介紹了python數(shù)據(jù)分析之DateFrame數(shù)據(jù)排序和排名方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05