OpenCv(七)——模板匹配、打包、圖像的旋轉

目錄

一、模板匹配

模板匹配原理

1、單模板之間的匹配

(1)讀取并顯示待匹配的圖片和模板圖片

(2)模板匹配并繪制匹配位置的外接矩形

(3)顯示最終的效果?

2、模板與多個對象匹配,僅匹配當前的模板

(1)讀取并顯示待匹配的圖片和模板灰度圖片

(2)?模板匹配

(3)設置閾值

3、匹配相同模板的全角度

(1)讀取并顯示待匹配的圖片和模板灰度圖片,旋轉模板得到所有的能匹配到的模板。

(2)模板匹配并繪制外接矩形

二、打包與np.where()函數

1、np.where()函數

(1) 作為條件選擇器(類似三元表達式)

(2) 作為條件索引獲取器(省略 x 和 y)

2、打包與解包

(1)打包

(2)解包

3、反轉列表

三、圖像的旋轉

1、使用numpy方法實現旋轉

(1)順時針旋轉90度

(2)逆時針旋轉90度

2、使用opencv的方法實現圖像旋轉

(1)順時針旋轉90度

(2)逆時針旋轉90度

(3)旋轉180度


一、模板匹配

模板匹配是一種用于查找與模板圖像(補丁)匹配(相似)的圖像區域的技術。

為了識別匹配區域,我們必須通過滑動來將模板圖像與源圖像進行比較:

?????????一次移動一個像素(從左到右,從上到下)。在每個位置,都會計算一個度量(度量計算公式),以便它表示該位置的匹配“好”或“壞”程度

模板匹配原理

?

匹配原理:模板從圖片的左上角逐一進行匹配,針對每一個匹配位置(位置坐標是模板左上角坐標),都會根據matchTemplate()函數設置的計算方法得到一個對應的得分值,不同的匹配方法數值大小的效果是不同的,找到最優的匹配結果返回。

函數API:

????????cv2.matchTemplate(image, templ, method, result=None, mask=None)
????????????????image:待搜索圖像
????????????????templ:模板圖像
????????????????method:計算匹配程度的方法,可以有:
????????? TM_SQDIFF 平方差匹配法:該方法采用平方差來進行匹配;匹配越好,值越小;匹配越差,值越大。
????????? TM_CCORR 相關匹配法:該方法采用乘法操作;數值越大表明匹配程度越好。
? ????????TM_CCOEFF 相關系數匹配法:數值越大表明匹配程度越好。
????????? TM_SQDIFF_NORMED 歸一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
????????? TM_CCORR_NORMED 歸一化相關匹配法,數值越大表明匹配程度越好。
? ????????TM_CCOEFF_NORMED 歸一化相關系數匹配法,數值越大表明匹配程度越好。

????????返回匹配結果的矩陣,其中每個元素表示該位置與模板的匹配程度

如果想了解matchTemplate的method的具體計算方法和matchTemplate的基礎知識,可以前往OpenCv的官網查看更詳細的知識OpenCV: Template Matching。

1、單模板之間的匹配

可樂模板匹配代碼

(1)讀取并顯示待匹配的圖片和模板圖片

kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
cv2.imshow('kele',kele)
cv2.imshow('template',template)
cv2.waitKey(0)

(2)模板匹配并繪制匹配位置的外接矩形

cv2.minMaxLoc()可以獲取矩陣中的最小值和最大值,以及最小值的索引號和最大值的索引號

h, w = template.shape[:2]    #獲取模板圖片的高和寬res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)   #返回匹配結果的矩陣,其中每個元素表示該位置與模板的匹配程度
# cv2.minMaxLoc可以獲取矩陣中的最小值和最大值,以及最小值的索引號和最大值的索引號
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 最小值、最大值、最小值位置、最大值位置
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)    #獲得圖片右下角坐標
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)  # 繪制矩形

(3)顯示最終的效果?

cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)

2、模板與多個對象匹配,僅匹配當前的模板

?模板:

待匹配對象:?

(1)讀取并顯示待匹配的圖片和模板灰度圖片

import cv2
import numpy as np
#(這里用到了兩種方法來將彩色圖片轉化為灰度圖)img_rgb=cv2.imread('../data/tuall.jpg')
img_gray=cv2.cvtColor(img_rgb,cv2.COLOR_BGRA2GRAY)
tuone=cv2.imread('../data/tuone.jpg',0)

(2)?模板匹配

h,w=tuone.shape[:2]
# 使用模板匹配方法進行模板匹配
res=cv2.matchTemplate(img_gray,tuone,cv2.TM_CCOEFF_NORMED)

(3)設置閾值

np.where()函數:過濾出符合條件的數值。

閾值設置原理:

在進行多對象匹配時,常常要設置閾值保證能夠完全框選到對象,當閾值設置為0.9時,所有滿足大于0.9的外接矩形都會被繪制出來,如果這個閾值數據設置的更小,那么符合條件的位置就越多,表現在圖上的特征就是有更多的框,框的線更粗。

反轉:

loc的數據,下面表示的是行和列,但是在opencv中行時用y表示,列時用x表示,所以按照x,y表示的話,下面給出的數據是,(y,x),繪制矩形時應該是x和y,所以這里要做反轉。

# 設置匹配閾值
threshold=0.9
#獲取匹配結果中所有符合閾值的點的坐標
loc=np.where(res>=threshold)    #如果得分大于閾值,返回大于閾值的索引for pt in zip(*loc[::-1]):    #反轉打包#在原圖上繪制矩形框cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,255,0),1)cv2.imshow('1',img_rgb)
cv2.waitKey(0)

3、匹配相同模板的全角度

待匹配的圖像上有很多個可以匹配上的圖,但是匹配的模板需要旋轉才能匹配上

將圖片上的所有的圖像模板都匹配上

(1)讀取并顯示待匹配的圖片和模板灰度圖片,旋轉模板得到所有的能匹配到的模板。

import cv2
import numpy as npimg_rgb=cv2.imread('../data/tuall.jpg')
img_gray=cv2.cvtColor(img_rgb,cv2.COLOR_BGRA2GRAY)tuone=cv2.imread('../data/tuone.jpg',0)
tuone1=cv2.rotate(tuone,cv2.ROTATE_90_CLOCKWISE)    #順時針旋轉90度
tuone2=cv2.rotate(tuone,cv2.ROTATE_90_COUNTERCLOCKWISE)    #逆時針旋轉90度
tuone3=cv2.rotate(tuone,cv2.ROTATE_180)    #旋轉180度
tuones=[tuone,tuone1,tuone2,tuone3]    

(2)模板匹配并繪制外接矩形

h,w=tuone.shape[:2]
# 使用模板匹配方法進行模板匹配
for tu in tuones:res=cv2.matchTemplate(img_gray,tu,cv2.TM_CCOEFF_NORMED)# 設置匹配閾值threshold=0.9#獲取匹配結果中所有符合閾值的點的坐標loc=np.where(res>=threshold)for pt in zip(*loc[::-1]):#在原圖上繪制矩形框cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)cv2.imshow('1',img_rgb)
cv2.waitKey(0)

二、打包與np.where()函數

1、np.where()函數

(1) 作為條件選擇器(類似三元表達式)

語法

np.where(condition, x=None, y=None)
  • condition:布爾數組或表達式,用于指定條件。
  • x, y(可選):當條件為?True?時返回?x?對應位置的元素,為?False?時返回?y?對應位置的元素。
  • 返回值:形狀與?condition?相同的數組,元素來自?x?或?y

示例:

import numpy as npa = np.array([1, 2, 3, 4, 5])
# 將大于 3 的元素替換為 10,否則保持原值
result = np.where(a > 3, 10, a)
print(result)  # 輸出: [ 1  2  3 10 10]# 更復雜的條件(結合邏輯運算)
b = np.array([10, 20, 30, 40])
condition = (a > 2) & (b < 35)  # 同時滿足兩個條件
result = np.where(condition, a * 2, b // 2)
print(result)  # 輸出: [ 2  4  6 20](僅前3個元素滿足條件,最后一個不滿足,取 b//2=20)

(2) 作為條件索引獲取器(省略 x 和 y)

??語法

np.where(condition)
  • 作用:返回滿足條件?condition?的元素的索引(以元組形式表示,每個元素對應數組的一個維度)。
  • 返回值:元組?(ind1, ind2, ..., indn),其中?indi?是第?i?維滿足條件的索引數組

示例:

a = np.array([1, 2, 3, 4, 4, 5])
# 獲取值為 4 的元素的索引
indices = np.where(a == 4)
print(indices)  # 輸出: (array([3, 4]),)(一維數組,索引為 3 和 4)# 二維數組示例
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
condition = b > 5
indices = np.where(condition)
print(indices)  # 輸出: (array([1, 2, 2]), array([2, 0, 1, 2])),對應行和列的索引

2、打包與解包

(1)打包

a=[1,2,3]
b=[4,5,6]# 使用zip將他們按位置進行配對
zipped=zip(a,b)
print(list(zipped))
# 輸出:[(1,4),(2,5),(3,6)]

(2)解包

????????zip(*iterables)將多個可迭代對象(列表、元組)進行解壓操作

# 假設我們已經有了一個打包好的zip對象
zipped=zip(a,b)# #使用*運算符解包,得到轉置的結果
unzipped=zip(*zipped)
loc = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]# 1. loc[::-1]:反轉列表
reversed_loc = loc[::-1]
print(reversed_loc)  # 輸出: [[7, 8, 9], [4, 5, 6], [1, 2, 3]]# 2. *reversed_loc:解包列表
# 此時相當于 zip([7, 8, 9], [4, 5, 6], [1, 2, 3])# 3. zip(*reversed_loc):使用 zip 函數進行打包
zipped = zip(*reversed_loc)
for pt in zipped:print(pt)
# 輸出:
# (7, 4, 1)
# (8, 5, 2)
# (9, 6, 3)

?

3、反轉列表

假設?loc = [(1, 2), (3, 4), (5, 6)](3 個坐標點):

  1. 反轉列表loc[::-1] = [(5, 6), (3, 4), (1, 2)]

三、圖像的旋轉

1、使用numpy方法實現旋轉

讀取圖片并重設圖片大小

import cv2
import numpy as npimg=cv2.imread("../data/kele.png")
img=cv2.resize(img,dsize=None,fx=0.5,fy=0.5)cv2.imshow('yuantu',img)

(1)順時針旋轉90度

# 旋轉90度,k=-1,表示順時針旋轉90度
rotated_image1=np.rot90(img,k=-1)
cv2.imshow('totated_image1',rotated_image1)

(2)逆時針旋轉90度

# 旋轉90度,k=1,表示逆時針旋轉90度
rotated_image2=np.rot90(img,k=1)
cv2.imshow('retated_image',rotated_image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、使用opencv的方法實現圖像旋轉

(1)順時針旋轉90度

rotated_image=cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)   #順時針旋轉90
cv2.imshow('shun90',img)

(2)逆時針旋轉90度

rotated_image1=cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)   #逆時針旋轉90度
cv2.imshow('ni90',rotated_image1)

(3)旋轉180度

rotated_image2=cv2.rotate(img,cv2.ROTATE_180)   #旋轉180度
cv2.imshow('180',rotated_image2)
cv2.waitKey(0)

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

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

相關文章

藍橋云客 最大和

問題描述 小藍在玩一個尋寶游戲&#xff0c;游戲在一條筆直的道路上進行&#xff0c;道路被分成了 n 個方格&#xff0c;依次編號 1 至 n&#xff0c;每個方格上都有一個寶物&#xff0c;寶物的分值是一個整數&#xff08;包括正數、負數和零&#xff09;&#xff0c;當進入一…

【C++算法】49.分治_歸并_計算右側小于當前元素的個數

