查找多个匹配的一种方法是覆盖找到的匹配并再次运行匹配。Edit: A better找到多个匹配的方法是重写results。在第一个示例中,我们用零填充结果的匹配部分(对 SQDIFF 或 CCORR_NORMED 使用零),然后在循环中查找下一个匹配项。
import cv2
import numpy as np
import time
image = cv2.imread('smiley.png', cv2.IMREAD_COLOR )
template = cv2.imread('template.png', cv2.IMREAD_COLOR)
h, w = template.shape[:2]
method = cv2.TM_CCOEFF_NORMED
threshold = 0.90
start_time = time.time()
res = cv2.matchTemplate(image, template, method)
# fake out max_val for first run through loop
max_val = 1
while max_val > threshold:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
if max_val > threshold:
res[max_loc[1]-h//2:max_loc[1]+h//2+1, max_loc[0]-w//2:max_loc[0]+w//2+1] = 0
image = cv2.rectangle(image,(max_loc[0],max_loc[1]), (max_loc[0]+w+1, max_loc[1]+h+1), (0,255,0) )
cv2.imwrite('output.png', image)
输入图像:
使用眼睛作为模板图像(因为有不止一只眼睛!)
output:
这是我通过在图像上书写来实现的原始方法。这种方式要慢得多,因为我们执行 n+1matchTemplate
n 个匹配的操作。经过测量,这种技术慢了 1000 倍。
import cv2
import numpy as np
image = cv2.imread('smiley.png', cv2.IMREAD_COLOR )
template = cv2.imread('template.png', cv2.IMREAD_COLOR)
h, w = template.shape[:2]
method = cv2.TM_CCOEFF_NORMED
threshold = 0.95
# fake out max_val for first run through loop
max_val = 1
while max_val > threshold:
res = cv2.matchTemplate(image, template, method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# using top ranked score, fill in that area with green
image[max_loc[1]:max_loc[1]+h+1:, max_loc[0]:max_loc[0]+w+1, 0] = 0 # blue channel
image[max_loc[1]:max_loc[1]+h+1:, max_loc[0]:max_loc[0]+w+1, 1] = 255 # green channel
image[max_loc[1]:max_loc[1]+h+1:, max_loc[0]:max_loc[0]+w+1, 2] = 0 # red channel
cv2.imwrite('output.png', image)
输出图像: