首页 > 其他分享 >opencv学习笔记(九)

opencv学习笔记(九)

时间:2023-06-24 10:33:24浏览次数:41  
标签:NORMED 匹配 image cv2 笔记 学习 opencv TM 归一化

模板匹配:
在模板匹配中,我们引入函数cv2.matchTemplate()函数来执行模板匹配的操作

res = cv2.matchTemplate(image, template, method, result=None, mask=None)

  • image: 输入的源图像,可以是灰度图像或彩色图像。
  • template: 要匹配的模板图像,必须与源图像具有相同的数据类型和通道数。
  • method: 模板匹配方法,用于指定匹配的算法。常见的方法有:
    • cv2.TM_SQDIFF: 平方差匹配法,计算平方不同,计算出来的值越小就越相关;
    • cv2.TM_SQDIFF_NORMED: 归一化平方差匹配法,计算归一化平方不同,计算出来的值越靠近0,越相关;
    • cv2.TM_CCORR: 相关性匹配法,计算相关性,计算出来的值越大,越相关;
    • cv2.TM_CCORR_NORMED: 归一化相关性匹配法,计算归一化相关性,计算出来的值越接近1,越相关;
    • cv2.TM_CCOEFF: 相关系数匹配法,计算出来的值越大,越相关;
    • cv2.TM_CCOEFF_NORMED: 归一化相关系数匹配法,计算归一化相关系数,计算出来的值越接近1,越相关。
  • result (可选): 输出的匹配结果图像,与源图像大小相同,数据类型为浮点型。
  • mask (可选): 掩码图像,指定要匹配的图像区域。

函数返回一个包含匹配结果的浮点型数组(或图像)。可以通过 cv2.minMaxLoc() 函数找到结果数组中的最大值和最小值,以及对应的位置。

#模板匹配
#假设原图的大小是A*B,而模板大小是a*b,那么输出结果的矩阵是(A-a+1)*(B-b+1)
import cv2
import  numpy as np
from matplotlib import  pyplot as plt

img = cv2.imread('C:/Users/hellou/Desktop/self-image.jpg', 0)
template = cv2.imread('C:/Users/hellou/Desktop/face-imge.jpg', 0)
h, w = template.shape[:2]#取图片的长和宽
print(img.shape)
print(template.shape)

"""TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
TM_CCORR:计算相关性,计算出来的值越大,越相关
TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
建议使用带有归一化的方法"""

methods = ['cv2.TM_SQDIFF','cv2.TM_CCORR','cv2.TM_CCOEFF','cv2.TM_SQDIFF_NORMED','cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF_NORMED']
res = cv2.matchTemplate(img, template, 1)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

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_SQIDFF_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)
    #OpenCV 中的 rectangle 函数可以在一幅图像上绘制矩形。该函数的格式如下:
#cv2.rectangle(image, start_point, end_point, color, thickness)

#参数解释:

    #image:要在其上绘制矩形的图像
    #start_point:矩形的左上角坐标
    #end_point:矩形的右下角坐标
    #color:矩形的颜色,可以是 BGR 或者 RGB 的三通道元组
    #thickness:线条的粗细,如果设置为 -1,表示矩形是填充的"""

    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()

匹配多个对象:

import cv2

# 读取源图像和模板图像
image = cv2.imread('image.png')
template1 = cv2.imread('template1.png')
template2 = cv2.imread('template2.png')

# 定义匹配方法
method = cv2.TM_CCOEFF_NORMED

# 执行模板匹配
result1 = cv2.matchTemplate(image, template1, method)
result2 = cv2.matchTemplate(image, template2, method)

# 设置阈值
threshold = 0.8

# 寻找满足阈值条件的匹配结果
locations1 = np.where(result1 >= threshold)
locations2 = np.where(result2 >= threshold)

# 绘制矩形框标记匹配位置
w1, h1 = template1.shape[::-1]
w2, h2 = template2.shape[::-1]

for pt in zip(*locations1[::-1]):
    cv2.rectangle(image, pt, (pt[0] + w1, pt[1] + h1), (0, 255, 0), 2)

for pt in zip(*locations2[::-1]):
    cv2.rectangle(image, pt, (pt[0] + w2, pt[1] + h2), (0, 0, 255), 2)

