我的開源專案SimpleRPA裡面,一直使用aircv的find_template方法來做影像匹配,最常見的場景就是從螢幕截圖中,查詢預先截好的小圖,來確定下一步滑鼠點選的位置:
比如在下面的釘釘PC端主頁面中:
我們來查詢企業logo的位置:
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)
這個find_template方法只返回一個最可信的結果,如果源圖中有多個模板圖,都想找回來
那麼需要find_all_template函式,引數完全一樣,只是返回值是個match_result陣列。
但是這個庫很久沒有維護了,我給它提交了一個PR,也沒人理,還是有一些坑的,以後再慢慢聊。