OpenCV Python——圖像查找(特征匹配 + 單應性矩陣)

  • 1 圖像查找(單應性矩陣)
  • 2 單應性矩陣 應用舉例
  • 3 單應性矩陣 代碼示例

P87 11

1 圖像查找(單應性矩陣)

特征匹配作為輸入,獲得單應性矩陣
在這里插入圖片描述

X在img1和img2中的成像分別為x,x'

圖中H即為單應性矩陣
在這里插入圖片描述

2 單應性矩陣 應用舉例

獲取一個矩陣,通過與圖像1就算可以得到圖像2對應點的位置;
圖像二通過計算可以得到點原始位置,同樣圖像一也可以經過計算得到點原始位置;

自動轉正

在這里插入圖片描述
更換廣告牌中的內容
在這里插入圖片描述

3 單應性矩陣 代碼示例

在一節FLANN特征匹配的基礎上增加了,單應性矩陣、透視變換、框圖

#獲取的單應性矩陣
#srcPts從匹配點good中獲取,每次遍歷都可以從kp1[m.queryIdx]中獲取一個關鍵點
#關鍵點需要轉成浮點型
#對獲取到的關鍵點要重新變換reshape(-1, 1, 2),x值隨意,y值1,z值2,即無數行,每行一個元素,每個元素有2個子元素
#queryIdx,trainIdx分別是第一幅圖,第二幅圖的描述子索引值
if len(good) >= 4:#單應性矩陣要求匹配點要大于等于4srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)#原關鍵點dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)#目標關鍵點#單應性矩陣H, mask = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)#cv2.RANSAC對錯誤匹配點過濾,閾值1~10,這里是5#透視變換#獲取要搜索的圖的四個角點(左上,左下,右下,右上),同樣需要轉成浮點型,然后reshapeh, w = img1.shape[:2]pts = np.float32([[0,0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)dst = cv2.perspectiveTransform(pts, H)#多邊形繪制,將找到的子圖在原圖中框出來吧cv2.polylines(img2, [np.int32(dst)], True, (0, 0, 255))#目標圖,32位整形,TRUE封口,
else:print('the number of good is less than 4.')exit()

效果如下:

在這里插入圖片描述

完整代碼

import cv2
import numpy as np#讀文件
img1 = cv2.imread('opencv_search.png')
img2 = cv2.imread('opencv_orig.png')#灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#創建sift對象                                                       
sift= cv2.xfeatures2d.SIFT_create()#進行檢測關鍵點,同時計算描述子
kp1 ,des1= sift.detectAndCompute(gray1, None)#掩碼設置為NONE,即對整張圖檢測
kp2 ,des2= sift.detectAndCompute(gray2, None)#掩碼設置為NONE,即對整張圖檢測#創建flann匹配器
index_params=dict(algorithm=1,tree=5)
search_params=dict(checks=50)flann=cv2.FlannBasedMatcher(index_params,search_params)#對描述子進行特征匹配
matches=flann.knnMatch(des1,des2,k=2)#對匹配點優化過濾
good=[]
for i,(m,n) in enumerate(matches):#對img1,img2中的匹配點進行遍歷if m.distance < 0.7* n.distance:#越小越精準good.append(m)#獲取的單應性矩陣
#srcPts從匹配點good中獲取,每次遍歷都可以從kp1[m.queryIdx]中獲取一個關鍵點
#關鍵點需要轉成浮點型
#對獲取到的關鍵點要重新變換reshape(-1, 1, 2),x值隨意,y值1,z值2,即無數行,每行一個元素,每個元素有2個子元素
#queryIdx,trainIdx分別是第一幅圖,第二幅圖的描述子索引值
if len(good) >= 4:#單應性矩陣要求匹配點要大于等于4srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)#原關鍵點dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)#目標關鍵點#單應性矩陣H, mask = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)#cv2.RANSAC對錯誤匹配點過濾,閾值1~10,這里是5#透視變換#獲取要搜索的圖的四個角點(左上,左下,右下,右上),同樣需要轉成浮點型,然后reshapeh, w = img1.shape[:2]pts = np.float32([[0,0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)dst = cv2.perspectiveTransform(pts, H)#多邊形繪制,將找到的子圖在原圖中框出來吧cv2.polylines(img2, [np.int32(dst)], True, (0, 0, 255))#目標圖,32位整形,TRUE封口,
else:print('the number of good is less than 4.')exit()#繪制匹配結果
img3=cv2.drawMatchesKnn(img1,kp1,img2,kp2,[good],None)cv2.imshow('img3', img3)
cv2.waitKey(0)

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

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

