首页 > 其他分享 >机器学习:opencv图像识别--模版匹配

机器学习:opencv图像识别--模版匹配

时间:2024-09-05 22:23:25浏览次数:6  
标签:图像识别 -- 模版 cv2 目标 opencv 图像 匹配 模板

目录

一、模版匹配的核心概念

1.图片模板匹配是一种用于在图像中查找特定模式或对象的技术。

2.模板图像

3.目标图像

4.滑动窗口

5.相似度度量

6.匹配位置

二、模版匹配的步骤

1.准备图像:

2.预处理:

3.匹配:

4.定位最佳匹配:

5.标记结果:

6.显示或处理结果:

三、代码实现


一、模版匹配的核心概念

1.图片模板匹配是一种用于在图像中查找特定模式或对象的技术。

2.模板图像

  • 这是你要在目标图像中找到的部分。模板图像通常比目标图像小,并且包含你感兴趣的特征。        

 

3.目标图像

  • 这是包含模板图像的图像。在目标图像中,你希望找到与模板图像匹配的区域。

 

4.滑动窗口

  • 模板图像像一个窗口一样在目标图像上滑动。这种滑动可以是从左到右,从上到下,或以其他方式覆盖整个目标图像。

 

5.相似度度量

在每个窗口位置,计算模板图像与目标图像窗口区域的相似度。常见的相似度度量包括:

  • 归一化互相关(NCC):衡量两个图像块之间的相似度,通过比较像素值的相关性。
  • 均方误差(MSE):计算模板图像与目标图像窗口区域之间的像素差异的平方和。
  • 结构相似性(SSIM):评估图像的亮度、对比度和结构相似度。

 

6.匹配位置

  • 通过比较相似度度量的结果,确定模板图像在目标图像中最佳的匹配位置。通常,最大或最小的相似度值指示了最佳匹配。

 

二、模版匹配的步骤

1.准备图像

  • 目标图像:这是你希望在其中查找模板图像的图像。
  • 模板图像:这是你要在目标图像中查找的图像片段或图案。

 

2.预处理

  • 灰度化(可选):将目标图像和模板图像转换为灰度图像,以简化计算和提高效率(对于一些匹配方法,灰度化是可选的)。

 

3.匹配

  • 使用匹配算法计算模板图像与目标图像不同位置之间的相似度。这些算法会生成一个相似度矩阵,矩阵中的每个值表示模板图像在目标图像某个位置的匹配度。

 

4.定位最佳匹配

  • 从相似度矩阵中找出最佳匹配的位置。通常,这会是矩阵中的最大值(表示最相似的区域)。

 

5.标记结果

  • 在目标图像上标记出匹配区域,通常是通过绘制一个矩形框来突出显示找到的模板图像的位置。

 

6.显示或处理结果

  • 显示带有匹配标记的目标图像,或将结果保存以供后续处理。

三、代码实现

  • 完整代码 以及函数参数介绍
  • 使用的是cv2.matchTemplate()方法
"""模版匹配"""

# cv2.matchTemplate(image, templ, method, result=None, mask=None)
# image:待搜索图像
# templ:模板图像
# method:计算匹配程度的方法,可以有:
#       TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
#       TM_CCORR 相关匹配法:该方法采用乘法作;数值越大表明匹配程度越好。
#       TM_CCOEFF 相关系数匹配法:数值越大表明匹配程度越好。
#       TM_SQDIFF_NORMED 归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
#       TM_CCORR_NORMED 归一化相关匹配法,数值越大表明匹配程度越好。
#       TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。

import cv2

kele = cv2.imread('baishi.jpg')
moban = cv2.imread('baishikele.png')
cv2.imshow('baishi', kele)
cv2.imshow('moban', moban)
cv2.waitKey(0)

