­

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#結合上面例子

這樣即可


補充:

如果沒加一個導入模組的類的話,發現很容易誤導,我太粗心了。

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