python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言

前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于:

python学opencv|读取图像-CSDN博客

python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客

实际上都还是简单的图像操作,在此基础上,我们尝试对图像进行识别。比如在一堆图像里,找出和模板图像最相似的目标图像,这就是本次文章想要学习的目标: cv.matchTemplate()函数。

【2】官网教程

点击下方链接,直达cv.matchTemplate()函数的官网教程:

OpenCV: Object Detection

官网对cv.matchTemplate()函数的解释为:

++图1 cv.matchTemplate()函数的官网教程++

官网对cv.matchTemplate()函数的参数解释为:

void cv::matchTemplate (

InputArray image, #供匹配的图像

InputArray templ, #匹配参照的模板

OutputArray result, #匹配结果

int method, #匹配方法

InputArray mask = noArray() ) #掩模矩阵,默认即可,不是此次重点

为对匹配效果进行标记,还需要读取匹配结果,使用cv2.minMaxLoc()函数,点击下方链接可以直达官网说明页面:

OpenCV: Operations on arrays

官网对cv2.minMaxLoc()函数说明页面的相关解释为:

++图2 cv.minMaxLoc()函数的官网教程++

官网对cv.matchTemplate()函数的参数解释为:

void cv::minMaxLoc (

const SparseMat & a, #输入数据

double * minVal, #最小值

double * maxVal, #最大值

int * minIdx = 0, #最小坐标

int * maxIdx = 0 ) #最大坐标

【3】代码测试

首先引入相关模块和图像:

python 复制代码
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
srcm = cv.imread('srcm.png') #读取图像srcx.png
srcg = cv.imread('srcg.png') #读取图像srcp.png
srcc = cv.imread('srcc.png') #读取图像srcp.png
rows,cols,cans=srcg.shape #读取图像属性
rowsc,colsc,cansc=srcc.shape #读取图像属性

在这里,以srcm为待匹配图像,srcg和srcc为模板图像,也就是需要匹配两个。

然后进行图像匹配操作:

python 复制代码
#匹配结果
results=cv.matchTemplate(srcm,srcg,cv.TM_CCORR_NORMED)
results1=cv.matchTemplate(srcm,srcc,cv.TM_CCORR_NORMED)

之后读取匹配结果以备做标记:

python 复制代码
#取值
minValue,maxValue,minLoc,maxLoc=cv.minMaxLoc(results)
minValuec,maxValuec,minLocc,maxLocc=cv.minMaxLoc(results1)

做标记一般用方框,所以需要调用cv2.rectangle()函数。相关文章的学习链接为:python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形-CSDN博客

这个函数要两个坐标点,所以还需要自定义新的坐标点:

python 复制代码
#取最大坐标
resultPoint1=maxLoc
print("resultPoint1=",resultPoint1)

#取最大坐标
resultPoint2=maxLocc
print("resultPoint2=",resultPoint2)

#定义新坐标
resultPoint3=(resultPoint1[0]+cols,resultPoint1[1]+rows)
print("resultPoint3=",resultPoint3)

#定义新坐标
resultPoint4=(resultPoint2[0]+colsc,resultPoint2[1]+rowsc)
print("resultPoint3=",resultPoint3)

之后及时做标记、显示匹配效果:

python 复制代码
#作标记
cv.circle(srcm,(250,250),30,(0,255,0))
cv.rectangle(srcm,resultPoint1,resultPoint3,(0,255,0),2)
cv.rectangle(srcm,resultPoint2,resultPoint4,(200,180,55),2)

# 显示结果
cv.imshow('srcm ', srcm)
cv.imshow('srcg ', srcg)
cv.imshow('srcc ', srcc)

#窗口控制
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

程序运行相关的图像有:

++图3 srcm.png++

++图4 模板srcg.png++

++图5 模板srcc.png++

++图6 匹配效果srcgc.png++

图6为程序运行后的匹配效果,可见猫猫头和女孩都匹配成功了。

【4】细节说明

图6中给猫猫头增加了一个圆圈标记,是为了增强对照,增加圆圈标记的相关文章链接为:

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶_opencv circle-CSDN博客

【5】总结

掌握了python+opencv实现使用cv.matchTemplate()函数实现最佳图像匹配的技巧。

相关推荐
星川皆无恙几秒前
基于ARIMA 算法模型和NLP:社交媒体舆情分析在涉众型经济犯罪情报挖掘中的应用研究
人工智能·爬虫·python·算法·机器学习·自然语言处理·数据分析
何小少1 分钟前
论文写作全流程自动化:5个阶段的高效工具链构建
人工智能·论文写作·学术写作·ai工具·科研工具
摘星观月2 分钟前
【深度学习6】多层感知机2
人工智能·深度学习
啊巴矲3 分钟前
小白从零开始勇闯人工智能:机器学习初级篇(KNN算法)
人工智能
FL16238631296 分钟前
[C#][winform]基于yolov11的水下目标检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
人工智能·yolo·目标检测
todoitbo8 分钟前
从零搭建 Dify AI 平台:一次跌宕起伏的部署之旅
人工智能·ai·大模型·dify·流处理·工具流
SCBAiotAigc9 分钟前
一个github的proxy url
人工智能·python
serve the people9 分钟前
tensorflow 零基础吃透:TensorFlow 稀疏张量(SparseTensor)的核心用法
人工智能·tensorflow·neo4j
Chen--Xing9 分钟前
LeetCode 11.盛最多水的容器
c++·python·算法·leetcode·rust·双指针
jinxinyuuuus10 分钟前
GTA 风格 AI 生成器:提示词工程、LLM创造性联想与模因的自动化生成
运维·人工智能·自动化