关于Python机器视觉OpenCV图片模板匹配

OpenCV(11):模板匹配实例讲解 OpenCV中,模板匹配是一种图像处理技术,用于在一个大的图像中查找和定位一个小的目标图像(也称为模板)。通俗而言,就是通过一张图片找到和另一张图片相似的部分 阅读详情

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取

Python免费学习资料、代码以及交流解答点击即可加入


什么是模板匹配

简单来说模板匹配就是通过现有的模板去与图片进行比较找出图中所匹配的图像。

首先来看一下效果图:

 

 

左图是模板图片,中图是带测试的图片,右图是匹配的结果

程序将在“中图”中匹配“左图”的模板图片,如果中图中含有模板图片的话,则会在中图画出模板图片的位置(用蓝线圈出来)。

模板匹配原理:

模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV带有一个函数cv2.matchTemplate()。它只是将模板图像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的补丁。OpenCV中实现了几种比较方法。(您可以检查文档以了解更多详细信息)。它返回一个灰度图像,其中每个像素表示该像素的邻域与模板匹配多少。

如果输入图像的大小(WxH)和模板图像的大小(wxh),则输出图像的大小将为(W-w + 1,H-h + 1)。获得结果后,可以使用cv2.minMaxLoc()函数查找最大/最小值在哪里。将其作为矩形的左上角,并以(w,h)作为矩形的宽度和高度。该矩形是您模板的区域。

目录:

1.前提
2.两种方法实现
3.后记

1.前提:

程序运行之前先安装一下相关的库


cv2
imutils

报错1:


ModuleNotFoundError: No module named 'cv2' (安装cv2)

说明缺少opencv库
在命令提示符窗口中,执行下面的命令:


pip install opencv-python

如果觉得下载过慢的可以执行下面的命令:(使用了豆瓣源下载,结果和上面是一样的,只不过这个命令安装快一些)


pip install -i https://pypi.doubanio.com/simple/ opencv-python

两种方法实现:

第一次方法:图像模板匹配(最简单)

模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在OpenCV里有6种,然后将每次的结果放入一个矩阵里,作为结果输出。假如原图形是AXB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)

代码:

#模板匹配
import numpy as np
import cv2

def cv_show(name,image):
  cv2.imshow(name,image)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

img = cv2.imread("source.jpg")
template = cv2.imread("m.jpg")


# 转换为灰度图片
gray1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 读取测试图片并将其转化为灰度图片
gray2 = cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
h,w = template.shape[:2]
#匹配
#TM_SQDIFF  匹配方法,归一化的方法更好用
res = cv2.matchTemplate(gray1,gray2,cv2.TM_SQDIFF)
#得到极值坐标
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
top_left = min_loc
bottom_right = (top_left[0]+w,top_left[1]+h)
#画出标记点
cv2.rectangle(img,top_left,bottom_right,255,2)
cv_show("img",img)

运行结果:

 

第二种方法:多尺度模板匹配

多尺度模板匹配实现步骤

  • 步骤1-读取模板图片,并依次执行灰度化和边缘检测处理;
  • 步骤2-读取测试图片,遍历整个尺度空间,进行图片裁剪;
  • 步骤3-依次执行边缘检测和模板匹配,获取到外接矩形;
  • 步骤4-根据结果对测试图片中模板所在的位置进行更新;
  • 步骤5-首先进行位置转换,然后绘制矩形框,最后显示结果。

代码实现:

# coding=utf-8
# 导入python包
import numpy as np
import imutils
import cv2

# 读取模板图片
template = cv2.imread("m.jpg")
# 转换为灰度图片
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# 读取测试图片并将其转化为灰度图片
image = cv2.imread('source.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 执行边缘检测
template = cv2.Canny(template, 50, 200)
(tH, tW) = template.shape[:2]
# 显示模板
#cv2.imshow("Template", template)


found = None

# 循环遍历不同的尺度
for scale in np.linspace(0.2, 1.0, 20)[::-1]:
  # 根据尺度大小对输入图片进行裁剪
  resized = imutils.resize(gray, width = int(gray.shape[1] * scale))
  r = gray.shape[1] / float(resized.shape[1])

  # 如果裁剪之后的图片小于模板的大小直接退出
  if resized.shape[0] < tH or resized.shape[1] < tW:
    break

  # 首先进行边缘检测,然后执行模板检测,接着获取最小外接矩形
  edged = cv2.Canny(resized, 50, 200)
    #匹配
    #TM_SQDIFF  匹配方法,归一化的方法更好用
  result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF)
  (_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)

  # 结果可视化
  # 绘制矩形框并显示结果
  clone = np.dstack([edged, edged, edged])
  cv2.rectangle(clone, (maxLoc[0], maxLoc[1]), (maxLoc[0] + tW, maxLoc[1] + tH), (0, 0, 255), 2)
  #cv2.imshow("Visualize", clone)
  #cv2.waitKey(0)

  # 如果发现一个新的关联值则进行更新
  if found is None or maxVal > found[0]:
    found = (maxVal, maxLoc, r)

