[python opencv 計算機視覺零基礎到實戰] 十一找到圖片中指定內容

一、學習目標

  1. 了解圖片內容定位方法matchTemplate使用
  2. 了解minMaxLoc方法使用

上一篇《[python opencv 計算機視覺零基礎到實戰] 十、圖片效果毛玻璃》
如有錯誤歡迎指出~

二、了解從一張圖片中找到指定內容的方法

2.1 使用matchTemplate函數對圖片中的指定內容進行查找

有小伙伴可能用過一些輔助軟件,幫助我們從一些游戲中找到固定像素,并且去對該像素位置進行點擊,隨后解放雙手。今天這一節所講解的就是與這個功能相關的內容,對圖像中的指定圖形元素進行查找,并且選中該元素。

我們所使用的方法是matchTemplate。matchTemplate主要是一種匹配方法,通過判斷物體在一張圖片中的什么位置,從而進行定位,如下圖所示:
matchTemplate將會在對像素點進行匹配,匹配相似度越大,則確定該位置為目標。這個方法有一定局限性,在原圖中若目標圖片發生了旋轉等變化,那么將會查找失敗。

matchTemplate有幾種匹配算法,分別是TM_SQDIFF平方差匹配、TM_CCORR相關性匹配以及TM_CCOEFF相關性系數匹配。TM_SQDIFF平方差匹配是平方差匹配,最佳匹配值為0,若不佳則匹配值會越大;TM_CCORR是由原圖和目標圖像做乘法,值越高匹配越佳,反之越差,0為最差;TM_CCOEFF是將模版對其均值相對值與圖像對其均值相關值進行匹配,最佳匹配為1,0表示完全匹配不到,-1則表示有匹配,但是精確度不高。以上內容了解即可,對于初學者來說就知道就行,不理解也不妨礙我們現階段使用該API進行開發。
matchTemplate函數原型為:

matchTemplate(img, tpl, method[, result[, mask]])

matchTemplate中參數img為目標圖像,tpl為原圖,method是所使用的匹配算法,result是匹配結果圖像。
我們首先引入所需庫:

import cv2
import numpy as nptarget = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
tpl = cv2.imread(r'C:\Users\mx\Desktop\1target.png')

以上代碼中引入了目標圖片target與原圖tpl。隨后我們使用TM_SQDIFF_NORMED匹配方法對圖像進行匹配。
接下來獲取目標圖片的寬高:

th, tw = tpl.shape[:2]

目標圖片如下:

隨后傳入參數至matchTemplate方法中:

result = cv2.matchTemplate(target, tpl, cv2.TM_SQDIFF_NORMED)

接下來我們需要使用一個方法minMaxLoc。minMaxLoc方法是在一個矩陣中尋找最大值和最小值,并且得到最大值最小值的索引。若有一個矩陣為[[1,2,3,4],[5,11,7,8]],名為a,傳入到 方法后,代碼如下:

min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(a)
print(min_val,max_val,min_loc,max_loc)

最終結果將是:

1.0 11.0 (0, 0) (1, 1)

我們接下來使用minMaxLoc獲取matchTemplate算出來的計算結果,由于我們使用的方法是TM_SQDIFF_NORMED,那么將獲取最低值進行目標獲取。代碼如下:

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
tl = min_loc

接下來我們使用rectangle對所需要的部分進行繪圖。rectangle接收五個參數,分別是image圖片、start_point起始坐標、end_point結束坐標、color顏色、thickness線條粗細。我們就常規使用前4個參數就ok了。
接下來我們使用最小的坐標加上目標圖片的寬高就可以知道繪制區域了:

br = (tl[0] + tw, tl[1] + th)

最終完整的代碼如下:

import cv2
import numpy as nptarget = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
tpl = cv2.imread(r'C:\Users\mx\Desktop\1target.png')
th, tw = tpl.shape[:2]result = cv2.matchTemplate(target, tpl, cv2.TM_SQDIFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
tl = min_loc
br = (tl[0] + tw, tl[1] + th)
cv2.rectangle(target, tl, br, [0, 255, 0])
cv2.imshow("target", target)cv2.waitKey(0)
cv2.destroyAllWindows()

結果如下:

2.2 深入了解matchTemplate函數

matchTemplate函數的查找方式我們可以通過matchTemplate函數所返回的結果進行查看,修改代碼如下:

import cv2
import numpy as nptarget = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
tpl = cv2.imread(r'C:\Users\mx\Desktop\1target.png')
methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED]
th, tw = tpl.shape[:2]result = cv2.matchTemplate(target, tpl, cv2.TM_SQDIFF_NORMED)cv2.imshow("result", result)cv2.waitKey(0)
cv2.destroyAllWindows()

