模板匹配
模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与图像窗口的差异程度,然后将每次计算的结果放入一个矩阵,最后作为结果输出。假设原图像大小为A * B,模板大小为a * b,则输出结果的矩阵为(A-a+1)*(B-b+1)。
OpenCV中有6种计算差异的方法:
- TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
- TM_CCORR:计算相关性,计算出来的值越大,越相关
- TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
- TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
- TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
- TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
img = cv2.imread('F:/huli.jpg')
template = cv2.imread('F:/000.jpg')
shape = template.shape
h, w = shape[0], shape[1]
# 第一个参数为原图像,第二个参数为模板,第三个参数为相似度量方法
# 返回一个存储了若干相似度量结果的矩阵R,矩阵R中的每一个值表示模板与图像窗口的相似度量结果
# 平方差或归一化平方差取最小值,即矩阵R中的最小值;其他方法取最大值
result = cv2.matchTemplate(img, template, cv2.TM_SQDIFF) # 得到相似度量矩阵R
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 分别返回矩阵R中的最小值、最大值以及最小值和最大值在矩阵R中的坐标
left_top = min_loc
res = cv2.rectangle(img, left_top, (left_top[0]+w, left_top[1]+h), 255, 2)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', res)
cv2.waitKey(0)
cv2.destroyAllWindows()