文章目錄 題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;圖解 題目鏈接&#xff1a; 315. 計算右側小于當前元素的個數 題目描述&#xff1a; 解法 歸并排序&#xff08;分治&#xff09; 當前元素的后面&#xff0c;有多少個比我小。&#xff08;降序&…

IPSec簡單例子

實驗說明 使用Ensp模擬器實現IPsec隧道實驗。IPSec是一種VPN技術&#xff0c;配置的思路首先是兩個網絡先通&#xff0c;然后配置ACL、IEK和IPSec對等體&#xff0c;從而建立VPN隧道。 實驗拓撲 配置過程 1 配置IP地址以及OSPF路由 # 配置中使用了簡寫命令&#xff0c;不熟…

車載聯網終端4G汽車TBOX介紹定義與概述

汽車 TBOX&#xff08;Telematics Box&#xff09;是專為汽車設計的遠程通信終端設備&#xff0c;屬于車聯網系統的關鍵組成部分。車聯網系統一般包含主機、汽車 T - BOX、手機 APP 及后臺系統。融合了車身網絡和 4G 無線通信技術&#xff0c;為汽車提供豐富的 Telematics 服務…

《DeepSeek RAG 增強檢索知識庫系統》Ollama DeepSeek 流式應答頁面對接之三

前言 自從有了 AI 工具以后&#xff0c;所有以前頭疼前端頁面開發的后端程序員&#x1f468;&#x1f3fb;?&#x1f4bb;&#xff0c;都漏出了友善&#x1f60a;微笑&#xff01; 主要我們可以清楚地表達編寫頁面訴求&#xff0c;AI 工具就可以非常準確且迅速的完成代碼的實…

【MyBatis】深入解析 MyBatis:關于注解和 XML 的 MyBatis 開發方案下字段名不一致的的查詢映射解決方案

注解查詢映射 我們再來調用下面的 selectAll() 這個接口&#xff0c;執行的 SQL 是 select* from user_info&#xff0c;表示全列查詢&#xff1a; 運行測試類對應方法&#xff0c;在日志中可以看到&#xff0c;字段名一致&#xff0c;Mybatis 就成功從數據庫對應的字段中拿到…

深入理解Java性能調優與JVM底層機制

Java作為一種廣泛應用的編程語言&#xff0c;在企業級應用中占據著舉足輕重的地位。隨著系統規模的擴大和業務需求的復雜化&#xff0c;性能調優成為了開發過程中不可忽視的一環。Java的性能瓶頸往往并不直接來自代碼本身&#xff0c;而是與JVM&#xff08;Java虛擬機&#xff…

odo18實施——銷售-倉庫-采購-制造-制造外包-整個流程自動化單據功能的演示教程

安裝模塊 安裝銷售 、庫存、采購、制造模塊 2.開啟外包功能 在進入制造應用點擊 配置—>設置 勾選外包&#xff0c;點擊保存 添加信息 一、添加客戶信息 點擊到銷售應用 點擊訂單—>客戶 點擊新建 創建客戶1&#xff0c;及其他客戶相關信息&#xff0c;點…

Logo語言的在線課程學習

Logo語言在線課程學習的探索 引言 在信息技術快速發展的今天&#xff0c;編程已經成為一門重要的技能。尤其隨著人工智能、數據分析和互聯網技術的普及&#xff0c;各種編程語言層出不窮&#xff0c;其中Logo語言以其獨特的教育意義和學習優勢&#xff0c;逐漸受到學校和教育…

情感語音的“開源先鋒”!網易開源

語音合成技術近年來取得了顯著進步&#xff0c;特別是在語音克隆、語音助手、配音服務和有聲讀物等領域。然而&#xff0c;如何讓合成的語音更具情感&#xff0c;更貼近人類的真實表達&#xff0c;一直是這一領域的重要研究方向。今天&#xff0c;我們將為大家介紹一款由網易有…

攝像頭模塊對焦方式的類型

