影像匹配(大圖中找小圖)最簡單方法:aircv之find_template

songofhawk發表於2021-12-24

我的開源專案SimpleRPA裡面,一直使用aircv的find_template方法來做影像匹配,最常見的場景就是從螢幕截圖中,查詢預先截好的小圖,來確定下一步滑鼠點選的位置:

比如在下面的釘釘PC端主頁面中:
dingding

我們來查詢企業logo的位置:
tzding_logo_on_dingding.png

aircv是網易維護的一個小專案,裡面有幾個影像處理工具函式,它的安裝很簡單:

pip install aircv

其中被使用最多的,就是這個find_template方法,基本用法如下:

import aircv as ac

match_result = ac.find_template(image_origin, image_template, threshold, bgremove)

幾個引數分別表示

  • image_origin:被查詢的源圖(上面例項中的釘釘主頁面截圖),要注意源圖的寬和高,都必須大於或等於模板圖
  • image_template:要查詢的模板小圖(上面例項中的logo)
  • threshold:最小置信度,在0到1之間。因為影像匹配並不需要每個畫素精確一致,可以模糊匹配,所以這個值設定得越高,找到的區域就越接近模板圖,但設得太高就有可能找不到。
  • bgremove:是否去除背景。如果這個值設定為True,那麼函式內部會用Canny運算元先提取影像輪廓,再做查詢

返回值match_result是個dict結構:

match_result:{
    'result': (x,y),        #tuple,表示識別結果的中心點
    'rectangle':[            #二位陣列,表示識別結果的矩形四個角
        [left, top],
        [left, bottom],
        [right, top],
        [right, bottom]
    ],
    'confidence': percentage   #識別結果的置信度,在0-1之間,越大越精準
}

這樣我們就可以用返回值在圖片上標出矩形框的位置:

import cv2
rect = match_result['rectangle']
cv2.rectangle(img_result, (rect[0][0], rect[0][1]), (rect[3][0], rect[3][1]), (0, 0, 220), 2)

dingding_found

這個find_template方法只返回一個最可信的結果,如果源圖中有多個模板圖,都想找回來
那麼需要find_all_template函式,引數完全一樣,只是返回值是個match_result陣列。

但是這個庫很久沒有維護了,我給它提交了一個PR,也沒人理,還是有一些坑的,以後再慢慢聊。

相關文章