Opencv之模板匹配可视化

模板匹配

目录

  • 模板匹配
    • [1 概念函数理解](#1 概念函数理解)
      • [1.1 概念](#1.1 概念)
      • [1.2 步骤](#1.2 步骤)
      • [1.3 函数](#1.3 函数)
    • [2 实际测试](#2 实际测试)
      • [2.1 图片数据](#2.1 图片数据)
      • [2.2 代码测试](#2.2 代码测试)

1 概念函数理解


1.1 概念

模板匹配是一种在较大图像中寻找与给定模板图像最相似区域的技术。它是图像处理和计算机视觉中的一个基本任务,广泛应用于各种领域,如物体识别、图像检索和视频监控等。

1.2 步骤

  1. 选择模板:首先,确定您想在较大图像中查找的小图像区域(模板)。
  2. 滑动窗口:将模板图像在较大图像上滑动,从左到右,从上到下,确保模板图像覆盖大图像的每一个可能位置。
  3. 相似度度量 :在每个位置,计算模板图像与较大图像中对应区域的相似度。常用的相似度度量方法包括:
    • 绝对差值和(Sum of Absolute Differences, SAD)
    • 平方差和(Sum of Squared Differences, SSD)
    • 归一化互相关(Normalized Cross-Correlation, NCC)
    • 结构相似性指数(Structural Similarity Index, SSIM)
  4. 找到最佳匹配:相似度度量的结果产生一个分数,表示模板与较大图像中每个位置的匹配程度。最高分数的位置被认为是最佳匹配。
  5. 结果输出 :输出最佳匹配的位置,有时还包括匹配度量的分数。
    模板匹配的一个关键挑战是它对图像的缩放、旋转和光照变化比较敏感。为了提高匹配的鲁棒性,可能需要对模板或搜索图像进行预处理,如归一化、直方图均衡化或使用更复杂的特征匹配方法。

1.3 函数

cv2.matchTemplate(img,tem,method) 匹配,一般设置此三个参数,其他参数默认result=None, mask=None,返回值为得分

具体如下:

  1. img: 待搜索的图像,即大图像,可以是灰度图像或者彩色图像。
  2. templ : 搜索的模板,它必须不大于待搜索的图像,并且与img具有相同的类型(灰度或彩色)。
  3. method : 用于比较模板和图像的匹配方法。以下是可用的方法:
    • cv2.TM_SQDIFF: 平方差和(Sum of Squared Differences)
    • cv2.TM_SQDIFF_NORMED: 归一化的平方差和
    • cv2.TM_CCORR: 相关性系数
    • cv2.TM_CCORR_NORMED: 归一化的相关性系数
    • cv2.TM_CCOEFF: 相关系数的系数
    • cv2.TM_CCOEFF_NORMED: 归一化的相关系数的系数
  4. result : 匹配结果图像,它是一个浮点单通道图像,其大小取决于模板的大小。如果img的大小是(W x H),而templ的大小是(w x h),则result的大小将是((W-w+1) x (H-h+1))。
  5. mask : 可选参数,用于指定模板图像的掩码。当模板图像不完整或者您只对模板图像的某个部分感兴趣时,可以使用掩码。掩码必须是一个单通道与templ大小相同的图像。

2 实际测试


2.1 图片数据

2.2 代码测试

代码展示:

python 复制代码
import cv2
import numpy as np


img = cv2.imread('tu.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
tem = cv2.imread('jian.jpg',0)
tem_rot90 = np.rot90(tem,k=1)
tem_rot90_1 =np.rot90(tem,k=-1)

tem_list = [tem,tem_rot90,tem_rot90_1]
for i in tem_list:
    h, w = i.shape[:2]
    res = cv2.matchTemplate(img_gray, i, cv2.TM_CCOEFF_NORMED)
    # 设置阈值
    thr = 0.9
    # 匹配结果得分大于阈值的坐标
    loc = np.where(res>=thr)
    # 根据坐标画出矩形轮廓
    for pt in zip(*loc[::-1]):
        cv2.rectangle(img,pt,(pt[0]+w,pt[1]+h),(255,0,0),1)
        
cv2.imshow('tem',tem)
cv2.waitKey(0)
cv2.imshow('res',img)
cv2.waitKey(0)

运行结果:

  • 调试
    res:

    loc:
相关推荐
Jonathan Star1 小时前
MediaPipe 在Python中实现人体运动识别,最常用且高效的方案是结合**姿态估计**(提取人体关键点)和**动作分类**(识别具体运动)
开发语言·python·分类
leafff1231 小时前
一文了解LLM应用架构:从Prompt到Multi-Agent
人工智能·架构·prompt
滨HI01 小时前
C++ opencv拟合直线
开发语言·c++·opencv
山顶听风2 小时前
分页条初始化
python
无风听海2 小时前
神经网络之特征值与特征向量
人工智能·深度学习·神经网络
艾莉丝努力练剑2 小时前
【C++:红黑树】深入理解红黑树的平衡之道:从原理、变色、旋转到完整实现代码
大数据·开发语言·c++·人工智能·红黑树
九章云极AladdinEdu2 小时前
论文分享 | BARD-GS:基于高斯泼溅的模糊感知动态场景重建
人工智能·新视角合成·动态场景重建·运动模糊处理·3d高斯泼溅·模糊感知建模·真实世界数据集
希露菲叶特格雷拉特2 小时前
PyTorch深度学习笔记(二十)(模型验证测试)
人工智能·pytorch·笔记
NewsMash2 小时前
PyTorch之父发离职长文,告别Meta
人工智能·pytorch·python
IT_陈寒2 小时前
Python 3.12新特性实测:10个让你的代码提速30%的隐藏技巧 🚀
前端·人工智能·后端