广告
返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV-Python如何实现多模板匹配
  • 839
分享到

OpenCV-Python如何实现多模板匹配

2023-06-15 10:06:05 839人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

小编给大家分享一下OpenCV-python如何实现多模板匹配,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!多模板匹配在上一篇的实战中,我们通过人物眼睛的子图,找

小编给大家分享一下OpenCV-python如何实现多模板匹配,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

多模板匹配

在上一篇的实战中,我们通过人物眼睛的子图,找出了其在图像中出现位置。但是,有些情况下,并不仅仅只有一次,比如我们讲解傅里叶变换时,曾介绍一张草原的狮子图。如果匹配某个草,可能单个图像内会有很多,这个时候就要找出多个匹配结果。

而函数cv2.minMaxLoc()仅仅能找出最值,无法给出所有匹配区域的位置信息。所以,要想匹配多个结果,就需要进行如下4个步骤:

获取匹配位置的集合

首先,Numpy库中的函数where()能够获取模板匹配位置的集合。对于不同的输入,其返回值是不同的。

  • 当输入是一维数组时,返回值是一维索引,只是一组索引数组。

  • 当输入是二维数组时,返回的是匹配值的位置索引,因此会有两组索引数组表示返回值的位置。

比如,我们的灰度图像一般都是二维数组。下面,我们来查找一个二维数组中,值大于8的元素索引:

import numpy as npimg = np.array([[2, 4, 6, 8, 10], [9, 60, 10, 30, 4], [55, 21, 11, 7, 5]])result = np.where(img > 5)print(result)

运行之后,控制台会输出如下内容:

OpenCV-Python如何实现多模板匹配

如果你对Numpy不是很了解的化。下面博主在将数据转换以下,基本上都能看懂了。转换之后,格式如下:

OpenCV-Python如何实现多模板匹配

第一行为大于5的值的X坐标,第二行为大于5的值的Y坐标。那么上面大于5的数组索引为:[0,2],[0,3],[0,4],[1,0],[1,1],[1,2],[1,3],[2,0],[2,1],[2,2],[2,3]。你可以回溯对比看看是不是一致的。

通过np.where()函数可以找出在cv2.matchTemplate()函数的返回值中,哪些位置上的值是大于阈值threshold的。具体操作代码如下:

loc=np.where(res>threshold)

循环

因为我们找到的原图对应的模板图像不止一个,要处理多个值,肯定会用到循环。因此,在获取匹配值的索引后,可以采用如下语句遍历所有匹配的位置,对这些位置做标记:

for i in 匹配位置集合:标记匹配位置

在循环中使用zip()

函数zip()用可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

例如,我们获取的索引为x,y,z。下面我们使用zip()将它们打包成元组。代码如下:

import cv2import numpy as npimport matplotlib.pyplot as pltimg = np.array([[2, 4, 6, 8, 10], [9, 60, 10, 30, 4], [55, 21, 11, 7, 5]])result = np.where(img > 5)for i in zip(*result):    print(i)

这里我们还是使用上面的值,输出结果如下:

OpenCV-Python如何实现多模板匹配

这里自动将我们刚才满足条件的索引打包成了元素格式。是不是比刚才的控制台输出结果更加的直观呢?

替换坐标

我们上面得到的结果是符合条件的索引:(行号,列号),但我们需要绘制匹配位置的矩形,需要的是(列号,行号)。

所以,在使用cv2.rectangle()绘制矩形前,要先将函数numpy.where()得到的位置索引行列互换,行列互换可以通过如下代码实现:

import numpy as npimg = np.array([[2, 4, 6, 8, 10], [9, 60, 10, 30, 4], [55, 21, 11, 7, 5]])result = np.where(img > 5)for i in zip(*result[::-1]):    print(i)

运行之后,输出结果如下:

OpenCV-Python如何实现多模板匹配

实战多模板匹配

既然我们已经了解了标记绘制多个模板位置的4个步骤。下面,我们直接将上面的代码整理以下,即可完成多模板的匹配。具体代码如下所示:

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread("34.jpg", 0)template = cv2.imread("4_1.jpg", 0)w, h = template.shape[::-1]res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)threshold = 0.9loc = np.where(res >= 0.9)for i in zip(*loc[::-1]):    cv2.rectangle(img, i, (i[0] + w, i[1] + h), 255, 1)plt.imshow(img, cmap="gray")plt.axis("off")plt.show()

这里的代码与上面4个步骤一摸一样,具体就不做过多的讲解了。运行之后,多个模板也就匹配完成。

OpenCV-Python如何实现多模板匹配

附录:

模板图

OpenCV-Python如何实现多模板匹配

原图