相關文章

Ubuntu 安裝帶證書的 etcd 集群

1.概念 etcd 是由GO語言編寫的分布式的、可靠的鍵值存儲系統&#xff0c;主要用于分布式系統中關鍵數據的存儲和服務發現。 2.核心概念 節點&#xff08;Node&#xff09; 每個運行 etcd 的實例被稱為一個節點。一個或多個節點可以組成一個集群。 集群&#xff08;Cluster&…

360 集團20周年會:戰略升級ALL IN Agent,搶占智能體時代先機

發布 | 大力財經8月15日&#xff0c;360集團迎來二十周年&#xff0c;在北京奧林匹克體育中心舉辦的“360集團20周年榮耀慶典”上&#xff0c;創始人周鴻祎向現場數千名員工發表演講&#xff0c;回顧360集團二十年的發展歷程&#xff0c;并明確360集團下一階段的公司戰略&#…

命令模式C++

命令模式&#xff08;Command Pattern&#xff09;是一種行為型設計模式&#xff0c;它將請求封裝為一個對象&#xff0c;使你可以用不同的請求對客戶進行參數化&#xff0c;還能支持請求的排隊、記錄日志及撤銷操作。這種模式將發送者和接收者解耦&#xff0c;發送者無需知道接…

Web攻防-大模型應用LLM搭建接入第三方內容喂養AI插件安全WiKI庫技術賦能

知識點&#xff1a; 1、WEB攻防-LLM搭建-AI喂養&安全知識WIKI庫 演示案例&#xff1a;WEB攻防-LLM搭建-AI喂養&安全知識WIKI庫 使用參考 https://docs.web2gpt.ai/ https://mp.weixin.qq.com/s/qqTOW5Kg1v0uxdSpbfriaA 0、服務器環境&#xff1a;阿里云 Ubuntu22.04 …

圖片拼接-動手學計算機視覺8

前言圖片拼接&#xff08;image stitching&#xff09;就是將統一場景的不同拍攝出的圖片拼接到一起&#xff0c;如圖所示就是拼接全景圖&#xff0c;是圖片拼接的應用之一&#xff0c;手機拍照都有全景拍攝功能仔細觀察全景圖&#xff0c;尋找它們相似性&#xff0c;圖8-2的全…

Web第二次作業

作業一&#xff1a;學校官網1.1學校官網代碼如下&#xff1a;?<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

【CV 目標檢測】②R-CNN模型

二、R-CNN網絡基礎 2.R-CNN模型 2014年提出R-CNN&#xff01;網絡&#xff0c;該網絡不再使用暴力窮舉的方法&#xff0c;而是使用候選區域方法&#xff08;region proposal method&#xff09;創建目標檢測的區域來完成目標檢測的任務&#xff0c;R-CNN是以深度神經網絡為基礎…

STM32L051C8與STM32L151C8的主要區別

STM32L051C8與STM32L151C8 有什么區別&#xff1f; LPTIM 有什么特點,為什么STM32L151C8沒有LPTIM,而STM32L051C8有1個? 1. STM32L051C8與STM32L151C8的主要區別 STM32L051C8STM32L151C8內核Cortex-M0Cortex-M3主頻32MHz32MHz閃存/ SRAM64KB/8KB64KB/16KB工作電壓1.65V-3.6V…

【軟考中級網絡工程師】知識點之網關協議深度剖析

目錄一、網關協議基礎探秘1.1 網關協議概念1.2 網關協議作用1.3 網關協議分類總覽二、內部網關協議&#xff08;IGP&#xff09;深度解析2.1 距離矢量協議2.2 鏈路狀態協議2.3 混合型協議三、外部網關協議&#xff08;EGP&#xff09;探秘3.1 BGP 協議詳解3.2 BGP 協議的關鍵特…

JavaScript 中 call、apply 和 bind 方法的區別與使用

