简介
模板匹配:模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与当前图形被模板覆盖的地方的差别程度,然后将每次计算的结果放入一个矩阵,作为结果输出。假如原图形是A*B大小,而模板是a*b大小,则输出结果的矩阵是(A-a+1)*(B-b+1)
计算模板和图像差别程度的六种方法
1.TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
2.TM_CCORR:计算相关性,计算出来的值越大,越相关
3. TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
4.TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
5.TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
6.TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
OpenCV函数模型
cv.matchTemplate(image,template,method)
参数解释
image | 用于搜索的输入图像 |
template | 用于匹配的模板 |
method | 用于比较的方法,可选以下六种 TM_SQDIFF:计算平方不同,计算出来的值越小,越相关 TM_CCORR:计算相关性,计算出来的值越大,越相关 TM_CCOEFF:计算相关系数,计算出来的值越大,越相关 TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关 TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关 TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关 |
返回值
返回值为一个二维数组,是原图像各区域与模板的匹配值
经常配套使用的函数
获取最佳匹配区域的位置
cv.minMaxLoc(res)
返回cv.matchTemplate函数返回值中的最大值,最小值,最大值对应区域左上角坐标,最小值对应区域左上角坐标
注:res为cv.matchTemplate函数的返回值
将最佳匹配区域用矩形圈出
cv.rectangle(img2, top_left, bottom_right, 255, 2)
关于该函数的具体信息可参考python-OpenCV之轮廓的查找,绘制,特征,近似,外接矩形中关于外接矩形的内容。
代码示例
import cv2 as cv
img = cv.imread('lena.jpg', 0)
template = cv.imread('lenaface.jpg', 0)
h, w = template.shape[:2]
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR', 'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF',
'cv.TM_SQDIFF_NORMED']
for meth in methods:
img2 = img.copy()
# 匹配方法在methods数组中的的序号
method = eval(meth)
res = cv.matchTemplate(img, template, method)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 画矩形
cv.rectangle(img2, top_left, bottom_right, 255, 2)
# 显示出来
cv.imshow(meth + str('_rec'), img2)
cv.waitKey()
cv.destroyAllWindows()
模板匹配的直接结果(res)与添加矩形后的效果(img2)