攝像頭模塊的對焦方式直接影響成像清晰度和使用場景適應性&#xff0c;不同技術各有其優缺點。以下是常見對焦方式及其原理、特點和應用場景的詳細說明&#xff1a; ?1. 固定對焦&#xff08;Fixed Focus&#xff09;? ?原理?&#xff1a;鏡頭固定在特定距離&#xff08;…

使用Vue、Nodejs以及websocket搭建一個簡易聊天室

簡易聊天室 說在前面效果展示websocketwebsocket的由來websocket的特點 vue前端靜態結構效果代碼 點擊切換用戶以及該用戶高亮實現思路效果展示 發送消息功能效果展示 連接服務端 Nodejs服務器端實現步驟代碼 說在前面 在學習計算機網絡的時候&#xff0c;看到了websocket這個…

【免費】2005-2019年各地級市綠色專利申請量數據

2005-2019年各地級市綠色專利申請量數據 1、時間2005-2019年 2、來源&#xff1a;國家知識產權局 3、指標&#xff1a;省份、城市、年份、綠色發明專利申請量、綠色實用新型專利申請量 4、范圍&#xff1a;360地級市 5、指標解釋&#xff1a;綠色專利是指涉及環保、新能源…

架構師面試(二十六):系統拆分

問題 今天我們聊電商系統實際業務場景的問題&#xff0c;考查對業務系統問題的分析能力、解決問題的能力和對系統長期發展的整體規劃能力。 一電商平臺在早期階段業務發展迅速&#xff0c;DAU在 10W&#xff1b;整個電商系統按水平分層架構進行設計&#xff0c;包括【入口網關…

2. Qt界面文件原理

本節主要介紹ui文件如何與窗口關聯&#xff0c;并通過隱式連接方式顯示對話框 本文部分ppt、視頻截圖原鏈接&#xff1a;[萌馬工作室的個人空間-萌馬工作室個人主頁-嗶哩嗶哩視頻] 1 UI文件如何與窗口關聯 1.1 mainwindow.cpp的頭文件ui_mainwindow.h 根據編譯原理的基本規…

雅思大作文寫作——詞伙、簡單句、并列句的使用

詞伙是一些可以表達我們常用觀點的單詞組合,這個組合可能不只是2-3個單詞,也可能是很多單詞組成的一個短句。 一、詞伙使用 1. 不要中譯英 2. 重視詞伙,而非單詞 如何替換表達 1. 如果要替換的是一個名詞,如students,則有下面的一些方法: A. 使用替換詞或者詞組:y…

?算法OJ?滑動窗口最大值【雙端隊列(deque)】Sliding Window Maximum

文章目錄 雙端隊列(deque)詳解基本特性常用操作1. 構造和初始化2. 元素訪問3. 修改操作4. 容量操作 性能特點時間復雜度&#xff1a;空間復雜度&#xff1a; 滑動窗口最大值題目描述方法思路解決代碼 雙端隊列(deque)詳解 雙端隊列(deque&#xff0c;全稱double-ended queue)是…

電機的了解到調試全方面講解

一、什么是電機 電機是一種將電能轉換為機械能的裝置,通常由定子、轉子和電磁場組成。 當電流通過電機的繞組時,產生的磁場會與電機中的磁場相互作用,從而使電機產生旋轉運動。電機廣泛應用于各種機械設備和工業生產中,是現代社會不可或缺的重要設備之一。 常見的電機種…

分布式微服務系統架構第97集:JVM底層原理

加群聯系作者vx&#xff1a;xiaoda0423 倉庫地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ JVM 內存結構 Java 虛擬機的內存空間分為 5 個部分&#xff1a; 程序計數器 Java 虛擬機棧 本地方法棧 堆 方法區 JDK 1.8 同 JDK 1.7 比&…

制定大運維管理體系的標準、流程、機制、規范

規劃并制定大運維管理體系的標準、流程、機制、規范&#xff0c;對于確保平臺的可用性和穩定性至關重要。這一過程涉及從頂層設計到具體執行的全面考量&#xff0c;需要綜合考慮業務需求、技術架構、團隊能力等多方面因素。以下是一個基本框架&#xff0c;用于指導如何構建有效…