# 计算测试图片中模板所在的具体位置,即左上角和右下角的坐标值,并乘上对应的裁剪因子
(_, maxLoc, r) = found
(startX, startY) = (int(maxLoc[0] * r), int(maxLoc[1] * r))
(endX, endY) = (int((maxLoc[0] + tW) * r), int((maxLoc[1] + tH) * r))

# 绘制并显示结果
cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)
cv2.imshow("Image", image)
cv2.waitKey(0)

运行结果:

 

3.后记:

如果大家学会这种技术之后,再稍微改进一下,弄错一个小脚本,这样下次玩开心消消乐的那可以直接无敌了,再也不用担心找不到匹配的小方块了,哈哈哈哈。

在集体照的茫茫人海中,你还怕我找不到你???通过模板匹配,直接定位你的位置!

python批量实现模板匹配处理,并将图片进行标记和裁剪保存 批量进行图片模板匹配,并进行图片裁剪和保存 阅读详情

相关推荐

交通标志定位与识别pythonopencv

最近在用pythonopencv做交通标志的定位和检测,本案例只能检测出限速标志的交通标志,第一次写博客,写的不好请见谅. 博主也是刚刚接触机器视觉的学习,后期会继续发布一些这方面的内容,希望我们可以互相学习,共同进步, 先说一下代码的运行效果吧 这里是一张图片的原图和运行以后的结果 1.导入需要模块,先创建一个变量a后面会用到 import cv2 as cv import numpy as np import os a=0 2,加载图片 src=cv.imread('tim.jpg') 3,

qq_45087786的博客 9131

多尺度模板匹配openCV实现find_scaled_shape_model)

多尺度模板匹配,基于形状的模板匹配

manuoo的专栏 6465

基于金字塔的模板匹配算法(python)

今天完成了机器视觉的课程作业-基于金字塔的模板匹配算法,就顺便记录一下。本次作业我是通过python+opencv来完成的。这个作业就是一个模板匹配算法的基础上加一个金字塔的模型来减少计算量,所谓金字塔就是对图片进行向下采样,每向下采样一次,图像就缩小一半,由此减少了计算的量。 原图和模板图: 运行代码: import cv2 import numpy as np def get_img(): source_img = cv2.imread("source_img.jpg") temp

i_actor的博客 2248

「找一找」考你眼力的时候到了!

机器视觉OpenCV图片模板匹配养成好习惯:文中文末小广告帮忙点一点什么是模板匹配简单来说模板匹配就是通过现有的模板去与图片进行比较找出图中所匹配的图像。首先来看一下效果图:左图是模板图...

公众号:Python研究者 654

OpenCV--模板匹配

模板匹配就是在给定的图片中,查找和模板最相似的区域,算法的输入包括模板和图片,通过不断移动模板图片,计算其与图片对应区域匹配度,将匹配度最高区域选择为最终结果。

m0_70964767的博客 1万+

机器视觉OpenCV-Python 图像的模板匹配和霍夫变换

1.模板匹配

知不足而奋进,望远山而前行 2万+

OpenCV模板匹配实战:从零实现机器视觉定位,避开新手必踩的坑

计算机视觉领域,定位是许多高级任务(如测量、识别、引导)的基石。其核心原理在于让计算机像人眼一样,在图像中寻找并确定特定目标的位置。模板匹配技术通过滑动窗口计算图像区域相似度,是实现这一目标最直观、高效的方法之一,尤其适合工业场景下背景稳定、目标形态固定的应用。相较于深度学习,模板匹配无需训练数据,原理透明,能快速验证方案可行性,是初学者理解视觉定位底层逻辑的理想切入点。本文以OpenCV为工具,结合Python环境搭建、算法选型、多目标处理和参数调优等工程实践,详细解析如何构建一个鲁棒的二维视觉定位系统

343

OpenCV-Python学习笔记(十五):模板匹配(Template Matching)

目标 在本节我们要学习: 1. 使用模板匹配在一幅图像中查找目标 2. 函数: cv2.matchTemplate(), cv2.minMaxLoc() 原理模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提供了函数: cv2.matchTemplate()。和 2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像和与其对应的输入图像的子...

GiffordY的博客 4333

身份证信息识别 基于tesseract4.0 + opencv + Python