OpenCV-Python如何实现多模板匹配

实例:基于opencv的多目标模板匹配

利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考:

#include <opencv2\core\core.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgproc\imgproc.hpp>#include <iOStream>#include <math.h>using namespace std;using namespace cv;Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH);int main(void){ Mat src = imread("1_2.png"); Mat srcCopy = src.clone();  Mat temp = imread("1_4.png"); Mat result; if (src.empty() || temp.empty()) {  cout << "打开图片失败" << endl;  return 0; } vector<Mat> templat; vector<float> minV; vector<Point> minL; int srcW, srcH, templatW, templatH, resultH, resultW; srcW = src.cols; srcH = src.rows; templat.push_back(temp); double minValue, maxValue; Point minLoc, maxLoc; for (int i=0;i<10;i++) {  cout << i << ": ";  templatW = templat[i].cols;  templatH = templat[i].rows;  if (srcW < templatW || srcH < templatH)  {   cout << "模板不能比原图大" << endl;   return 0;  }  resultW = srcW - templatW + 1;  resultH = srcH - templatH + 1;  result.create(Size(resultW, resultH), CV_32FC1);  matchTemplate(src, templat[i], result, CV_TM_SQDIFF_NORMED);  minMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);  cout << "min1: " << minValue << endl;  if (minValue<=0.070055)  {   rectangle(srcCopy, minLoc, Point(minLoc.x + templatW, minLoc.y + templatH), Scalar(0, 0, 255), 2, 8, 0);   Point new_minLoc;   new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);      float *data = result.ptr<float>(new_minLoc.y);   cout << "min2: " << data[new_minLoc.x] << " ";   if (data[new_minLoc.x]<=0.5)   {    cout << "进这个函数了:" << i << ":" << new_minLoc.x;    cout << " " << new_minLoc.y;    rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),     Scalar(0, 255, 0), 2, 8, 0);    new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);   }   float *data1 = result.ptr<float>(new_minLoc.y);   cout << "min3: " << data1[new_minLoc.x] << " " << endl;   if (data1[new_minLoc.x] <= 0.4)   {        rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),     Scalar(255, 0, 0), 2, 8, 0);   }  }  cout << "#" << endl;  Mat temp_templat;  resize(templat[i], temp_templat, Size(templat[i].cols / 1.1, templat[i].rows / 1.1));  templat.push_back(temp_templat); } imshow("结果", srcCopy); waiTKEy(0); return 0;}Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH){ //imshow("result", result); //cout << "maxvalue: " << maxValue << endl; int startX = minLoc.x - templatW / 3; int startY = minLoc.y - templatH / 3; int endX = minLoc.x + templatW / 3; int endY = minLoc.y + templatH / 3; if (startX < 0 || startY < 0) {  startX = 0;  startY = 0; } if (endX > result.cols - 1 || endY > result.rows - 1) {  endX = result.cols - 1;  endY = result.rows - 1; } int y, x; for (y = startY; y < endY; y++) {  for (x = startX; x < endX; x++)  {   float *data = result.ptr<float>(y);      data[x] = maxValue;  } } double new_minValue, new_maxValue; Point new_minLoc, new_maxLoc; minMaxLoc(result, &new_minValue, &new_maxValue, &new_minLoc, &new_maxLoc); //imshow("result_end", result); return new_minLoc;}

OpenCV-Python如何实现多模板匹配

OpenCV-Python如何实现多模板匹配

以下是结果图:

OpenCV-Python如何实现多模板匹配

以上是“OpenCV-Python如何实现多模板匹配”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网Python频道!

--结束END--

本文标题: OpenCV-Python如何实现多模板匹配

