OpenCV 模板匹配
最近小編實(shí)現(xiàn)一個(gè)微信小程序「跳一跳」的自動(dòng)化。
主要涉及到了OpenCV的模板匹配和邊緣檢測(cè)技術(shù),以及Android開(kāi)發(fā)調(diào)試工具ADB。
如果放在一起說(shuō),感覺(jué)內(nèi)容有些多。
所以,分三期來(lái)講,也能多了解一些東西。
首先介紹模板匹配,然后邊緣檢測(cè),最后結(jié)合ADB實(shí)現(xiàn)「跳一跳」自動(dòng)化。
游戲雖然過(guò)時(shí)了,但是拿來(lái)練練手還是不錯(cuò)的。
編程就該是快樂(lè)的,哈哈。
/ 01 / 模板匹配
模板匹配,就是在整個(gè)圖像區(qū)域里發(fā)現(xiàn)與給定子圖像相匹配的小塊區(qū)域。
這里需要一個(gè)模板圖像(給定的子圖像)和一個(gè)待檢測(cè)的圖像(原圖像)。
在待檢測(cè)圖像上,從左向右,從上向下計(jì)算模板圖像與重疊子圖像的匹配度,匹配度越大,兩者相同的可能性越大。

這里主要涉及OpenCV的cv2.matchTemplate()和cv2.minMaxLoc()函數(shù)。
第一個(gè)函數(shù)作用是在模板和輸入圖像之間尋找匹配,獲得匹配結(jié)果圖像。
第二個(gè)函數(shù)的作用則是在給定的矩陣中尋找最大和最小值(包括它們的位置)。
其中模板匹配算法有以下六種。
# 第一類,利用平方差來(lái)進(jìn)行匹配,最好匹配為0.匹配越差,匹配值越大 # 平方差匹配 method=CV_TM_SQDIFF # 標(biāo)準(zhǔn)平方差匹配 method=CV_TM_SQDIFF_NORMED # 第二類,采用模板和圖像間的乘法操作,所以較大的數(shù)表示匹配程度較高,0標(biāo)識(shí)最壞的匹配效果 # 相關(guān)匹配 method=CV_TM_CCORR # 標(biāo)準(zhǔn)相關(guān)匹配 method=CV_TM_CCORR_NORMED # 第三類,將模版對(duì)其均值的相對(duì)值與圖像對(duì)其均值的相關(guān)值進(jìn)行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示沒(méi)有任何相關(guān)性(隨機(jī)序列) # 相關(guān)系數(shù)匹配 method=CV_TM_CCOEFF # 標(biāo)準(zhǔn)相關(guān)系數(shù)匹配 method=CV_TM_CCOEFF_NORMED
標(biāo)準(zhǔn)化意味著將數(shù)值統(tǒng)一到0~1。
除了平方差類型的是值越小越好,其他的都是值越大越好。
/ 02 / 圖像檢索
首先來(lái)看一下兩張圖像,都為灰度圖。
import cv2
# 讀取待檢測(cè)圖像
img = cv2.imread('game.png', 0)
# 讀取模板圖像
temple = cv2.imread('temple.png', 0)
# 顯示灰度處理后的待檢測(cè)圖像
cv2.namedWindow('sample', 0)
cv2.resizeWindow('sample', 400, 600)
cv2.imshow('sample', img)
# 顯示灰度處理后的模板圖像
cv2.namedWindow('target', 0)
cv2.resizeWindow('target', 400, 600)
cv2.imshow('target', temple)
輸出結(jié)果如下。

第一張為模板圖像,第二張為待檢測(cè)圖像。
下面使用OpenCV的兩個(gè)函數(shù),來(lái)實(shí)現(xiàn)模板匹配。
# 獲取模板圖像的高和寬
th, tw = temple.shape[:2]
print(th, tw)
# 使用標(biāo)準(zhǔn)相關(guān)系數(shù)匹配,1表示完美匹配,-1表示糟糕的匹配,0表示沒(méi)有任何相關(guān)性
result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED)
# result為匹配結(jié)果矩陣
# print(result)
# TM_CCOEFF_NORMED方法處理后的結(jié)果圖像
cv2.namedWindow('match_r', 0)
cv2.resizeWindow('match_r', 400, 600)
# 顯示窗口
cv2.imshow('match_r', result)
# 使用函數(shù)minMaxLoc,確定匹配結(jié)果矩陣的最大值和最小值(val),以及它們的位置(loc)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 此處選取最大值的位置,為圖像的左上角
tl = max_loc
# 獲取圖像的右下角
br = (tl[0]+tw, tl[1]+th)
# 繪制矩形框
cv2.rectangle(img, tl, br, (0, 0, 255), 2)
# 設(shè)置顯示窗口
cv2.namedWindow('match', 0)
cv2.resizeWindow('match', 400, 600)
# 顯示窗口
cv2.imshow('match', img)
# 結(jié)束
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結(jié)果如下。

第一張圖中最白的位置,即代表著最高的匹配。
第二張圖中,矩形框則代表著匹配到的結(jié)果。
通過(guò)矩形框的位置參數(shù),結(jié)合模板圖像的大小,便可得到小跳棋中心點(diǎn)位置(底部)。
/ 03 / 總結(jié)
現(xiàn)在既然能檢測(cè)到「跳一跳」小跳棋的位置,那么下一步就是方塊的位置啦。
相關(guān)文章
關(guān)于python的mmh3庫(kù)安裝以及使用詳解
這篇文章主要介紹了關(guān)于python的mmh3庫(kù)安裝以及使用詳解,哈希方法主要有MD、SHA、Murmur、CityHash、MAC等幾種方法,mmh3全程murmurhash3,是一種非加密的哈希算法,常用于hadoop等分布式存儲(chǔ)情境中,需要的朋友可以參考下2023-07-07
利用Python2下載單張圖片與爬取網(wǎng)頁(yè)圖片實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用Python2下載單張圖片與爬取網(wǎng)頁(yè)圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
python?keras構(gòu)建和訓(xùn)練模型簡(jiǎn)便性初探
這篇文章主要介紹了python?keras構(gòu)建和訓(xùn)練模型簡(jiǎn)便性初探,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
18個(gè)Python入門(mén)經(jīng)典必背的程序分享
這篇文章主要為大家介紹了Python入門(mén)經(jīng)典必背的18個(gè)程序。注意:這是初學(xué)者要牢記的 18 個(gè)代碼,入門(mén)之后就簡(jiǎn)單了,快跟隨小編一起來(lái)學(xué)習(xí)一下吧2023-02-02
Python Web框架Flask下網(wǎng)站開(kāi)發(fā)入門(mén)實(shí)例
這篇文章主要介紹了Python Web框架Flask下網(wǎng)站開(kāi)發(fā)入門(mén)實(shí)例,本文實(shí)現(xiàn)了一個(gè)注冊(cè)頁(yè)面、登錄頁(yè)面和上傳頁(yè)面,需要的朋友可以參考下2015-02-02

