Python+Opencv实现图像模板匹配详解

yizhihongxing

这里是“Python+Opencv实现图像模板匹配详解”的攻略,主要介绍了使用Python和OpenCV实现图像模板匹配的过程,以及一些示例说明。

1. 简介

图像模板匹配是指在一副图像中查找给定的目标图像的位置。它是计算机视觉中的基本问题之一,也是许多更复杂问题的基础。在本教程中,我们将使用Python和OpenCV来实现基本的图像模板匹配。

2. 实现过程

实现图像模板匹配的主要步骤如下:

  1. 导入必要的库,包括cv2、numpy和matplotlib。
  2. 加载原始图像和模板图像。
  3. 将模板图像与原始图像进行匹配。
  4. 找到匹配位置。
  5. 绘制矩形框标记匹配区域。

下面是一个基本的示例实现:

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

# 读取原始图像和模板图像
img = cv2.imread('image.png', 0)
template = cv2.imread('template.png', 0)

# 获取模板图像大小
w, h = template.shape[::-1]

# 应用模板匹配算法
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# 设定匹配阈值
threshold = 0.8

# 获取匹配结果位置
loc = np.where(res >= threshold)

# 绘制矩形标记匹配区域
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

# 显示匹配结果
plt.imshow(img, cmap='gray')
plt.title('Match Result')
plt.xticks([]), plt.yticks([])
plt.show()

在这个示例中,我们首先加载原始图像和模板图像。接着,我们获取模板图像的大小,并使用OpenCV的matchTemplate函数进行模板匹配。这个函数将返回匹配结果的矩阵,我们将其存储在变量res中。

接下来,我们设定匹配阈值,用于确定匹配结果是否是有效的。在这个示例中,我们将阈值设置为0.8。将匹配结果与阈值进行比较,然后使用np.where函数检索匹配结果的位置。最后,我们使用OpenCV的rectangle函数在匹配区域周围画出矩形框,并使用imshowshow函数将结果显示出来。

3. 示例说明

下面是两个示例,以说明如何使用Python和OpenCV实现图像模板匹配。

示例1:车辆检测

假设我们有一张道路交通的原始图像,要从中检测出汽车的位置。我们可以使用汽车的模板图像对原始图像进行匹配,并将匹配的位置标记出来。

以下是示例代码:

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

# 读取原始图像和模板图像
img = cv2.imread('traffic.jpg', 0)
template = cv2.imread('car.png', 0)

# 获取模板图像大小
w, h = template.shape[::-1]

# 应用模板匹配算法
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# 设定匹配阈值
threshold = 0.8

# 获取匹配结果位置
loc = np.where(res >= threshold)

# 绘制矩形标记匹配区域
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

# 显示匹配结果
plt.imshow(img, cmap='gray')
plt.title('Car Detection')
plt.xticks([]), plt.yticks([])
plt.show()

在这个示例中,我们使用模板图像来匹配原始图像,并找到匹配的位置。最后,我们使用矩形框标记匹配区域,并将结果显示出来。根据匹配结果,我们可以确定原始图像中所有车辆的位置。

示例2:疵点检测

假设我们有一张PCBA板的原始图像,要从中检测出装配中可能出现的疵点,如短路、开路等。我们可以使用疵点的模板图像对原始图像进行匹配,并将匹配的位置标记出来。

以下是示例代码:

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

# 读取原始图像和模板图像
img = cv2.imread('pcb.jpg', 0)
template = cv2.imread('defect.png', 0)

# 获取模板图像大小
w, h = template.shape[::-1]

# 应用模板匹配算法
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# 设定匹配阈值
threshold = 0.8

# 获取匹配结果位置
loc = np.where(res >= threshold)

# 绘制矩形标记匹配区域
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

# 显示匹配结果
plt.imshow(img, cmap='gray')
plt.title('Defect Detection')
plt.xticks([]), plt.yticks([])
plt.show()

在这个示例中,我们使用模板图像来匹配原始图像,并找到匹配的位置。最后,我们使用矩形框标记匹配区域,并将结果显示出来。根据匹配结果,我们可以确定原始图像中是否存在疵点问题。

4. 结论

