基于單應性矩陣變換的圖像拼接融合

單應性矩陣變換

單應性矩陣是一個 3x3 的可逆矩陣,它描述了兩個平面之間的投影變換關系。在圖像領域,單應性矩陣可以將一幅圖像中的點映射到另一幅圖像中的對應點,前提是這兩幅圖像是從不同視角拍攝的同一平面場景。

常見的應用場景:

  • 圖像拼接 :將多幅有重疊區域的圖像拼接成一幅全景圖像。
  • 增強現實 :將虛擬物體正確地投影到現實場景中。
  • 相機位姿估計 :通過已知的三維點和對應的圖像點,估計相機的位置和姿態。

在 OpenCV 中,可以使用 cv2.findHomography 函數來計算單應性矩陣。該函數通常結合特征點檢測和匹配算法使用,步驟如下:

  1. 特征點檢測 :使用 SIFT、SURF、ORB 等算法在兩幅圖像中檢測特征點。
  2. 特征點匹配 :通過特征描述子匹配兩幅圖像中的特征點,找到對應的點對。
  3. 計算單應性矩陣 :使用匹配的點對調用 cv2.findHomography 函數計算單應性矩陣。

代碼示例

import cv2
import numpy as npdef stitch_images(img1, img2):# 1. 特征檢測與匹配detector = cv2.SIFT_create()kp1, des1 = detector.detectAndCompute(img1, None)kp2, des2 = detector.detectAndCompute(img2, None)matcher = cv2.BFMatcher()matches = matcher.knnMatch(des1, des2, k=2)# 篩選優質匹配good = []for m, n in matches:if m.distance < 0.75 * n.distance:good.append(m)# 2. 計算單應性矩陣if len(good) >= 4:src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)else:print("匹配點不足,無法計算單應性矩陣")return None# 計算變換后圖像的四個角點h1, w1 = img1.shape[:2]h2, w2 = img2.shape[:2]pts1 = np.float32([[0, 0], [0, h1], [w1, h1], [w1, 0]]).reshape(-1, 1, 2)pts2 = np.float32([[0, 0], [0, h2], [w2, h2], [w2, 0]]).reshape(-1, 1, 2)pts1_transformed = cv2.perspectiveTransform(pts1, H)# 合并所有角點pts = np.concatenate((pts2, pts1_transformed), axis=0)# 找到新圖像的邊界[x_min, y_min] = np.int32(pts.min(axis=0).ravel() - 0.5)[x_max, y_max] = np.int32(pts.max(axis=0).ravel() + 0.5)# 調整單應性矩陣以補償偏移translation = np.array([[1, 0, -x_min], [0, 1, -y_min], [0, 0, 1]], dtype=np.float32)H = translation.dot(H)# 3. 透視變換result = cv2.warpPerspective(img1, H, (x_max - x_min, y_max - y_min))result[-y_min:h2 - y_min, -x_min:w2 - x_min] = img2# 6. 裁剪黑色邊緣gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)_, thresh = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)if len(contours) > 0:x, y, w, h = cv2.boundingRect(contours[0])result = result[y:y + h, x:x + w]return result# 使用示例
if __name__ == "__main__":img1 = cv2.imread("left.jpg")img2 = cv2.imread("right.jpg")if img1 is not None and img2 is not None:panorama = stitch_images(img1, img2)if panorama is not None:cv2.imwrite("result.jpg", panorama)else:print("圖像讀取失敗,請檢查文件路徑和完整性。")

左側圖片:
1

右側圖片:
2

拼接效果:
3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82844.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何同步虛擬機文件夾

以下是一些常見的同步虛擬機文件夾的方法&#xff1a; 使用共享文件夾&#xff08;以VMware和VirtualBox為例&#xff09; - VMware&#xff1a;打開虛擬機&#xff0c;選擇“虛擬機”->“設置”&#xff0c;在“選項”中選擇“共享文件夾”&#xff0c;點擊“添加”選擇…

前端流行框架Vue3教程:15. 組件事件

