效果如下,就算有一些不一样也是能够匹配成功的,但是大小必须一样,不能是缩小或者放大后的图片,不然无法匹配成功

7f7bcc8a6ff7bb038c86cff96d93d3e1.png

1acd0364a655a3d76793bc4097cff83c.png

最亮的代表最优匹配

d33e54887e23af5bda8e187c803ac21e.png

最暗的地方代表最优匹配

814a65c87d1b867513abfa6ae51fee36.png

使用不同的函数计算匹配程度,有的函数值越大匹配程度越高,有的相反,注意下

import cv2

img = cv2.imread('img.png')

part = cv2.imread('part_big.png')

cv2.imshow('img', img)

cv2.imshow('part', part)

methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED]

part_height, part_weight = part.shape[:2]

print(part_height, part_weight)

for method in methods:

# print(method)

result = cv2.matchTemplate(img, part, method)

# print(result)

# 根据不同的公式计算不同的值

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

print(min_val, max_val, min_loc, max_loc)

# 根据不同的算法,选择匹配程度最大的区域

if method == cv2.TM_SQDIFF_NORMED:

# 该算法值越小,匹配程度越高

img_loc = min_loc

else:

img_loc = max_loc

br = (img_loc[0] + part_weight, img_loc[1] + part_height)

cv2.rectangle(img, img_loc, br, (0, 0, 255), 2)

cv2.imshow("match" + str(method), img)

cv2.imshow("res" + str(method), result)

cv2.waitKey(1000)

cv2.waitKey(0)

计算出来的位置都差不多

0.030255908146500587 1.0 (712, 505) (1455, 590)

0.6245771050453186 0.9769605994224548 (488, 713) (712, 505)

-0.43960249423980713 0.8634197115898132 (1386, 614) (712, 505)

转载至链接:https://my.oschina.net/ahaoboy/blog/1919982

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