图像匹配(大图中找小图)最简单方法(aircv之find_template)
我的开源项目SimpleRPA里面,一直使用aircv的find_template方法来做图像匹配,最常见的场景就是从屏幕截图中,查找预先截好的小图,来确定下一步鼠标点击的位置:
比如在下面的钉钉PC端主页面中:
文章图片
我们来查找企业logo的位置:
文章图片
【图像匹配(大图中找小图)最简单方法(aircv之find_template)】aircv是网易维护的一个小项目,里面有几个图像处理工具函数,它的安装很简单:
pip install aircv
其中被使用最多的,就是这个find_template方法,基本用法如下:
import aircv as acmatch_result = ac.find_template(image_origin, image_template, threshold, bgremove)
几个参数分别表示
- image_origin:被查找的源图(上面实例中的钉钉主页面截图),要注意源图的宽和高,都必须大于或等于模板图
- image_template:要查找的模板小图(上面实例中的logo)
- threshold:最小置信度,在0到1之间。因为图像匹配并不需要每个像素精确一致,可以模糊匹配,所以这个值设定得越高,找到的区域就越接近模板图,但设得太高就有可能找不到。
- bgremove:是否去除背景。如果这个值设置为True,那么函数内部会用Canny算子先提取图像轮廓,再做查找
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,也没人理,还是有一些坑的,以后再慢慢聊。
推荐阅读
- 我要做大厨
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 知识
- 三十年后的广场舞大爷
- 奔向你的城市
- 村里的故事|村里的故事 --赵大头
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 汇讲-勇于突破
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议