07 计算机视觉-opencv模板匹配
发布日期:2021-06-29 15:45:46 浏览次数:3 分类:技术文章

本文共 2157 字,大约阅读时间需要 7 分钟。

import cv2import numpy as npimport matplotlib.pyplot as plt%matplotlib inline

模板匹配

模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv里有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)

# 模板匹配img = cv2.imread("lena.jpg",0)template = cv2.imread("face.jpg",0)h,w = template.shape[:2]
img.shape
(263, 263)
template.shape
(110, 85)
  • TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
  • TM_CCORR:计算相关性,计算出来的值越大,越相关
  • TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
  • TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
  • TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
  • TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关

公式:

methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)res.shape
(154, 179)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
min_val
39168.0
max_val
74403584.0
min_loc
(107, 89)
max_loc
(159, 62)
for meth in methods:    img2 = img.copy()    # 匹配方法的真值    method = eval(meth)    print (method)    res = cv2.matchTemplate(img, template, method)    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)    # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:        top_left = min_loc    else:        top_left = max_loc    bottom_right = (top_left[0] + w, top_left[1] + h)    # 画矩形    cv2.rectangle(img2, top_left, bottom_right, 255, 2)    plt.subplot(121), plt.imshow(res, cmap='gray')    plt.xticks([]), plt.yticks([])  # 隐藏坐标轴    plt.subplot(122), plt.imshow(img2, cmap='gray')    plt.xticks([]), plt.yticks([])    plt.suptitle(meth)    plt.show()
4

[外链图片转存失败(img-lvEkxpEO-1565702553022)(output_14_1.png)]

5

[外链图片转存失败(img-suZ3jcG0-1565702553023)(output_14_3.png)]

2

[外链图片转存失败(img-tSzrpy5i-1565702553024)(output_14_5.png)]

3

[外链图片转存失败(img-f3EM5l8x-1565702553025)(output_14_7.png)]

0

[外链图片转存失败(img-KeITxq6I-1565702553026)(output_14_9.png)]

1

[外链图片转存失败(img-ZakQ24PB-1565702553028)(output_14_11.png)]

匹配多个对象

img_rgb = cv2.imread('mario.jpg')img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template = cv2.imread('mario_coin.jpg', 0)h, w = template.shape[:2]res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)threshold = 0.8# 取匹配程度大于%80的坐标loc = np.where(res >= threshold)for pt in zip(*loc[::-1]):  # *号表示可选参数    bottom_right = (pt[0] + w, pt[1] + h)    cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)cv2.imshow('img_rgb', img_rgb)cv2.waitKey(0)cv2.destroyAllWindows()plt.imshow(img_rgb)

[外链图片转存失败(img-O4RydjTr-1565702553029)(output_16_1.png)]

转载地址:https://codingchaozhang.blog.csdn.net/article/details/99477862 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:08 计算机视觉-opencv直方图与傅里叶变换
下一篇:06 计算机视觉-opencv图像金字塔与轮廓检测

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月30日 10时29分33秒