h, w = moban.shape[:2]  # 获取模版图片的高宽
res = cv2.matchTemplate(kele, moban, cv2.TM_CCOEFF_NORMED)   # 返回一个矩阵,其中每个元素表示该位置与模板的匹配程度
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 最小值、最大值、最小值位置、最大值位置
top_left = max_loc  # 最大值为匹配到的模板的左上角
bottom_right = (top_left[0] + w, top_left[1] + h)  # 主图片中用模版匹配到的位置
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 0, 255), thickness=3)

cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)

输出:

也可以自己找图片进行截图尝试模版匹配

标签:图像识别,--,模版,cv2,目标,opencv,图像,匹配,模板
From: https://blog.csdn.net/weixin_65047977/article/details/141941814

相关文章

  • 西陆健身系统V1.0.0
    健身系统,支持多城市、多门店,包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型,支持在线排课。私教可以通过上课获得收益,在线申请提现。目前Uniapp仅支持编译微信小程序。提供全部无加密源代码,支持私有化部署。V1.0.0发布版本......
  • PYthon基础入门 day01——PYthon基础语法(上)
    目录一.注释二.语句结束符和分行符1.语句结束符2.分行符三.行和缩进四.变量及数据类型1.变量2.数据类型3.数字(Numbers)数据类型4.字符串(String)5.列表(List)6.元组(Tuple)7.字典(Dictionary)五.数据类型的转换六.标识符与关键字1.标识符2.关键字一.注释在PYthon中......
  • 海报在线制作系统V1.0.3
    V1.0.3修复已知问题1、兼容多平台云存储上传2、修复小程序端海报背景图片不生成3、修复pc端登录问题4、修复海报删除问题......
  • 《C++中的面向对象编程三大特性:封装、继承与多态》
    在C++编程的广阔世界中,面向对象编程(Object-OrientedProgramming,OOP)的三大特性——封装、继承和多态,犹如三把强大的利器,帮助程序员构建出高效、可维护和可扩展的软件系统。本文将深入探讨如何在C++中实现这三大特性,并通过具体的代码示例展示它们的强大之处。一、封装(Enca......
  • 《深入理解 C++中的右值引用:开启高效编程新篇章》
    在C++的编程世界中,右值引用是一个强大而又富有特色的特性,它为程序员提供了更高效的资源管理方式和更灵活的编程手段。本文将带你深入探讨C++中的右值引用,揭示其独特的特点和强大的功能。一、标题背后的意义C++中的右值引用究竟有何特殊之处?为何它成为了C++编程中的热点......
  • 基于java语言的点击方块小游戏
    游戏玩法目标:玩家需要在限时内点击尽可能多的方块。规则:游戏启动后,屏幕上会随机出现一个移动的方块;玩家点击方块得分,方块会重新随机出现在另一个位置;游戏限时为30秒,时间结束时显示总分。代码importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;import......
  • 【非零段划分 / 2】
    题目思路第一种思路:按照表面题意,枚举p,处理数组后进行计数:复杂度∈O(n......
  • 武汉黑马进阶班第五天
    正则表达式&&泛型&&Collection集合1.正则表达式String方法.matches(规范格式)2.用在方法里面(是由一串特殊字符组成的字符串)不需要去记,上网查都是能够查到的2.泛型<>---里面可以是四类八种包装类,也可以是String,也可以是自定义对象注意:Student类中需要规范JavaBean接口先定义......
  • 实现一个功能完备的 C++ String 类保姆指南
    本篇博客,我们将详细讲解如何从头实现一个功能齐全且强大的C++String类,并深入到各个细节。这篇博客将包括每一步的代码实现、解释以及扩展功能的探讨,目标是让初学者也能轻松理解。一、简介1.1、背景介绍在C++编程中,std::string类是最常用的字符串处理工具,它提供了丰......
  • Java使用gdal更改shp要素的字段属性值
    文章目录前言一、GDAL和Java版本二、代码1.引入gdal,设置gdal环境2.修改要素属性值3.测试使用总结前言昨天实现了gdal对shp文件进行属性字段的重命名,Java使用gdal重命名shp属性字段。对于gdb的话也是类似的思路,只不过gdb有多个图层,以后有涉及到再写。今天试了下gda......