OpenCV-Python实战(16)——单/多模板匹配

一、模板匹配函数 cv2.matchTemplate()

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

result:函数返回值,比较结果的数组。

image:原始图像。

templ:模板图像。templ.shape<image.shape。

method:搜寻匹配程度的方法,常见方法如下:

方法解释
TM_SQDIFF0

平方差匹配法,完全匹配时为0,匹配越差值越大

TM_SQDIFF_NORMED1归一化平方差匹配法
TM_CCORR2相关匹配法,模板图像矩阵与原始图像矩阵相乘,数值越大匹配越好,如果是0表示匹配最差。
TM_CCORR_NORMED3归一化相关匹配法
TM_CCOEFF4相关系数匹配法,采用相关匹配法对(模板减去均值的结果)和(原始的图像减去均值的结果)进行匹配,1表示匹配最好;0表示没有相关,-1表示最差匹配。
TM_CCOEFF_NORMED5归一化相关系数匹配法

mask:模板使用的掩膜,大小必须与模相同,默认为:None。

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('mario.jpg')
cv2.imshow('mario',img)
temp = cv2.imread('mario_coin.jpg')
cv2.imshow('mario_coin',temp)
result1 = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_SQDIFF)
result2 = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_CCORR)
result3 = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_CCOEFF)
print(result1,'\n',result2,'\n',result3)
cv2.waitKey(0)
cv2.destroyAllWindows()
[[ 6731990.5  6308971.   5926512.  ... 11313114.  11551437.  11873021. ]
 [ 6924833.   6503345.   6123767.5 ... 11313135.  11550929.  11870760. ]
 [ 7069597.   6646704.   6247641.  ... 11313315.  11550517.  11880881. ]
 ...
 [17794236.  15902143.  15727139.  ... 14817700.  14878067.  14288622. ]
 [17701296.  15850301.  15705493.  ... 14744390.  14826834.  14169278. ]
 [17251248.  15429999.  15308911.  ... 14386932.  14420212.  13770000. ]] 
 
[[2428959.8 2373233.  2267798.  ... 3667868.2 4292994.  4769557. ]
 [2326548.  2267831.  2164031.8 ... 3667858.  4293216.  4770027. ]
 [2328443.  2264163.  2163468.  ... 3667768.  4293295.  4769835. ]
 ...
 [3778746.  3714959.  3812971.  ... 3882576.  3646878.  3620958. ]
 [3806750.  3713757.  3800528.  ... 3885964.2 3631411.2 3646322.2]
 [3818794.  3752779.  3825091.5 ... 3908170.2 3677171.2 3703511.5]] 
 
[[ 313878.88   418755.53   488566.2   ...  509782.8    792269.2    953014.75 ]
 [ 210708.95   313194.16   383586.47  ...  509772.56   792581.3    953958.94 ]
 [ 177531.81   277073.8    353193.72  ...  509682.56   792745.8    952602.56 ]
 ...
 [-183124.92   -14288.917   87049.54  ...  177207.12    -8289.875    28152.758]
 [-156109.62   -15939.287   71745.33  ...  186032.53   -13804.405    61460.53 ]
 [ -72219.44    89040.71   162471.64  ...  271467.6     95619.11    174962.28 ]]

二、单目标模板匹配

        在原始图像中只选择最相似的一个相似图案当作结果,称为单目标匹配。

minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src=*,mask=*)

minVal:函数返回最小值。

minLoc:函数返回最小值坐标。

src:输入矩阵。

import cv2

img = cv2.imread('Lena.png')  #原始图像
cv2.imshow('Lena',img)
temp = img[250:280,240:290,:] # 模板
cv2.imshow('Lena_eye',temp)
h,w = temp.shape[:2]  # 模板的高和宽

