Opencv 学习笔记:单模板匹配(6 种算法 + 目标精准定位)

模板匹配是在图像中查找与模板最相似区域的核心技术,本文演示 OpenCV 单模板匹配的完整实现,涵盖 6 种匹配算法,并解决匹配结果定位的核心问题,新手可直接复用。

核心代码实现

python 复制代码
import cv2 as cv
import numpy as np

# 1. 读取模板和待匹配图像并校验
tpl = cv.imread('.\image\15.bmp')  # 模板图像
target = cv.imread('.\image\16.bmp')  # 待匹配图像
if tpl is None or target is None:
    print('图像读取失败,请检查路径')
    exit()

# 显示模板和待匹配图像
cv.namedWindow('tpl', cv.WINDOW_NORMAL)
cv.resizeWindow('tpl', 600, 600)
cv.imshow('tpl', tpl)
cv.imshow('target', target)

# 2. 定义6种模板匹配算法
TM_SQDIFF = cv.TM_SQDIFF          # 平方差匹配:0最好,1最次
TM_SQDIFF_NORMED = cv.TM_SQDIFF_NORMED  # 归一化平方差匹配
TM_CCORR = cv.TM_CCORR            # 相关性匹配:1最好,0最次
TM_CCORR_NORMED = cv.TM_CCORR_NORMED    # 归一化相关性匹配
TM_CCOEFF = cv.TM_CCOEFF          # 相关系数匹配:1最好,0最次
TM_CCOEFF_NORMED = cv.TM_CCOEFF_NORMED  # 归一化相关系数匹配

# 选择使用的匹配算法(推荐归一化算法,鲁棒性更强)
use_method = TM_CCOEFF_NORMED

# 3. 执行模板匹配(注意参数顺序:待匹配图像在前,模板在后)
result = cv.matchTemplate(target, tpl, use_method)
# 归一化匹配结果(便于统一分析)
cv.normalize(result, result, 0, 1, cv.NORM_MINMAX, -1)

# 4. 获取匹配结果的极值点(定位最佳匹配区域)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)

# 5. 根据算法类型确定最佳匹配位置
tpl_h, tpl_w = tpl.shape[:2]  # 获取模板的高和宽
if use_method in [TM_SQDIFF, TM_SQDIFF_NORMED]:
    # 平方差类算法:最小值为最佳匹配
    best_loc = min_loc
else:
    # 相关性/相关系数类算法:最大值为最佳匹配
    best_loc = max_loc

# 6. 绘制匹配框(在待匹配图像上标注结果)
bottom_right = (best_loc[0] + tpl_w, best_loc[1] + tpl_h)
cv.rectangle(target, best_loc, bottom_right, (0, 255, 0), 2)

# 7. 显示匹配结果
cv.namedWindow('result', cv.WINDOW_NORMAL)
cv.resizeWindow('result', 600, 600)
cv.imshow('result', target)

cv.waitKeyEx(0)
cv.destroyAllWindows()

关键知识点解析

1. 6 种匹配算法分类

算法类型 核心特点 最佳匹配判定 推荐度
平方差类(SQDIFF/SQDIFF_NORMED) 计算像素差值平方和 数值越小匹配度越高 🌟🌟(归一化版更优)
相关性类(CCORR/CCORR_NORMED) 计算像素相关性 数值越大匹配度越高 🌟🌟(易受亮度影响)
相关系数类(CCOEFF/CCOEFF_NORMED) 去除均值后的相关性 数值越大匹配度越高 🌟🌟🌟(鲁棒性最强)

2. 核心避坑点

  • 参数顺序cv.matchTemplate(target, tpl, method) 必须是「待匹配图像在前,模板在后」,原代码顺序颠倒会导致匹配失败;
  • 匹配框尺寸 :匹配框的宽高应取模板图像 的尺寸(tpl_w/tpl_h),而非待匹配图像;
  • 归一化优势:归一化算法(带_NORMED 后缀)不受图像尺寸、亮度缩放影响,实际项目优先使用。

3. 核心步骤拆解

  1. 读取模板 / 待匹配图像,做好空值校验;
  2. 选择匹配算法(优先归一化相关系数);
  3. 执行模板匹配并归一化结果;
  4. 根据算法类型获取最佳匹配位置(最小 / 最大值);
  5. 绘制矩形框标注匹配区域。

总结

  1. 模板匹配核心是选择合适算法:优先使用TM_CCOEFF_NORMED(归一化相关系数),鲁棒性最强;
  2. 注意matchTemplate参数顺序(待匹配图在前)和匹配框尺寸(取模板尺寸);
  3. 平方差类算法看最小值,相关性 / 相关系数类看最大值,是定位最佳匹配的关键。
相关推荐
sali-tec4 分钟前
C# 基于OpenCv的视觉工作流-章56-OCR
图像处理·人工智能·opencv·算法·计算机视觉·ocr
不灭锦鲤11 分钟前
网络安全学习第98天
学习·安全
阿Y加油吧13 分钟前
二刷 LeetCode:5. 最长回文子串 & 1143. 最长公共子序列 复盘笔记
笔记·算法·leetcode
星幻元宇VR22 分钟前
VR自行车骑行模拟系统|让交通安全教育“骑”进现实
科技·学习·安全·vr
知识分享小能手28 分钟前
R语言入门学习教程,从入门到精通,R语言数值关系数据可视化 - 完整知识点(5)
学习·信息可视化·r语言
嵌入式小企鹅3 小时前
CPU供需趋紧、DeepSeek V4全链适配、小米开源万亿模型
人工智能·学习·开源·嵌入式·小米·算力·昇腾
三品吉他手会点灯9 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
kobesdu9 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
sakiko_9 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
生信碱移9 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言