一、核心作用與基礎概念這三個方法都用于顯式改變函數執行時的 this 指向&#xff0c;解決 JavaScript 中函數上下文動態綁定的問題。1.call()立即執行函數&#xff0c;第一個參數為 this 指向對象&#xff0c;后續參數為逗號分隔的參數列表語法&#xff1a;func.call(thisArg,…

【Android】適配器與外部事件的交互

三三要成為安卓糕手 引入&#xff1a;在上一篇文章中我們完成了新聞展示頁面多布局案例的展示&#xff0c;感悟頗多&#xff0c;本篇文章&#xff0c;繼續去開發一些新的功能 一&#xff1a;關閉廣告 所有的view都可以和我們的用戶做交互&#xff0c;循環視圖中也給我們提供了相…

MySQL的分析查詢語句(EXPLAIN):

目錄 基本語法&#xff1a; 各個字段的含義&#xff1a; id&#xff1a; select_type&#xff1a; table&#xff1a; partitions&#xff1a; type&#xff1a; possible_keys&#xff1a; key&#xff1a; key_len&#xff1a; ref&#xff1a; row&#xff1a; …

C++ #if

在 C 中&#xff0c;#if 是 預處理器指令&#xff08;Preprocessor Directive&#xff09;&#xff0c;用于 條件編譯&#xff0c;即在編譯階段根據條件決定是否包含某段代碼。它通常與 #define、#ifdef、#ifndef、#else 和 #endif 配合使用。基本語法#if 條件表達式// 如果條件…

方案 | 動車底部零部件檢測實時流水線檢測算法改進

項目背景隨著我國高速鐵路運營里程突破4.5萬公里&#xff0c;動車組日均開行超過8000列次&#xff0c;傳統人工巡檢方式已無法滿足密集運行下的安全檢測需求。車底關鍵部件如制動系統、懸掛裝置、牽引電機等長期承受高強度振動和沖擊&#xff0c;易產生疲勞裂紋、螺栓松動、部件…

企業收款統計:驅動業務決策的核心引擎設計開發——仙盟創夢IDE

代碼完整代碼<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>黑金風格職員統計</title><style>/* 頁面基礎樣式 - 黑金風格 */body {font-family: Segoe UI, Tahoma, Geneva, Verdana, …

CIAIE 2025上海汽車內外飾展觀察:從美學到功能的產業躍遷

在智能化、電動化浪潮推動下&#xff0c;汽車產業的市場格局、技術路線、供應鏈結構與用戶體驗正被系統性重塑。汽車感知空間核心的“內外飾件”&#xff0c;正從原本的結構性、功能性部件&#xff0c;逐步躍升為智能化、情感化和差異化體驗的重要承載載體&#xff0c;開啟了從…

Spring IOC容器在Web環境中的啟動奧秘:深入源碼解析

一、為何需要關注IOC容器啟動&#xff1f;在Java Web開發中&#xff0c;Spring MVC框架的基石正是IOC容器。但你是否思考過&#xff1a;獨立的IOC模塊如何與Tomcat等Servlet容器協同工作&#xff1f; 其啟動過程與Web容器的生命周期深度綁定&#xff0c;這是構建穩定Spring應用…

前端JS處理時間,適用于聊天、操作記錄等(包含剛剛、x分鐘前、x小時前、x天前)

export default {// 首頁時間轉化formatDate(val) {var nowDate new Date()var oldDate new Date(val)const Y oldDate.getFullYear()const M oldDate.getMonth() 1const D oldDate.getDate()var diff nowDate.getTime() - oldDate.getTime()var minutes Math.floor(di…

C#---StopWatch類

老方法&#xff0c;想要全面了解和學習一個類必先看文檔 微軟文檔 1.StopWatch 提供一組方法和屬性&#xff0c;可用來測量運行時間。 1.1 屬性和方法 屬性&#xff1a; 方法&#xff1a; 1.2 使用 using System.Diagnostics;namespace Study04_反射專題 {internal cla…

3DTiles轉OSGB格式逆向轉換方法研究

一、概述 在傾斜攝影的應用領域中&#xff0c;3DTiles與OSGB格式的互轉是常見的技術需求。作為專業的GIS處理平臺&#xff0c;GISBox憑借其先進的傾斜攝影反切功能&#xff0c;為用戶提供了高效、穩定的跨格式數據轉換解決方案。 二、3DTiles轉OSGB的意義 保留原始幾何與紋理…