result = cv2.matchTemplate(image=img,templ=temp,method=cv2.TM_SQDIFF)  # 模板匹配
minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src=result)   # 找出匹配结果的值和坐标
upperleft = minLoc  # 左上角的坐标
lowerright = (minLoc[0]+w,minLoc[1]+h)  # 右下角的坐标
img1 = cv2.rectangle(img.copy(),upperleft,lowerright,(255,0,0),3)  # 在原图上画出模板匹配出的区域
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、多目标模板匹配

在原始图像中选择最相似的一多个相似图案当作结果,称为单多目标匹配。 

import cv2
import numpy as np

origianl = cv2.imread('mario.jpg') #原始图像
cv2.imshow('mario',origianl)
img = cv2.imread('mario.jpg',0)  # 灰度图像
temp = img[46:66,70:84]   # 模板
h,w = temp.shape[:2]  # 模板的高和宽
# 模板匹配
result = cv2.matchTemplate(img, temp, cv2.TM_CCORR_NORMED)
#取匹配程度大于80%的坐标
index = np.where(result > 0.8)
for i in zip(*index[::-1]):	#*代表可选参数
    img1 = cv2.rectangle(origianl, i, (i[0]+w, i[1]+h), (255,0,0), 1)
cv2.imshow('img1',img1)

cv2.waitKey(0)
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式 L2 网关下的 OVS 未知单播泛洪

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 1 问题描述 2 基础设施和环境信息 3 故障排除 3.1 确认&#xff1a;单播泛洪 3.2 确认&#xff1a;所有泛洪流量都以 L2 GW 为目标 3.3 验证&#xff1a;容器 ARP 处于活动状态时&…

天猫推荐数据集实践

参考自 https://github.com/xufengtt/recom_teach_code&#xff0c;学习记录。 环境配置&#xff08;maxcomputedataworks&#xff09; 下载天猫推荐数据集&#xff1b;开启 aliyun 的 maxcompute&#xff0c;dataworks&#xff0c;pai&#xff1b;使用 odpscmd 上传本地数据…

库的概念:动态库与静态库

在软件开发中&#xff0c;库是代码复用的核心工具&#xff0c;它帮助开发者避免重复造轮子&#xff0c;提升开发效率。库可以分为动态库和静态库&#xff0c;这两者在程序开发中的使用方式、链接过程和性能上存在显著区别。本文将详细讲解动态库与静态库的定义、区别、链接过程…

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之&#xff1a;如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中&#xff0c;我们介绍了Flink如何根据StreamGraph生成JobGraph的流程&#xff0c;并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;91.4&#xff05;准确识别率&#xff0c;18912张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载&#xff1a; &#xff59;&#xff4f;&#xff4c;&#xff4f; &#xff56;&#…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

linux中执行命令

1.1 命令格式 命令格式&#xff1a; 主命令 选项 参数&#xff08;操作对象&#xff09; 命令分为两类&#xff1a; 内置命令&#xff08; builtin &#xff09;&#xff1a;由 shell 程序自带的命令 外部命令&#xff1a;有独立的可执行程序文件&#xff0c;文件名即命令…

Elasticsearch:当混合搜索真正发挥作用时

作者&#xff1a;来自 Elastic Gustavo Llermaly 展示混合搜索何时优于单独的词汇或语义搜索。 在本文中&#xff0c;我们将通过示例探讨混合搜索&#xff0c;并展示它与单独使用词汇或语义搜索技术相比的真正优势。 什么是混合搜索&#xff1f; 混合搜索是一种结合了不同搜索…

Python pyside6 设置的一个《广告图片生成器》

一、图&#xff1a; 二、说明书&#xff1a; 广告图片生成器使用说明 软件功能 这是一个用于生成广告图片的工具&#xff0c;可以快速制作包含产品图片和文字的广告图片。 主要特点 自定义广告尺寸&#xff08;默认620420像素&#xff09; 智能去除产品图片背景 自动排版&…

Spark基本介绍