我們以上代碼直接顯示了result結果,由于為了演示效果,最理想狀態是扣選出來的圖片,所以我使用了原圖進行目標圖像的選取。

tpl=target[200:400,280:450]

并且使用了methods列表存儲了匹配方法TM_SQDIFF_NORMED、TM_CCORR_NORMED、TM_CCOEFF_NORMED。之后使用了遍歷依次使用這些方法對目標圖片進行匹配。但是由于不同的方法高地值表示不懂的匹配效果,在此使用了if語句判斷不同的方法取不同的高低值:

if md == cv2.TM_SQDIFF_NORMED:tl = min_locelse:tl = max_loc

修改了目標圖,為了有更好的對比,目標圖如下:

結果如下:

以上我展示了一種方法的結果圖,其它方法由于我選擇的目標圖有太多相似的區域,所以這張圖是一種較為理想的想過。可以看到在黃色箭頭選擇的區域有明顯的高亮位置,該位置則是我們進行目標匹配后的結果位置。其實在進行匹配時,這個過程就類似于是卷積。
該系列文章首發于ebaina

三、總結

  1. 目標匹配方法matchTemplate的使用方法
  2. 了解了matchTemplate方法有3中匹配方式,依次是TM_SQDIFF_NORMED、TM_CCORR_NORMED、TM_CCOEFF_NORMED
  3. 了解了不同匹配方法之間高低值有不同的依據結果

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

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

相關文章

Linq 實現 DataTable 行轉列

前幾天寫了一篇sqlserver 行轉列,http://www.cnblogs.com/li-peng/archive/2012/02/01/2334973.html 由于工作需要,要把查出來的DataTable實現 行轉列, 正好這一陣子在用Linq 就做了一個行轉列的小例 子 轉換前的table: 轉換后的table: 代碼…

Android Studio之編譯提示\app\src\main\res\values\colors.xml:1:1 Error:前言有不允許的內容

1 問題 Android Studio新建立的項目運行莫名其妙提示錯誤如下 app\src\main\res\values\colors.xml:1:1 Error:前言有不允許的內容 然后我把res目錄下面的colors.xml文件打開看如下 <?xml version"1.0" encoding"utf-8"?> <resources>&l…

python順序執行 toggle_編寫腳本在Python中運行多個腳本

我正在建一個鬧鐘項目。誰能告訴我如何編寫一個腳本來調用所有其他腳本嗎。例如&#xff0c;我在我的樹莓派上有三個腳本叫做LCDTESTFORPI.py&#xff0c;另一個叫做“ex 7”分段.py“還有一個叫”報警pi.py”. 我希望能夠運行一個名為“alarmpi”的腳本_初始py“它將運行所有其…

AndroidService 深度分析(2)

AndroidService 深度分析&#xff08;2&#xff09; 上一篇文章我們Service的生命周期進行了測試及總結。這篇文章我們介紹下綁定執行的Service的實現。 綁定執行的Service可能是僅為本應用提供服務&#xff0c;稱為本地Service。也可能為其它應用提供跨進程服務&#xff0c;即…

Hello Playwright:(3)基本概念

下面介紹一下 Playwright 中的基本概念&#xff1a;Headless 瀏覽器Playwright 需要特定版本的瀏覽器二進制文件才能運行。這些瀏覽器都支持 2 種 運行模式&#xff1a;Headless&#xff0c;無瀏覽器 UI&#xff0c;運行速度較快&#xff0c;常用于自動化運行Headed&#xff0c…

[python opencv 計算機視覺零基礎到實戰] 十二 直方圖

一、學習目標 了解matplotlib繪圖庫的使用了解如何通過折線圖或者直方圖對圖表進行繪制了解了通過圖標對圖片內容進行直觀判斷 如有錯誤歡迎指出~ 二、了解圖像直方圖及其應用 2.1 了解matplotlib庫 在了解圖像直方圖前我們需要了解一個matplotlib庫&#xff0c;matplotli…

建造者模式之項目運用