在本教程中,我们介绍了使用Python和OpenCV实现图像模板匹配的基本过程。我们还展示了两个示例,分别用于车辆检测和疵点检测。这个技术在很多领域都有广泛的应用,例如机器视觉、自动化检测等。通过不断的学习和实践,我们可以进一步掌握和应用这个技术,解决实际问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python+Opencv实现图像模板匹配详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 如何用Python画一些简单形状你知道吗

    当然,我可以为你提供如何使用Python绘制一些简单的形状的攻略。 1. 准备工作 在Python中,我们可以使用turtle模块进行绘图操作。在这之前,你需要在本地的Python环境中安装turtle模块。安装方式如下: pip install turtle 2. 绘制一个正方形 下面是绘制正方形的示例代码。在代码中,我们首先导入了turtle模块,然后创…

    python 2023年5月18日
    00
  • Python入门篇之字典

    关于Python字典的入门篇攻略,我来给你详细的讲解。 什么是字典? Python中的字典(Dictionary)是一种无序的、可变的数据类型,它由键(key)和值(value)组成,键和值之间用冒号 “:” 分隔,多个键值对用逗号分隔,整个字典用一对大括号 “{}” 括起来。 例如,下面这个字典记录了几种水果的名称及其价格: fruits = {‘appl…

    python 2023年5月13日
    00
  • Python3爬虫中Splash的知识总结

    Python3爬虫中Splash的知识总结 Splash 是一个基于 WebKit 的轻量级浏览器,可以用于渲染 JavaScript 动态生成的页面。在 Python3 爬虫中,可以使用 Splash 来解决 JavaScript 渲染问题。以下是 Splash 的知识总结。 1. 安装 Splash 首先,我们需要安装 Splash。可以使用以下命令来安…

    python 2023年5月15日
    00
  • python保存二维数组到txt文件中的方法

    以下是详细讲解“python保存二维数组到txt文件中的方法”的完整攻略。 1.准备工作 在保存二维数组到txt文件中之前,我们需要先导入Python的相关模块,如下所示: import numpy as np 这里我们选择使用Python常用的科学计算库NumPy。 2.二维数组的创建 接下来,我们需要创建一个二维数组。我们可以通过NumPy的array函…

    python 2023年6月5日
    00
  • 详解Python中字符串前“b”,“r”,“u”,“f”的作用

    当我们使用Python中的字符串时,有时候我们需要在字符串前添加特殊字符,以实现一些特殊的功能。其中,“b”、“r”、“u”、“f”四个字符是最常用的。接下来分别介绍它们的作用及示例。 前缀“b” 当字符串前添加“b”时,表示这个字符串是一个字节字符串(bytes),而不是Unicode字符串(str)。字节字符串中的每个元素都是一个0~255范围内的整数,…

    python 2023年5月20日
    00
  • 利用python绘制正态分布曲线

    下面我将为您讲解利用Python绘制正态分布曲线的完整攻略。 1.准备工作 在进行绘制正态分布曲线前,我们需要先安装一下Python中用于科学计算的常用库NumPy和matplotlib。 !pip install numpy !pip install matplotlib 2.确定正态分布曲线的参数 正态分布曲线拥有两个参数:均值μ和标准差σ。在确定我们需…

    python 2023年6月3日
    00
  • 使用 python 发送电子邮件:如何形成消息?

    【问题标题】:Send emails using python: how to form the message?使用 python 发送电子邮件:如何形成消息? 【发布时间】:2023-04-07 04:08:02 【问题描述】: 我正在制作一个程序,该程序将从谷歌表中检索数据,这是我一周花费多少的支出日记。成功检索数据后,程序会向我发送一封电子邮件,告诉…

    Python开发 2023年4月8日
    00
  • 跟老齐学Python之通过Python连接数据库

    下面是详细讲解“跟老齐学Python之通过Python连接数据库”的完整攻略,攻略包含以下几个步骤: 1. 安装数据库驱动 在使用Python连接数据库之前,需要先安装相应数据库的驱动。以MySQL为例,我们可以使用PyMySQL包作为MySQL的驱动。安装PyMySQL包可以使用pip命令进行安装,在命令行中输入以下命令: pip install pymy…

    python 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部