# 显示匹配结果
cv2.imshow('Matched Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

标签:NORMED,匹配,image,cv2,笔记,学习,opencv,TM,归一化
From: https://www.cnblogs.com/hellou/p/17500774.html

相关文章

  • CF1418G Three Occurrences 做题笔记
    题目链接题意是输出所有区间满足其内部每个数要么出现$3$次要么不出现的个数。因为是区间,数量很多,发现贡献是可以抵消的,直接无脑预处理前缀的桶。然后枚举左端点,统计答案,怎么处理呢?疯狂地向右扩展,直到区间内有数字出现了$3$次以上(这样是对的,待会儿证明,另外扩展到前一个就......
  • Python 3.11 无法使用opencv的解决方法
    尝试了各种办法,默认安装方法pipinstallopencv-python安装后,importcv2提示缺少dll文件。下载了opencv4.7,添加路径到环境变量PYTHONPATH,但是里面没有提供给python3.11的config.py只有给3.10的,还是不成功。所以,只好卸载了Python3.11,安装了Python3.10,直接用默认安装方法pipin......
  • WPF 入门笔记 - 06 - 命令
    我们把世界看错,反说它欺骗了我们。--飞鸟集前言相较而言,命令对我来说是一个新概念,因为在Winform中压根没有所谓的命令这个概念......
  • P9400 「DBOI」Round 1 三班不一般 做题笔记
    题目链接最近搬运一些洛谷上的题解到这里来,一是增加我的博文数量,二是缓解一下我的博客园冷清的气氛。我的做法和题解里的做法不一样,麻烦了许多。首先看到连续的几盏灯刺眼就不行了,当然能够想到动态规划,设$f[i][j]$为看到第$i$个宿舍,末尾有连续$j$个灯刺眼,且前面的灯都合......
  • P8026 [ONTAK2015] Bajtocja 做题笔记
    题目链接一道好题,本来是做几道启发式合并玩玩,没想到是个哈希。这一道题需要维护连通性,显然想到使用并查集。如果两个点在某个图内的父亲相同,显然这两个点就连通了。但是如果每链接一对点我们就遍历所有点对然后判断父亲,显然爆炸。于是考虑借鉴一下CSP2022T3的思路,对于每......
  • P8026 『JROI-7』hibernal 做题笔记
    题目链接观察数据,要求询问次数不超过$\lceil2\logn\rceil-1$,相当困难。我刚开始也在想二分,但这个东西并不具有单调性,但这个题具有的特点就是你不仅仅可以询问一个前缀,你还可以询问任意的集合。首先发现如果能将$n$个苹果分成$S_1$$S_2$两个长度接近的集合,且$S_1$和$S......
  • 读发布!设计与部署稳定的分布式系统(第2版)笔记10_自动化和缓慢的响应
    1. 工业机器人1.1. 具有多层防护措施,防止对人员、机器和设施造成损害1.2. 防护措施能限制机器人的动作和传感器的感知1.3. 机械臂的旋转范围会远远小于它可以达到的全部运动范围2. 自动化2.1. 它更像是工业机器人2.1.1. 掌握控制层感知系统的当前状态2.1.2. 将其......
  • 软测笔记2-【五大用例设计方法】
    用例设计方法测试用例:是为测试项目而设计的执行文档->作用:防止漏测,实施测试的标准1、等价类划分法:    在所有测试数据中,具有某种共同特征的数据集合进行划分分类:a.有效等价类:满足需求的数据集合b.无效等价类:不满足需求的数据集合使用步骤:......
  • 软测笔记3-【缺陷】
    缺陷1.缺陷:软件在使用过程中存在的任何问题都叫软件的缺陷,简称bug 2.缺陷的判定标准:a.软件未实现需求(规格)说明书中明确要求的功能(少功能)b.软件实现的功能超出需求(规格)说明书指明的范围(多功能)c.软件出现了需求(规格)说明书中指明不应该出现的错误(功能......
  • 2023年如何选购一部4000元价位的笔记本电脑(附带坑的说明)
    2023年如何选购一部4000元价位的笔记本电脑(附带坑的说明)本文是一个快速指南,不包含选购中涉及的所有知识点,尤其是大量的具体硬件参数,内容主要关注在如何快速抓住自己真正的需求,快速筛选掉不匹配的型号,从而做出适合的选择。背景条件限定:价格限制4000元+;只能在指定的电商购买;......