图像匹配(大图中找小图)之新项目findimage

之前分析aircv源码的时候,还是有诸多不满,而且它也不更新维护了,提交PR也没人理,干脆做个新项目,目前已经提交PyPi库,可以用下面的命名安装:

pip install findimage

本项目不是图像搜索,不能从一堆图片中找到相似的那张,而是从一张大图中定位给定模板小图的位置。
功能 和原aircv相比,findimage有以下这些改进:
  • 支持直接传入灰度图(虽然函数内调用opencv的时候,都是使用灰度图完成的,原aircv项目却要求传入的图片必须包含bgr三个通道,不然会报错)
  • 支持背景透明的图片
  • 优化了find_all_template方法的性能,用numpy的切片赋值代替floodFill方法来避免重叠,大概会缩短1/4的总体查找时间
示例 比如我们对“思否”课程菜单截图如下:
图像匹配(大图中找小图)之新项目findimage
文章图片

我们想从中找到#的位置,可以提供一张小模板图:
图像匹配(大图中找小图)之新项目findimage
文章图片

然后调用find_template方法:
from cv2 import cv2 from findimage import find_templateimage_origin = cv2.imread('seg_course_whole_page.png') image_template = cv2.imread('seg_sharp.png')match_result = find_template(image_origin, image_template)

得到的match_result,标识了第一个#在源图中的中心点位置,矩形区域四角坐标 和 匹配度。
{ "result": (x,y),#tuple,表示识别结果的中心点 "rectangle":[#二位数组,表示识别结果的矩形四个角 [left, top], [left, bottom], [right, top], [right, bottom] ], "confidence": percentage#识别结果的匹配度,在-1~1之间,越大匹配度越高, 如果为1,表示按像素严格匹配 }

我们可以用这个结果,在源图上标识出匹配的位置:
img_result = image_origin.copy() rect = match_result['rectangle'] cv2.rectangle(img_result, (rect[0][0], rect[0][1]), (rect[3][0], rect[3][1]), (0, 0, 220), 2) cv2.imwrite('result.png', img_result)

【图像匹配(大图中找小图)之新项目findimage】结果如下图所示:
图像匹配(大图中找小图)之新项目findimage
文章图片

    推荐阅读