Python之利用opecv影像識別 (模板匹配)
- 2019 年 10 月 8 日
- 筆記
這是一個相對好玩的,你可以利用影像識別做很多事情,但是這種模板匹配的方法是相對比較笨的方法,對於我正在學習的神經網路所實現的影像識別來說,模板匹配的健壯性不是很好,不過還是有很多事情可以用模板匹配做到的。
模板匹配的意思是,拿兩張圖片,或者是一張大圖一張小圖,在大圖中判斷有沒有類似小圖的像素,如果有則匹配的上,反則沒有匹配,大致就像,有一張模板圖片,然後一張測試圖片,拿著模板圖片在測試圖片中找相同的地方。

例如,這樣一張圖作為模板匹配在判斷的時候,如果測試人物左轉一下,便判斷不出來。
opencv作為模板匹配的方法有很多種:
CV_TM_SQDIEF平方差匹配法,最好匹配為0,值越大匹配越差
CV_TM_SQDIEF_NORMED歸一化平方差匹配法
CV_TM_CCORR相關匹配法,採用乘法操作,數值越大表明匹配越好
CV_TM_CCORR_NORMED歸一化相關匹配法
CV_TM_CCOEFF相關係數匹配法,最好匹配為1,最差為-1
CV_TM_CCOEFF_NORMED歸一化相關係數匹配法
尋找最值–minMaxLoc()
minVal:返回最小值的指針,若無需返回,則設置0
maxVal:返回最大值的指針,若無需返回,則設置0
minLoc:返回最小位置的指針,若無需返回,則設置0
maxLoc:返回最大位置的指針,若無需返回,則設置0
img_m = ImageGrab.grab()#桌面截圖 img_c = cv2.cvtColor(np.asarray(img_m), cv2.COLOR_RGB2BGR)#轉化成cv2的模式 os.chdir('C:/Users/煒哥/PycharmProjects/Dnf/Monsterpic/')#取出模板圖片 img_l = ac.imread("monster_1.png")#讀取模板圖片 mmaxpos = cv2.matchTemplate(img_c, img_l, cv2.TM_CCOEFF_NORMED)#匹配的結果 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(mmaxpos)#在結果中取出坐標 pt = max_loc mminpos = cv2.matchTemplate(img_c, img_l, cv2.TM_SQDIFF_NORMED)#第二種方式匹配 nmin_val, nmax_val, nmin_loc, nmax_loc = cv2.minMaxLoc(mminpos) minpt = nmin_loc if pt == minpt: print(pt) print(minpt) return pt else: return None
上面例子實現的在模板圖片與桌面截圖的匹配,從而判斷截圖中的遊戲介面里有沒有怪物存在,其中利用了兩種方法的匹配,然後比較其結果有沒有一樣,如果一樣則輸出坐標(這個坐標是左上角的坐標,再具體操作的話需要減去模型的x或y,便可以得到想要的坐標)
不同的方法的坐標放在不一樣的值里。
其中opencv模板匹配函數matchTemplate()
drawpos = cv2.matchTemplate(img_d1, imgdraw, cv2.TM_CCOEFF_NORMED)
其中,img_d1是測試圖片,就是想要從中判斷有沒有模板圖片的圖片,即上面程式的截圖位置
imgdraw:是模板圖片,假設我們要從A圖片中判斷有沒有B圖片,這個B圖片就是模板圖片
cv2.TM_CCOEFF_NORMED:即是我們的匹配方法。
如果想要取出坐標的x和y
(x, y) = pt#結合上面例子
這樣即可
補充:
如果沒加一個導入模組的類的話,發現很容易誤導,我太粗心了。

這裡的影像識別是必須在介面的前台的,因為是截圖的,如果編輯器擋住要判斷的部分是的不出結果的。