組件事件 在組件的模板表達式中&#xff0c;可以直接使用$emit方法觸發自定義事件 觸發自定義事件的目的是組件之間傳遞數據 我們來創建2個組件。父組件&#xff1a; ComponentEvent.vue,子組件&#xff1a;Child.vue Child.vue <script> export default {// 子組件通…

Python+1688 API 開發教程:實現商品實時數據采集的完整接入方案

在電商行業競爭日益激烈的當下&#xff0c;掌握商品實時數據是企業制定精準營銷策略、優化供應鏈管理的關鍵。1688 作為國內重要的 B2B 電商平臺&#xff0c;其開放平臺提供了豐富的 API 接口&#xff0c;借助 Python 強大的數據處理能力&#xff0c;我們能夠高效實現商品數據的…

聊一聊Electron中Chromium多進程架構

Chromium 多進程架構概述 Chromium 的多進程架構是其核心設計之一&#xff0c;旨在提高瀏覽器的穩定性、安全性和性能。Chromium 將不同的功能模塊分配到獨立的進程中&#xff0c;每個進程相互隔離&#xff0c;避免了單進程架構中一個模塊的崩潰導致整個瀏覽器崩潰的問題。 在…

CodeBuddy 中國版 Cursor 實戰:Redis+MySQL雙引擎驅動〈王者榮耀〉戰區排行榜

文章目錄 一、引言二、系統架構設計2.1、整體架構概覽2.2、數據庫設計2.3、后端服務設計 三、實戰&#xff1a;從零構建排行榜3.1、開發環境準備3.2、用戶與戰區 數據管理3.2.1、MySQL 數據庫表創建3.2.2、實現用戶和戰區數據的 CURD 操作 3.3、實時分數更新3.4、排行榜查詢3.5…

Oracle OCP認證考試考點詳解083系列15

題記&#xff1a; 本系列主要講解Oracle OCP認證考試考點&#xff08;題目&#xff09;&#xff0c;適用于19C/21C,跟著學OCP考試必過。 71. 第71題&#xff1a; 題目 解析及答案&#xff1a; 關于在 Oracle 18c 及更高版本中基于 Oracle 黃金鏡像的安裝&#xff0c;以下哪…

LS-NET-012-TCP的交互過程詳解

LS-NET-012-TCP的交互過程詳解 附加&#xff1a;TCP如何保障數據傳輸 TCP的交互過程詳解 一、TCP協議核心交互流程 TCP協議通過三次握手建立連接、數據傳輸、四次揮手終止連接三大階段實現可靠傳輸。整個過程通過序列號、確認應答、窗口控制等機制保障傳輸可靠性。 1.1 三次…

【Pandas】pandas DataFrame cumprod

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每個元素的絕對值DataFrame.all([axis, bool_only, skipna])用于判斷 DataFrame 中是否所有元素在指定軸上都為 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判斷…

C語言之旅5---分支與循環【2】

&#x1f4ab;只有認知的突破&#x1f4ab;才來帶來真正的成長&#x1f4ab;編程技術的學習&#x1f4ab;沒有捷徑&#x1f4ab;一起加油&#x1f4ab; &#x1f341;感謝各位的觀看&#x1f341;歡迎大家留言&#x1f341;咱們一起加油&#x1f341;努力成為更好的自己&#x…

docker大鏡像優化實戰

在 Docker 鏡像優化方面&#xff0c;有許多實戰技巧可以顯著減小鏡像體積、提高構建效率和運行時性能。以下是一些實用的優化策略和具體操作方法&#xff1a; 1. 選擇合適的基礎鏡像 策略 使用 Alpine 版本&#xff1a;Alpine 鏡像通常只有 5-10MB&#xff0c;比 Ubuntu/Deb…

Java面試終極篇:Sentinel+Seata+Kafka Streams高并發架構實戰

