机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

时间:2021-04-12 23:43:51

1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配

参数说明: src目标图像, template模板,method使用什么指标做模板的匹配度指标

2. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)  # 找出矩阵中最大值和最小值,即其对应的(x, y)的位置
参数说明:min_val, max_val, min_loc, max_loc 分别表示最小值,最大值,即对应的位置, ret输入的矩阵

3. cv2.rectangle(img, (x, y), (x+w. y+h), (0, 0, 255), 2) 用于在图像上画出矩阵

参数说明:img表示图片,(x, y)表示矩阵左上角的位置,(x+w, y+h)表示矩阵右下角的位置, (0, 0, 255)表示颜色,2表示线条

模板匹配:表示使用一个图像的模板,在一副主图上:从左到右,从上到下进行滑动,每次只滑动一个像素,最终结果的维度为(h - ht + 1, w - wt + 1),

h表示主图的长,ht表示模板的长, w表示主图的宽,wt表示模板的宽

对于结果的求法:这里使用几个指标:

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

这是模板匹配中的6个指标

第一个指标,用于计算均分根误差,均方根误差越小,表示模板与主图的部分匹配度越高

第二个指标,表示相关性, 即dot(x, y), 相关性越大说明,模板与主图部分的匹配度越高

第三个指标, 表示相关性系数,即dot(x-x', y-y') x' 和 y’表示的是x的均值和y的均值,相关性系数越大,模板与主图部分的匹配度越高

下面三个指标的归一化表示,  /sqrt(dot(∑x^2 + ∑y^2)) , 下面是数学公式

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

单个目标的模板匹配

代码:

第一步:读入目标图片,读入模板图片,对目标图片和模板图片进行灰度化操作

第二步:使用cv2.matchtemplate(img, template, cv2.TM_CCOEFF_NORMED) 进行模板匹配,获得大量的ret结果
第三步:使用min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)  # 找出最大值数所在的位置

第四步:使用cv2.rectangle(original, max_loc, (max_loc[0] + w, max_loc[1] + h), (0, 0, 255), 2) 进行画图操作

第五步:我们对上述的方法进行循环,尝试各种方法所得到的结果

import cv2
import numpy as np
import matplotlib.pyplot as plt original = cv2.imread('lena.jpg')
img = cv2.imread('lena.jpg', 0)
template = cv2.imread('face.jpg', 0) h, w = template.shape[:2] methods = ['cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCOEFF', 'cv2.TM_SQDIFF_NORMED', 'cv2.TM_SQDIFF',
'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED']
ret = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret) draw_img = original.copy()
ret = cv2.rectangle(draw_img, max_loc, (max_loc[0]+w, max_loc[1]+h), (0, 0, 255), 2)
cv2.imshow('ret', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

for method in methods:
draw_img = img.copy()
op = eval(method)
ret = cv2.matchTemplate(img, template, op)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)
if method in ['cv2.TM_SQDIFF_NORMED', 'cv2.TM_SQDIFF']:
loc = min_loc
else:
loc = max_loc
rect = cv2.rectangle(draw_img, loc, (loc[0] + w, loc[1] + h), (0, 0, 255), 2)
plt.subplot(121)
plt.imshow(ret, cmap='gray')
plt.title(method)
plt.subplot(122)
plt.imshow(rect, cmap='gray')
plt.title(method)
plt.show()

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

多目标匹配, 多目标匹配使用的是一个阈值,当大于这个阈值时,我们认为已经获得一个目标的匹配值

而使用cv2.matchTemplate匹配出的ret实际是一些上述指标的数值

代码:

第一步:读入图片,对目标图片和模板进行灰度化

第二步:匹配模板,获得ret

第三步:使用np.where(ret>0.8) 删选合适的位置,这个位置是(0, 2)即0表示竖的,2表示横着的

第四步:使用index[::-1]将位置进行调换,使用*index[::-1]使得矩阵发生拆分,使用zip进行两两组合

第五步:使用cv2.rectangle进行画多个矩阵

第六步:使用cv2.imshow展示图片