一&#xff0c;Spark是什么 1.定义&#xff1a;Aache Spark是用于大规模数据处理的统一分析引擎。 二&#xff0c;Spark的发展 三&#xff0c;Spark的特点 高效性 计算速度快 提供了一个全新的数据结构RDD&#xff08;弹性分布式数据集&#xff09;。整个计算操作&#xff0c;…

Elasticsearch操作笔记版

文章目录 1.ES索引库操作(CRUD)1.mapping常见属性(前提)2.创建索引库3.查询&#xff0c;删除索引库4.修改索引库 2.ES文档操作(CRUD)1.新增文档2.查询、删除文档查询返回的数据解读&#xff1a; 3.修改文档 3.RestClient操作(索引库/文档)(CRUD)1.什么是RestClient2.需要考虑前…

EFEVD: Enhanced Feature Extraction for Smart Contract Vulnerability Detection

假设&#xff0c;攻击者在合约 Dao 内存放有 1 Ether 攻击者调用 withdraw 函数&#xff0c;提取 1 Ether&#xff1b; 函数执行到 require 之后&#xff0c; balances 之前时&#xff0c;6789-6789-6789- contract Dao {function withdraw() public {require(balances[msg.…

我的线代观-秩(向量,矩阵)

都说秩是线代中不可避免的一环&#xff0c;当然&#xff0c;它其中最重要的一环。 我在学习线代之后&#xff0c;也有这种感受&#xff0c;它有着一种很绕的感受。 1.矩阵中 在矩阵中&#xff0c;它的秩是怎么定义的呢。它常常与行列式扯上关系&#xff0c;我们拿三阶矩阵为例…

ES IK分词字典热更新

前言 在使用IK分词器的时候&#xff0c;发现官方默认的分词不满足我们的需求&#xff0c;那么有没有方法可以自定义字典呢&#xff1f; 官方提供了三种方式 一、ik本地文件读取方式 k插件本来已为用户提供自定义词典扩展功能&#xff0c;只要修改配给文件即可&#xff1a; …

基于Spring Boot的电影网站系统

一、技术架构 后端框架&#xff1a;Spring Boot&#xff0c;它提供了自动配置、简化依赖管理、内嵌式容器等特性&#xff0c;使得开发者可以快速搭建起一个功能完备的Web应用。 前端技术&#xff1a;可能采用Vue.js、JS、jQuery、Ajax等技术&#xff0c;结合Element UI等组件库…

C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡

雷赛控制技术 DMC系列运动控制卡是一款新型的 PCI/PCIe 总线运动控制卡。可以控制多个步进电机或数字式伺服电机&#xff1b;适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO 控制、位置比较、位置锁存等功能的应用。 DMC3000 系列卡的运动控制函数库功…

android studio 写一个小计时器(版本二)

as版本&#xff1a;23.3.1patch2 例程&#xff1a;timer 在前一个版本的基本上改的&#xff0c;增加了继续的功能&#xff0c;实现方法稍微不同。 动画演示&#xff1a; activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx…

python-leetcode-轮转数组

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n len(nums)k % n # 如果 k 大于 n&#xff0c;…

亚马逊云科技 | Amazon Nova:智能技术新势力

在2024年亚马逊云科技re:invent大会上&#xff0c;Amazon Nova 系列自研生成式 AI 多模态模型重磅登场&#xff0c;新一代的AI产品-Amazon Nova&#xff0c;隶属于 Amazon Bedrock&#xff0c;一共发布6款大模型&#xff0c;精准切入不同领域&#xff0c;解锁多元业务可能&…

记录第一次跑YOLOV8做目标检测

今天是24年的最后一天&#xff0c;终于要向新世界开始破门了&#xff0c;开始深度学习&#xff0c;YOLO来敲门~ 最近做了一些皮肤检测的功能&#xff0c;在传统的处理中经历了反复挣扎&#xff0c;终于要上YOLO了。听过、看过&#xff0c;不如上手体会过~ 1、YOLO是什么&#x…