面試官&#xff1a;張總&#xff08;嚴肅臉&#xff09; 程序員&#xff1a;小王&#xff08;緊張冒冷汗&#xff09; 第一輪&#xff1a;分布式基礎 張總&#xff1a;說說Spring Cloud Alibaba的Sentinel和Nacos的區別&#xff1f; 小王&#xff1a;&#xff08;結巴&#…

hab機制

HAB&#xff08;Host-to-Guest Communication&#xff09;?是一種用于高通平臺上的主機與虛擬機之間的通信機制&#xff0c;主要用于實現宿主操作系統&#xff08;host OS&#xff09;與虛擬機操作系統&#xff08;guest OS&#xff09;之間的數據共享和通信。HAB機制允許虛擬…

Mac M系列 安裝 jadx-gui

安裝 Homebrew在終端中執行以下命令&#xff08;需管理員密碼&#xff09;&#xff1a; 安裝 Homebrew&#xff08;官方源&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"國內用戶可用鏡像源加速&…

Angular | 利用 `ChangeDetectorRef` 解決 Angular 動態顯示輸入框的聚焦問題

在 Angular 應用開發中&#xff0c;實現用戶點擊按鈕后&#xff0c;原地切換顯示一個輸入框并自動獲取焦點的功能&#xff0c;是一個常見的交互模式。例如&#xff0c;搜索圖標點擊后變為搜索框&#xff0c;用戶可以直接輸入。然而&#xff0c;由于 Angular 的變更檢測和 DOM 更…

CSP認證準備第三天-差分及第36次CCF認證(BFS)

基礎知識參考&#xff1a; csp突擊前兩題常用算法代碼_ccf csp常用優化算法-CSDN博客 差分 什么是差分數組&#xff1f; 差分數組是原數組相鄰元素之間的差值構成的數組。對于原數組 a&#xff0c;其差分數組 b 定義為&#xff1a; b[1] a[1] (假設 a[0] 0) b[i] a[i] …

[案例四] 智能填寫屬性工具(支持裝配組件還有建模實體屬性的批量創建、編輯)

論文盲審結果要出來了,渣渣超沒有心情繼續寫了,過一段時間再說吧,今天宣布五一結束,哈哈哈。寫完這篇博客開始搞科研了,有時間再進NX開發學習。本次案例主要是對上次導出自動導出BOM的一個前處理,要想導出屬性,首先的有屬性。于是本著學習的態度進行制作,可能有些功能有…

四核RK3566多媒體控制板技術分享(RK3566如何實現7個串口同時進行)

四核RK3566多媒體控制板技術分享: 今天分享一款近期接觸到的四核RK3566多媒體控制板&#xff08;產品型號&#xff1a;ZK-R36A&#xff09;&#xff0c;這款產品在工業控制和智能設備領域有不錯的表現&#xff0c;特此整理了一些技術參數供大家參考。 產品概述: 這款控制板采用…

多線程代碼案例-1 單例模式

單例模式 單例模式是開發中常見的設計模式。 設計模式&#xff0c;是我們在編寫代碼時候的一種軟性的規定&#xff0c;也就是說&#xff0c;我們遵守了設計模式&#xff0c;代碼的下限就有了一定的保證。設計模式有很多種&#xff0c;在不同的語言中&#xff0c;也有不同的設計…

【計算機組成原理】第二部分 存儲器--分類、層次結構

文章目錄 分類&層次結構0x01 分類按存儲介質分類按存取方式分類按在計算機中的作用分類 0x02 層次結構 分類&層次結構 0x01 分類 按存儲介質分類 半導體存儲器磁表面存儲器磁芯存儲器光盤存儲器 按存取方式分類 存取時間與物理地址無關&#xff08;隨機訪問&#…

迅為RK3588開發板安卓GPIO調用APP運行測試

將網盤上的安卓工程文件復制到 Windows 電腦上。確保工程路徑中使用英文字符&#xff0c;不包含中文。接著&#xff0c;啟動 Android Studio&#xff0c;點擊“Open”按鈕選擇應用工程文件夾&#xff0c;然后點擊“OK”。由于下載 Gradle 和各種 Jar 包可能需要一段時間&#x…