当前位置: 首页 > news >正文

Opencv图像模板匹配

引言

什么是模板匹配呢?

看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等。

模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。

一、匹配方法:cv2.matchTemplate(img, templ, method)


参数:(img: 原始图像、temple: 模板图像、method: 匹配度计算方法)

方法如下: 

cv2.TM_SQDIFF: 计算平方差,计算结果越小,越相关

公式:

cv2.TM_CCORR: 计算相关性,计算出来的值越大,越相关

公式:

cv2.TM_CCOEFF: 计算相关系数,计算出的值越大,越相关

公式:

cv2.TM_SQDIFF_NORMED: 计算归一化平方差,计算结果越接近0,越相关

公式:

 

cv2.TM_CCORR_NORMED: 计算归一化相关性,计算结果越接近1,越相关

公式:

cv2.TM_CCOEFF_NORMED: 计算归一化相关系数,计算结果越接近1,越相关

 公式:

 二、匹配单个对象

img代表原始图像,template代表模板窗口,1默认为cv2.TM_SQDIFF方法

res = cv2.matchTemplate(img, template, 1) 

 获取结果的最值和最值位置(最值位置是左上角的坐标位置,通过模板的宽和高可以在原图上把模板位置画出来)

min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)

 完整的代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img=cv2.imread('C:/Users/bwy/Desktop/7.png',0)
template=cv2.imread('C:/Users/bwy/Desktop/8.png',0)
methods=['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED'
        ,'cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
for meth in methods:
    img3=img.copy()
    method=eval(meth)
    print(meth)
    res1=cv2.matchTemplate(img,template,method)
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res1)
    if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:
        top_left=min_loc
    else:
        top_left=max_loc
    bottom_right=(top_left[0]+w,top_left[1]+h)
    #俩矩形
    cv2.rectangle(img3,top_left,bottom_right,255,2)
    plt.subplot(121),plt.imshow(res1,cmap='gray')
    plt.xticks([]),plt.yticks([])#隐藏坐标轴
    plt.subplot(122),plt.imshow(img3,cmap='gray')
    plt.xticks([]),plt.yticks([])#隐藏坐标轴
    plt.suptitle(meth)
    plt.show()

结果如图所示:

 

 多次实验你会发现归一的方法更准确。

 三、匹配多个对象

 1.导包构建函数

import cv2
import numpy as np
import matplotlib.pyplot as plt
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 2.读入图像转灰度图,改大小。

im=cv2.imread('C:/Users/bwy/Desktop/9.png')
TE=cv2.imread('C:/Users/bwy/Desktop/10.png',cv2.IMREAD_GRAYSCALE)
im1=cv2.resize(im,(600,337))
cv_show('im',im1)
img_=cv2.cvtColor(im1,cv2.COLOR_BGR2GRAY)
TE=cv2.resize(TE,(60,60))
TE.shape

 3.图像匹配

h,w=TE.shape[:2]
r=cv2.matchTemplate(img_,TE,cv2.TM_CCOEFF_NORMED)
cv_show('r',r)

 结果如图所示:

4.取匹配程度大于75%的坐标 ,画在原图上

其中:zip(*) 可理解为解压,返回二维矩阵式。loc中loc[0]是高,loc[1]是宽,[::-1]表示倒序。p[0]代表宽,p[1]代表高

threshold=0.75
loc=np.where(r>=threshold)
for pt in zip(*loc[::-1]):#*代表可选参数
    bottom_right=(pt[0]+w,pt[1]+h)
    cv2.rectangle(im1,pt,bottom_right,(0,0,255),1)
cv_show('im1',im1)

 结果如图所示:

相关文章:

  • c语言进阶: 指针的进阶(上)
  • python使用PIL模块加载图像、通过resize函数改变图像的大小、使用save函数保存处理过的图像
  • Python点云显示:open3d快速上手
  • vue转electron项目以及使用fs报错:Module not found: Error: Can‘t resolve ‘fs‘ in解决办法
  • 【MATLAB教程案例14】基于ACO蚁群优化算法的函数极值计算matlab仿真及其他应用
  • 优化算法 - Adam算法
  • Open3D (C++) 点云变换
  • 黑白照片修复彩色软件免费有哪些?分享这三个实用的软件给你
  • CSS基础入门手册
  • python-- for循环的基础语法
  • _Linux进程控制
  • vue3.0--1.vue3.0环境集成、setup、ref函数、reactive函数、计算属性(computed)
  • 基于Opencv5.x(C++)流媒体视频流实现网页浏览器人脸检测
  • 网络安全——XSS跨站脚本攻击
  • AT24C02存储与读取数据
  • CSS盒模型深入
  • iOS | NSProxy
  • javascript 总结(常用工具类的封装)
  • JDK 6和JDK 7中的substring()方法
  • JS实现简单的MVC模式开发小游戏
  • magento2项目上线注意事项
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Nacos系列:Nacos的Java SDK使用
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vue2.0 实现互斥
  • 成为一名优秀的Developer的书单
  • 从0到1:PostCSS 插件开发最佳实践
  • 近期前端发展计划
  • 聚簇索引和非聚簇索引
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何用vue打造一个移动端音乐播放器
  • 如何在GitHub上创建个人博客
  • 使用Swoole加速Laravel(正式环境中)
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信支付JSAPI,实测!终极方案
  • 鱼骨图 - 如何绘制?
  • Prometheus VS InfluxDB
  • 阿里云服务器如何修改远程端口?
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何在招聘中考核.NET架构师
  • # 计算机视觉入门
  • (30)数组元素和与数字和的绝对差
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)ssm高校实验室 毕业设计 800008
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (转)http协议
  • (转载)Google Chrome调试JS
  • (转载)hibernate缓存
  • .gitignore文件---让git自动忽略指定文件
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)