2.2 多目标匹配
多目标匹配,即在目标图像中匹配出所有与模板图像匹配的结果。可以使用相关匹配或相关系数匹配。
素材准备
还以原图像"test.png"为参照,
为了产生方便我们做示例的图像,我们在该图像的基础上多加一盏电灯,生成"test2.png"
import cv2 img = cv2.imread("test.png") templ = cv2.imread("template_pic1.jpg") img[20:220, 30:190, :] = templ cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows() cv2.imwrite('test2.png', img)
多目标匹配
多目标匹配即对matchTemplate()匹配的总的结果,的计算情况数据,使用for循环遍历,并设定一个判断标准。
如使用标准相关系数(cv2.TM_CCOEFF_NORMED)的方法判断,如:如果计算值大于0.99,则我们认为匹配成功了。
使用电灯模板"template_pic1.jpg",匹配图像test2.png。并对匹配的结果用红色的矩形框标记。
代码示例如下:
import cv2 img = cv2.imread("test2.png") templ = cv2.imread("template_pic1.jpg") height, width, c = templ.shape # 按照标准相关系数匹配 results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED) for y in range(len(results)): for x in range(len(results[y])): if results[y][x] > 0.99: cv2.rectangle(img, (x, y), (x + width, y + height), (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
程序执行结果如下,成功匹配出了两盏灯。
3.多模板匹配
多模板匹配,即进行了n次单模板的匹配过程。
直接上示例:
在test.png中匹配电灯、青龙刀、虎牢关牌匾、关云长四个图像模板:
import cv2 def myMatchTemplate(img, templ): height, width, c = templ.shape results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED) loc = list() for i in range(len(results)): for j in range(len(results[i])): if results[i][j] > 0.99: loc.append((j, i, j + width, i + height)) return loc # 读取原始图像 img = cv2.imread("test.png") # 模板列表 templs = list() templs.append(cv2.imread("template_pic1.jpg")) templs.append(cv2.imread("template_pic2.jpg")) templs.append(cv2.imread("template_pic3.jpg")) templs.append(cv2.imread("template_pic4.jpg")) loc = list() for t in templs: loc += myMatchTemplate(img, t) # 遍历所有红框的坐标 for i in loc: cv2.rectangle(img, (i[0], i[1]), (i[2], i[3]), (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
匹配效果如下: