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

OpenCV | 模版匹配

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline

模版匹配

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

 face.jpg

lena.jpg

#模版匹配
img = cv2.imread('lena.jpg',0)
template = cv2.imread('face.jpg',0)
h,w = template.shape[:2]

 查看相关参数:

img.shape
template.shape
  • TM_SQDIFF : 计算平方不同,计算出来的值越小,越相关
  • TM_COORR :计算相关性,计算出来的值越大,越相关
  • TM_CCOEFF : 计算相关系统,计算出来的值越大,越相关
  • TM_SQDIFF_NORMED :计算归一化平方不同,计算出来的值越接近0,越相关
  • TM_CCORR_NORMED: 计算归一化相关性,计算出来的值越接近1,越相关
  • TM_CCOEFF_NORMED : 计算归一化相关系数,计算出来的值越接近1,越相关
methods = ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']

res = cv2.matchTemplate(img,template,cv2.TM_SQDIFF)
res.shape

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

min_val

max_val

min_loc

max_loc

 

for meth in methods:
    img2 = img.copy()
    
    #匹配方法的真值
    method = eval(meth)
    print (method)
    res = cv2.matchTemplate(img,template,method)
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
    
    #如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    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(img2,top_left,bottom_right,255,2)
    
    plt.subplot(121),plt.imshow(res,cmap='gray')
    plt.xticks([]),plt.yticks([]) #隐藏坐标轴
    plt.subplot(122),plt.imshow(img2,cmap = 'gray')
    plt.xticks([]),plt.yticks([])
    plt.suptitle(meth)
    plt.show()

运行出的结果

匹配多个目标对象

 mario_coin.jpg

mario.jpg

img_rgb = cv2.imread('mario.jpg')
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.jpg',0)
h,w = template.shape[:2]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
#匹配成都大于%80 的坐标
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]): #*号表示可选参数
    bottom_right = (pt[0] + w, pt[1] +h)
    cv2.rectangle(img_rgb,pt,bottom_right,(0,0,255),2)
    
cv2.imshow('img_rgb',img_rgb)
cv2.waitKey(0)

运行结果:


http://www.kler.cn/news/148726.html

相关文章:

  • SpringCloudAlibaba整合Gateway实现网关
  • stm32 TIM
  • 【Docker项目实战】使用Docker部署Plik临时文件上传系统
  • 车载以太网-DHCP
  • Python中的datetime库
  • 硬件工程师助理怎么买器件
  • 08-学成在线项目中统一异常处理的规范
  • C# WPF上位机开发(乘法计算小软件)
  • 面试:MyBatis问题
  • 论文阅读——DDeP(cvpr2023)
  • 2017年五一杯数学建模C题宜居城市问题值解题全过程文档及程序
  • Web前端开发技术:图像与多媒体文件
  • OpenCvSharp从入门到实践-(05)通道
  • ABAP算法 模拟退火
  • c语言 / 指针错误的几种情况
  • 从 0 到 1 开发一个 node 命令行工具
  • 【Linux驱动开发】环境搭建Linux驱动开发环境
  • EDA实验-----正弦信号发生器的设计(Quartus II )
  • asp.net core HttpContextAccessor类
  • springBoot的实现原理;SpringBoot是什么;使用SpringBoot的核心功能;springBoot核心注解以及核心配置文件
  • qt QString字符串常用转换
  • Vue3指令:搜索框输入防抖实现(附源码)
  • 单片机复位电路
  • 【华为OD题库-036】跳格子2-java
  • springBoot设置多数据源
  • uniapp地图基本使用及解决添加markers不生效问题?
  • Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名
  • 力扣 39. 组合总和 递归解法
  • Linux处理系统常见命令
  • [个人笔记] vCenter6.7使用自建SSL证书