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

embedded/2025/2/5 5:02:16/

【1】引言

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

pythonopencv|读取图像-CSDN博客

pythonopencv|读取图像(四十九)原理探究:使用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()函数。相关文章的学习链接为:pythonopencv|读取图像(十九)使用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中给猫猫头增加了一个圆圈标记,是为了增强对照,增加圆圈标记的相关文章链接为:

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

【5】总结

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

 


http://www.ppmy.cn/embedded/159662.html

相关文章

使用Visual Studio打包Python项目

1. 安装Visual Studio 首先,你需要在你的计算机上安装Visual Studio。 2. 创建项目 在Visual Studio中创建一个新的Python项目。 打开Visual Studio,点击“File”(文件) -> “New”(新建) -> “Pr…

【Linux】25.进程信号(2)

文章目录 4.捕捉信号4.1 重谈地址空间4.2 内核如何实现信号的捕捉4.3 sigaction4.4 可重入函数4.5 volatile4.6 SIGCHLD信号(了解) 4.捕捉信号 4.1 重谈地址空间 用户页表有几份? 有几个进程,就有几份用户级页表–进程具有独立性…

在Qt中,slots 关键字有什么用?

有下面的Qt代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向&#xff0c;以下是关于汽车自动驾驶AI的详细介绍&#xff1a; 技术原理 感知系统&#xff1a;自动驾驶汽车通过多种传感器&#xff08;如激光雷达、摄像头、雷达、超声波传感器等&#xff09;收集周围环境的信息。AI算法对这些传感…

LeetCode 344: 反转字符串

LeetCode 344: 反转字符串 - C语言题解 这道题的目标是反转一个字符数组&#xff08;字符串&#xff09;。我们将通过双指针法来实现这一功能。 代码实现 #include <stdio.h>void reverseString(char* s, int sSize) {int left 0, right sSize - 1; // 定义左右指针…

技术架构师成长路线(2025版)

目录 通用知识 计算机原理&#xff08;1 - 2 个月&#xff09; 数据结构&#xff08;2 - 3 个月&#xff09; 网络编程&#xff08;1 - 2 个月&#xff09; 软件工程&#xff08;1 个月&#xff09; 基础知识 Java 编程语言基础&#xff08;2 - 3 个月&#xff09; JVM&…

二叉树的最大深度(遍历思想+分解思想)

Problem: 104. 二叉树的最大深度 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(实则二叉树的先序遍历) 1.欲望求出最大的深度&#xff0c;先可以记录一个变量res&#xff0c;同时记录每次当前节点所在的层数depth 2.在递的过程中&#xff0c;每次递一层&#xff0…

QT:多窗口设计(主窗口点击按钮打开子窗口)

目录 一、新建QT工程 二、添加新文件 三、mainwindow.h部分 四、mainwindow.ui部分 五、mainwindow.cpp部分 六、效果演示 七、改进与完善 子窗口设计后来发现有一个更简单的方法实现&#xff08;用QDialog实现&#xff09;&#xff1a;传送门 一、新建QT工程 新建一个…