身份证信息识别 基于tesseract4.0 + opencv + Python tessreact4.0介绍及安装opencv安装身份证信息识别的实现批量读取身份证图片SIFT算法进行特征点匹配模板匹配算法二值化,降噪文字识别 本人最近开始做有关ocr的项目,具体要做的是身份证信息识别,所以我决定使用tesseract+opencv+Python来实现这个工作. tessreact4.0介绍及...

baidu_33473810的博客 8621

OpenCV笔记24:在Python使用OpenCV进行模板匹配

1、学习目标 如何使用OpenCV Python进行模板匹配模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。 2、使用的函数方法 cv.matchTemplate() template.shape[::-1] np.where() 3、程序 import cv2 import numpy as np img = cv2.imread("messi5.jpg") grey_img = c...

weixin_41788560的博客 929

Python 机器视觉 - 基于opencv图像模板匹配实现的简单人脸匹配实例演示,matchTemplate的6大模板匹配算法

OpenCV 图像匹配算法 第一章:图像模板匹配演示 ① 效果展示1 ② 效果展示2 ③ 实现源码 第二章:六大模板匹配算法 ① CV_TM_SQDIFF【平方差匹配】 ② CV_TM_SQDIFF_NORMED【标准平方差匹配】 ③ CV_TM_CCORR【相关匹配】 ④ CV_TM_CCORR_NORMED【标准相关匹配】 ⑤ CV_TM_CCOEFF【相关系数匹配】 ⑥ CV_TM_CCOEFF_NORMED【标准相关系数匹配

小蓝枣的博客 4901

小杰机器视觉(six)——模板匹配

超光速引擎的轰鸣,是人类向宇宙深处进军的号角,穿越无尽星河,去叩响未知文明的大门。

2501_92101354的博客 1513

图像处理(8) : 模板匹配

模板匹配指的是通过模板图像与测试图像之间的比较,找到测试图像上与模板图像相似的部分,这是通过计算模板图像与测试图像中目标的相似度来实现的,可以快速地在测试图像中定位出预定义的目标。匹配的主要思路是使用一个目标原型,根据它创建一个模板,在测试图像中搜索与该模板图像最相似的目标,并寻找与该模板的均值或方差最接近的区域。 通过模板匹配可以得到目标的相似度,旋转角度,行列坐标,缩放大小等。 针对不同的图像特征和检测环境,有多种模板匹配算法。如何选择合适的模板匹配算法,取决于具体的图像数...

QtHalcon 4万+

opencv中的模板匹配

实现opencv中自带的模板匹配,并对其尺寸不变性进行了改进。使其可以自适应匹配最优解

lucifer_zhy的博客 1万+

OpenCV-Python中的图像处理-模板匹配

在前面的部分,我们在图片中搜素梅西的脸,而且梅西只在图片中出现了一次。假如你的目标对象只在图像中出现了很多次怎么办呢?函数cv.minMaxLoc() 只会给出最大值和最小值。此时,我们就要使用阈值了。在下面的例子中我们要经典游戏 Mario 的一张截屏图片中找到其中的硬币。实测验证 cv2.TM_CCORR 的效果不是太好。注意:阀值设定要合适,threshold = 0.8。threshold = 0.95部分金币没有匹配到。程序原图文件,在一张大图中搜索梅西的面部。

若有博文对您有帮助,欢迎点赞关注,收藏评论。 1503

python图像分类示例_python +keras实现图像分类(入门级例子讲解)

一.项目描述数据集来源于kaggle猫狗大战数据集。训练集有25000张,猫狗各占一半。测试集12500张。希望计算机可以从这些训练集图片中学习到猫狗的特征,从而使得计算机可以正确的对未曾见过的猫狗图片进行分类。这就是图像分类问题,计算机视觉研究领域之一,计算机通过学习图像本身的特征将不同类别的图像区分开来。二.评价指标二分类评价指标binary_crossentropy:交叉熵 ŷ i是样本...

weixin_39552204的博客 989

记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

qq_40985985的博客 888

RoboCom机器人大赛使用yolov5抽取20个随机图片进行人群识别

YOLOv5是一个在COCO数据集上预训练的物体检测架构和模型系列,它代表了Ultralytics对未来视觉AI方法的开源研究,其中包含了经过数千小时的研究和开发而形成的经验教训和最佳实践。YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使得其速度与精度都得到了极大的性能提升,具体包括:输入端的Mosaic数据增强、自适应锚框计算、自适应图片缩放操作;基准端的Focus结构与CSP结构;Neck端的SPP与FPN+PAN结构;

qq_58130152的博客 2665
上一篇: Python爬取热映电影,以『可视化及词云秀』方式带你了解热映电影
下一篇: 爬取淘宝热卖商品并可视化分析,看看大家都喜欢买什么!
酸菜鱼编程
博客等级 码龄6年 155粉丝 63原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值