本文链接: https://www.lsjlt.com/news/279539.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV-Python实现多模板匹配
    目录多模板匹配获取匹配位置的集合循环在循环中使用zip()替换坐标实战多模板匹配实例:基于opencv的多目标模板匹配模板匹配的作用在图像识别领域作用可大了。那什么是模板匹配? 模板...
    99+
    2022-11-12
  • OpenCV-Python如何实现多模板匹配
    小编给大家分享一下OpenCV-Python如何实现多模板匹配,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!多模板匹配在上一篇的实战中,我们通过人物眼睛的子图,找...
    99+
    2023-06-15
  • Python+Opencv实现图像匹配功能(模板匹配)
    本文实例为大家分享了Python+Opencv实现图像匹配功能的具体代码,供大家参考,具体内容如下 1、原理 简单来说,模板匹配就是拿一个模板(图片)在目标图片上依次滑动,每次计算模...
    99+
    2022-11-12
  • Python和OpenCV进行多尺度模板匹配实现
    目录1. 效果图2. 原理3. 步骤4. 源码5. 参考这篇博文将实现如何将标准模板匹配扩展到多尺度,从而使其更加健壮。使其可以处理模板和输入图像大小不同的匹配。 1. 效果图 模板...
    99+
    2022-11-12
  • Python+Opencv实现图像模板匹配详解
    目录引言一、匹配方法 二、匹配单个对象 三、匹配多个对象引言 什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见&...
    99+
    2022-11-11
  • Python OpenCV怎么实现图像模板匹配
    今天小编给大家分享一下Python OpenCV怎么实现图像模板匹配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-29
  • OpenCV-Python模板匹配人眼的实例
    目录什么是模板匹配模板匹配函数实现模板匹配什么是模板匹配 模板匹配是指在当前图像A内寻找与图像B最相似的部分,可以理解找茬,但是这里是找出一样的信息。 一般我们将图像A称为输入图像,...
    99+
    2022-11-12
  • opencv C++模板匹配的简单实现
    目录一简单实现二函数及原理讲解1matchTemplate()参数详解2minMaxLoc()函数一 简单实现 #include <opencv2/opencv.hpp>...
    99+
    2022-11-13
  • opencv C++模板匹配的实现方法
    这篇文章主要介绍“opencv C++模板匹配的实现方法”,在日常操作中,相信很多人在opencv C++模板匹配的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”opencv&nb...
    99+
    2023-06-29
  • python如何基于OpenCV模板匹配识别图片中的数字
    小编给大家分享一下python如何基于OpenCV模板匹配识别图片中的数字,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!程序目标单个数字模板:(这些单个模板是我自...
    99+
    2023-06-14
  • python基于OpenCV模板匹配识别图片中的数字
    目录前言程序目标思路讲解代码讲解完整代码总结前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出“读取失败”。...
    99+
    2022-11-12
  • Opencv Python实现两幅图像匹配
    本文实例为大家分享了Opencv Python实现两幅图像匹配的具体代码,供大家参考,具体内容如下 原图 import cv2 img1 = cv2.imread('SURF_2.jpg', cv2.IMRE...
    99+
    2022-06-02
    opencv python 图像匹配
  • python实现模糊匹配
    题目:模糊匹配, ‘’代表一个字符, *代表任意多个字符。给一段明确字符比如avdjnd 以及模糊字符比如*djdjiejj,判断二者是否匹配。若能匹配输出”Yes”, 否则输出“No” (为了方便阅读,代码里面输出Ture or...
    99+
    2023-01-31
    模糊 python
  • PythonOpenCV实现图像模板匹配详解
    目录1.什么是模板匹配及模板匹配方法matchTemplate()介绍素材准备2.单模板匹配2.1 单目标匹配2.2 多目标匹配3.多模板匹配1.什么是模板匹配及模板匹配方法matc...
    99+
    2022-11-10
  • python中opencv图像金字塔轮廓及模板匹配是怎样的
    这篇文章给大家介绍python中opencv图像金字塔轮廓及模板匹配是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.图像金字塔①高斯金字塔向下采样,数据会越来越少,减少的方式是:将偶数行和列删除向上采样,数据...
    99+
    2023-06-25
  • python计算机视觉opencv图像金字塔轮廓及模板匹配
    目录1.图像金字塔①高斯金字塔②拉普拉斯金字塔2.图像轮廓①寻找轮廓②轮廓特征③轮廓绘制3.模板匹配①模板匹配②匹配框线绘制③多对象匹配4.直方图统计①直方图绘制②直方图统计③直方图...
    99+
    2022-11-12
  • opencv-python图像配准(匹配和叠加)的实现
    图像配准需是指对不同条件下得到的两幅或多幅图像进行匹配、叠加的过程。最简单的做法就是求得原图像到目标图像之间的透视变换矩阵,将原图像按照矩阵进行变换,就可以得到和目标图像相似的效果。...
    99+
    2022-11-12
  • python OpenCV实现图像特征匹配示例详解
    目录目标Brute-Force匹配器的基础使用ORB描述符进行Brute-Force匹配什么是Matcher对象?带有SIFT描述符和比例测试的Brute-Force匹配基于匹配器的...
    99+
    2023-05-17
    python OpenCV图像特征匹配 python OpenCV
  • Python+FuzzyWuzzy怎么实现模糊匹配
    今天小编给大家分享一下Python+FuzzyWuzzy怎么实现模糊匹配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. ...
    99+
    2023-06-30
  • Python如何实现查询剪贴板自动匹配信息
    这篇文章主要介绍“Python如何实现查询剪贴板自动匹配信息”,在日常操作中,相信很多人在Python如何实现查询剪贴板自动匹配信息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何实现查询剪贴板...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作