当前位置: 首页 > article >正文

《OpenCV》——模版匹配

文章目录

  • OpenCV——模版匹配简介
  • 模版匹配使用场景
  • OpenCV 中模板匹配的函数
    • 参数
  • OpenCV——模版匹配实例
    • 导入所需库
    • 读取图片并处理图片
    • 对模版图片进行处理
    • 进行模版匹配
    • 显示模版匹配的结果
    • 注意事项

OpenCV——模版匹配简介

  • OpenCV 是一个非常强大的计算机视觉库,其中的模板匹配功能提供了高效的工具来实现图像中的目标定位。
  • 从本质上来说,模板匹配是一种用于在给定的图像(或其他类型的数据,如文本序列等,但主要以图像为例)中寻找与已知模板最相似部分的方法。这个模板可以是一个小的图像区域,例如,你想在一张风景照片中找到某个特定的标志,这个标志的图像就是模板。
  • 它的基本原理是通过在目标图像的各个位置滑动模板,并计算模板与图像在每个位置的相似度度量。这个相似度度量可以通过多种方式计算,例如计算像素值的差异等。

模版匹配使用场景

  • 目标检测:假设在一个监控视频中,需要检测是否出现了特定的物体,如汽车的车牌。可以将车牌的标准图像作为模板,在视频的每一帧图像中进行模板匹配,找到与车牌模板最相似的区域,从而实现车牌的定位检测。
  • 物体识别:如果要识别图像中的某个产品品牌标志,把不同品牌标志的图像做成模板,在目标图像中进行匹配,通过比较匹配程度来判断物体属于哪个品牌。

OpenCV 中模板匹配的函数

在 OpenCV 中,主要使用matchTemplate函数来进行模板匹配。这个函数的基本语法如下:

result = cv2.matchTemplate(image, templ, method)

参数

  • image:这是目标图像,也就是要在其中寻找模板的图像。它应该是一个 8 位或 32 位的单通道或彩色图像。
  • templ:这是模板图像,是要在目标图像中找到的小图像区域。同样可以是单通道或彩色图像,但要注意其尺寸通常比目标图像小。
  • method:这是匹配方法,OpenCV 提供了多种匹配方法,如cv.TM_SQDIFF(平方差匹配法)、cv.TM_CCORR(相关性匹配法)、cv.TM_CCOEFF(相关系数匹配法)等。不同的方法在计算模板和目标图像之间的相似度时有不同的侧重点。
  • 例如,cv.TM_SQDIFF方法计算模板与目标图像每个位置的平方差,得到的结果矩阵中,值越小表示匹配程度越高;而cv.TM_CCORR方法计算相关性,值越大表示匹配程度越高。

OpenCV——模版匹配实例

对下方图片进行模版匹配:
在这里插入图片描述
模版:
在这里插入图片描述
目标:找到图中所有的箭头

导入所需库

  • 首先需要导入 OpenCV 库和 NumPy 库。
import cv2
import numpy as np

读取图片并处理图片

img_rgb = cv2.imread('yuan_tu.jpg')
# 对图片进行灰度图处理
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread('jian_tou.jpg', 0)
# 读取模版图片的高和宽
h,w = template.shape[:2]

对模版图片进行处理

通过对模版图片的顺时针和逆时针处理,后面能将所有箭头都找出。

# 分别顺时针逆时针旋转
xuan_zhuan1 =cv2.rotate(template,cv2.ROTATE_90_CLOCKWISE)

xuan_zhuan2 =cv2.rotate(template,cv2.ROTATE_90_COUNTERCLOCKWISE)

进行模版匹配

通过遍历箭头图片和处理后的两张箭头图片,将得到的结果绘制到原图上。

# 进行模版匹配
for i in [template,xuan_zhuan1,xuan_zhuan2]:
    res = cv2.matchTemplate(img_gray,i,cv2.TM_CCOEFF_NORMED)
    # 设定匹配阈值
    threshold = 0.9
    # 获取匹配结果中所有符合阈值的坐标
    loc = np.where(res>=threshold)
    # 遍历所有匹配点
    for pt in zip(*loc[::-1]):
        # 在原图上绘制匹配区域的矩形框
        cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)

显示模版匹配的结果

显示图片结果,结束后释放内存。

cv2.imshow('res.png',img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

注意事项

  • 图像预处理:在进行模板匹配之前,可能需要对目标图像和模板图像进行预处理。例如,将图像转换为灰度图(如果使用基于灰度的匹配方法),或者进行归一化操作以减少光照等因素的影响。可以使用cv.cvtColor函数将彩色图像转换为灰度图,如gray_target = cv.cvtColor(target_image, cv.COLOR_BGR2GRAY)。
  • 多目标匹配:如果目标图像中可能存在多个与模板匹配的目标,上述示例只是找到了最佳匹配位置。要找到所有匹配位置,可以设置一个阈值,当匹配程度(根据匹配方法得到的结果矩阵中的值)超过这个阈值时,就认为是一个匹配目标。然后通过遍历结果矩阵来找到所有满足阈值条件的位置,并标记出来。
  • 性能优化:当处理大尺寸图像或复杂模板时,模板匹配可能会比较耗时。可以考虑使用图像金字塔等技术来加速匹配过程,先在低分辨率的图像上进行粗匹配,然后在高分辨率图像上进行精匹配。

http://www.kler.cn/a/505835.html

相关文章:

  • Spring AI 从入门到实践
  • css实现响应式详解
  • mayavi -> python 3D可视化工具Mayavi的安装
  • 1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)
  • Git的基本命令以及其原理(公司小白学习)
  • vue3 uiapp实现一个数字输入组件, 舒服非数字会默认转成最小数
  • java.net.SocketException: Connection reset 异常原因分析和解决方法
  • 数据库第四天作业
  • Unity3D仿星露谷物语开发21之添加更多道具
  • 【机器学习】数据拟合-最小二乘法(Least Squares Method)
  • 苹果手机ios脚本用按键精灵文件配置代码
  • SpringBoot:使用HTTP2+protobuf实现高性能微服务调用(一)服务器端实现
  • Checkbox 多选框的使用
  • 微信小程序原生与 H5 交互方式
  • Django Admin 自定义操作封装
  • ssh,samba,tftp,nfs服务安装和配置
  • 【Java计算机毕业设计】基于SSM旅游景区网络购票系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】
  • 19. 删除链表的倒数第 N 个结点【力扣】
  • 从零开始深度学习:(1)张量的常用操作
  • 从0开始学习搭网站第三天
  • 【k8s】用户和服务账户联系(user、serviceaccount、sa)
  • C++ inline的使用和含义详解
  • JavaScript系列(28)--模块化开发详解
  • ansible之playbook实战
  • OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)
  • 文章复现—面向配电网韧性提升的移动储能预布局与动态调度策略