1 問題 建造者模式&#xff0c;我們也許不陌生&#xff0c;因為我們看到很多開源框架或者Android源碼里面用到&#xff0c;類似這樣的代碼結構 A a new A.builder().method1("111").method2("222").build(); 很明顯&#xff0c;一般這里的結構有builde…

專題三--1005

題目 A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the …

shell中的數字

shell中的數字 author :headsen chen date :2017-10-18 15:01:42 個人原創&#xff0c;轉載請注明作者&#xff0c;出處&#xff0c;否則依法追究法律責任 1,生成隨機數&#xff08;范圍&#xff1a;0-32767&#xff09;&#xff0c;用特殊變量&#xff1a;RANDOM 2&#xff…

serviceloader java_【java編程】ServiceLoader使用看這一篇就夠了

轉載:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少聽過spi&#xff0c;具體的解釋我就不多說了。但是它具體是怎么實現的呢&#xff1f;它的原理是什么呢&#xff1f;下面我就圍繞這兩個問題來解釋&#xff1a;實現: 其實具體的實現類就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改進

在MiniAPI系列中&#xff0c;《.NET6之MiniAPI(十八)&#xff1a;OpenAPI swagger》介紹了swagger在MiniAPI框架中的使用&#xff0c;當時留下很多不足&#xff0c;隨著.NET7 Preview4的推出&#xff0c;這方面得到了很大的改進&#xff0c;我還是使用“十八”這篇文章的案例。…

Swift - 自定義單元格實現微信聊天界面

1&#xff0c;下面是一個放微信聊天界面的消息展示列表&#xff0c;實現的功能有&#xff1a; &#xff08;1&#xff09;消息可以是文本消息也可以是圖片消息&#xff08;2&#xff09;消息背景為氣泡狀圖片&#xff0c;同時消息氣泡可根據內容自適應大小&#xff08;3&#x…

[python opencv 計算機視覺零基礎到實戰] 十三 直方圖顏色提鮮

一、學習目標 了解了均衡化的作用是什么了解灰度、YUV、彩色圖片均衡化的方法是使用什么方法了解了合并通道的方法是什么了解了分離通道的方法是什么 如有錯誤歡迎指出~ 二、了解圖像均衡化 2.1 了解直方圖均衡化 圖像直方圖均衡化主要是對圖像中的少數灰度進行壓縮&#…

java 中字符串比較方法_java中常用的字符串的比較方法(兩種)

比較字符串比較常用的兩個方法是運算符“”和String的equals方法。使用“”比較兩個字符串&#xff0c;是比較兩個對象的的“地址”是否一致&#xff0c;本質就是判斷兩個變量是否指向同一個對象&#xff0c;如果是則返回true&#xff0c;否則返回的是false。而String類的equal…

Android之稍微靠譜點的透明Activity(不獲取觸摸事件)

1 問題 實現透明的Activity(不獲取觸摸事件),就行什么也看不到,打開了透明activity,也不影響其他頁面的滑動和點擊,就行什么事情都沒發生一樣。 2 代碼實現 1)配置樣式 <style name="TestTheme" parent="Theme.AppCompat.Light"><item na…

分布式服務框架dubbo原理解析 轉

alibaba有好幾個分布式框架&#xff0c;主要有&#xff1a;進行遠程調用(類似于RMI的這種遠程調用)的(dubbo、hsf)&#xff0c;jms消息服務(napoli、notify)&#xff0c;KV數據庫(tair)等。這個框架/工具/產品在實現的時候&#xff0c;都考慮到了容災&#xff0c;擴展&#xff…

【傾情奉獻】遙感物候研究:30年長時間序列遙感數據集GIMMS 3g NDVI產品預處理完整步驟

本文為作者碩士學位論文遙感物候研究數據處理過程總結。GIMMS(Global Inventory Modelling and Mapping Studies) 3g NDVI來源于ECOCAST網站(http://ecocast.arc.nasa.gov),是由NOAA衛星搭載的AVHRR傳感器獲取的全球植被數據,空間分辨率為0.0833?,時間分辨率為15?d,一…

過早的給方法中 引用對象 設為 null 可被 GC提前回收嗎?

經常在代碼中看到有人將 null 賦值給引用類型&#xff0c;來達到讓 GC 提前回收的目的&#xff0c;這樣做真的有用嗎&#xff1f;今天我們就來研究一下。為了方便講解&#xff0c;來一段測試代碼&#xff0c;提前將 test1null &#xff0c;然后調用 GC.Collect() 看看是否能提前…