original = cv2.imread('mario.jpg')
img = cv2.imread('mario.jpg', 0)
template = cv2.imread('mario_coin.jpg', 0)
h, w = template.shape[:2]
ret = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED) index = np.where(ret > 0.8) draw_img = original.copy()
for i in zip(*index[::-1]):
rect = cv2.rectangle(draw_img, i, (i[0]+w, i[1]+h), (0, 0, 255), 1) cv2.imshow('rect', np.hstack((original, rect)))
cv2.waitKey(0)
cv2.destroyAllWindows()

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配)  2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)的更多相关文章

  1. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  2. 机器学习进阶-图像金字塔与轮廓检测-图像金字塔-(**高斯金字塔) 1.cv2.pyrDown(对图片做向下采样) 2.cv2.pyrUp(对图片做向上采样)

    1.cv2.pyrDown(src)  对图片做向下采样操作,通常也可以做模糊化处理 参数说明:src表示输入的图片 2.cv2.pyrUp(src) 对图片做向上采样操作 参数说明:src表示输入的 ...

  3. 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换

    一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ...

  4. indexOf() 如何判断一个元素在指定数组中是否存在? 找出指定元素出现的所有位置? indexOf()方法 是正序查找,lastIndexOf()是倒叙查找

    indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1. let a = [2, 9, 7, 8, 9]; a.indexOf(2); // 0 a.indexOf ...

  5. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

  6. C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

    #include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...

  7. 机器学习进阶-图像特征sift-SIFT特征点 1&period;cv2&period;xfeatures2d&period;SIFT&lowbar;create&lpar;实例化sift&rpar; 2&period; sift&period;detect&lpar;找出关键点&rpar; 3&period;cv2&period;drawKeypoints&lpar;画出关键点&rpar; 4&period;sift&period;compute&lpar;根据关键点计算sift向量&rpar;

    1. sift = cv2.xfeatures2d.SIFT_create() 实例化 参数说明:sift为实例化的sift函数 2. kp = sift.detect(gray, None)  找出 ...

  8. lastIndexOf&lpar;&rpar; 找出指定元素出现的所有位置(返回的是下标数组)---lastIndexOf&lpar;&rpar; 这个方法是倒叙查找,正序的是indexOf&lpar;&rpar;

    var indices = []; var array = ['a', 'b', 'a', 'c', 'a', 'd']; var element = 'a'; var idx = array.las ...

  9. 数组中的最大值以及最小值的位置变换的问题(C&plus;&plus;)

    将一个5×5的数组中的最大值放到数组的中心位置 分析:遍历数组,找到最大的元素,然后将该元素与中心位置的元素交换位置 #include<iostream> #include <std ...

随机推荐

  1. 【转】内核编译时, 到底用make clean&comma; make mrproper还是make distclean&lpar;转载&rpar;

    原文网址:http://dongyulong.blog.51cto.com/1451604/449470 内核编译时, 到底用make clean, make mrproper还是make distc ...

  2. mongodb (一)

    #mongodb安装(3.4.0) #下载安装包,解压 mkdir /data/mongodb cd /data/mongodb mkdir log conf data bin vim conf/mo ...

  3. iosiOStextView实现文字高度自适应

    跟为textView设置提示性文字一样   需要在textView的代理方法中实现如下 如有偏差  请谅解 定义UITextView,实现UITextViewDelegate: -(UITextVie ...

  4. 性能测试培训:批量执行Jmeter脚本之ant调用

    性能测试培训:批量执行Jmeter脚本之ant调用   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的load ...

  5. 简述ES6其他的东西

    第一是修饰器是ES7的一个提案,现在Babel转码器已经支持.那么什么是修饰器呢,修饰器是对类的行为的改变,在代码编译时发生的,而不是在运行时发生的且修饰器只能用于类和类的方法.修饰器可以接受三个函数 ...

  6. 7&period; Buffer&lowbar;包描述文件&lowbar;npm常用指令&lowbar;fs文件读写&lowbar;模块化require的规则

    1. Buffer 一个和数组类似的对象,不同是 Buffer 是专门用来保存二进制数据的. 特点: 大小固定: 在创建时就确定了,且无法调整 性能较好: 直接对计算机的内存进行操作 每个元素大小为1 ...

  7. Docker系列之Docker镜像&lpar;读书笔记&rpar;

    一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...

  8. CEF之CefSettings设置locale

    参考:https://blog.csdn.net/xiezhongyuan07/article/details/84402083 在开发过程遇到一个问题,CEF加载一个静态页面,然后在静态页面上有一个 ...

  9. windows下简单验证码识别——完美验证码识别系统

    此文已由作者徐迪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 讲到验证码识别,大家第一个可能想到tesseract.诚然,对于OCR而言,tesseract确实很强大,自带 ...

  10. WinFrom柱形图

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...