Python使用OpenCV實(shí)現(xià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)文章
手把手教你如何用Pycharm2020.1.1配置遠(yuǎn)程連接的詳細(xì)步驟
這篇文章主要介紹了如何用Pycharm2020.1.1配置遠(yuǎn)程連接,分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-08-08python高階爬蟲(chóng)實(shí)戰(zhàn)分析
這篇文章給大家分享了python高階爬蟲(chóng)實(shí)戰(zhàn)的相關(guān)實(shí)例內(nèi)容以及技巧分析,有興趣的朋友參考下。2018-07-07Python Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)經(jīng)營(yíng)類游戲夢(mèng)想小鎮(zhèn)代碼版
作為一名模擬經(jīng)營(yíng)類游戲的發(fā)燒友,各種農(nóng)場(chǎng)類、醫(yī)院類、鐵路類的游戲玩兒了很多年。今天用代碼給大家打造一款夢(mèng)想小鎮(zhèn)游戲,希望大家喜歡啦2022-12-12解決python和pycharm安裝gmpy2 出現(xiàn)ERROR的問(wèn)題
這篇文章主要介紹了python和pycharm安裝gmpy2 出現(xiàn)ERROR的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08python中pandas.DataFrame的簡(jiǎn)單操作方法(創(chuàng)建、索引、增添與刪除)
這篇文章主要介紹了python中pandas.DataFrame的簡(jiǎn)單操作方法,其中包括創(chuàng)建、索引、增添與刪除等的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03Python OpenCV實(shí)現(xiàn)識(shí)別信用卡號(hào)教程詳解
本文將介紹如何通過(guò) OpenCV 和 Python 使用模板匹配來(lái)執(zhí)行光學(xué)字符識(shí)別 (OCR),再應(yīng)用我們的模板匹配 OCR 方法來(lái)識(shí)別信用卡類型以及 16 位信用卡數(shù)字。代碼具有一定價(jià)值,感興趣的童鞋可以了解一下2021-11-11python數(shù)據(jù)分析之DateFrame數(shù)據(jù)排序和排名方式
這篇文章主要介紹了python數(shù)據(jù)分析之DateFrame數(shù)據(jù)排序和排名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05