使用opencv自带的模板匹配

1、目标匹配函数:cv2.matchTemplate()
res=cv2.matchTemplate(image, templ, method, result=None, mask=None)
image:待搜索图像
templ:模板图像
result:匹配结果
method:计算匹配程度的方法,主要有以下几种:
CV_TM_SQDIFF    平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR    相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF    相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED    计算归一化平方差,计算出来的值越接近0,越相关
CV_TM_CCORR_NORMED    计算归一化相关性,计算出来的值越接近1,越相关
CV_TM_CCOEFF_NORMED    计算归一化相关系数,计算出来的值越接近1,越相关

待检测的图片如下,需要检测里面金币的位置

需要检测金币的模板如下:

2、基本的多对象模板匹配效果代码如下:

import cv2
import numpy as np
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)
#np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序
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.imwrite("001.jpg",img_rgb)
cv2.imshow('img_rgb', img_rgb)
cv2.waitKey(0)

检测效果如下:

通过上图可以看到对同一个图有多个框标定,需要去重,只需要保留一个

解决方案:对于使用同一个待检区域使用NMS进行去掉重复的矩形框

3、使用NMS对模板匹配出来的矩形框进行去掉临近重复的,代码如下:

import cv2
import time
import numpy as npdef py_nms(dets, thresh):"""Pure Python NMS baseline."""#x1、y1、x2、y2、以及score赋值# (x1、y1)(x2、y2)为box的左上和右下角标x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]scores = dets[:, 4]#每一个候选框的面积areas = (x2 - x1 + 1) * (y2 - y1 + 1)#order是按照score降序排序的order = scores.argsort()[::-1]# print("order:",order)keep = []while order.size > 0:i = order[0]keep.append(i)#计算当前概率最大矩形框与其他矩形框的相交框的坐标,会用到numpy的broadcast机制,得到的是向量xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])#计算相交框的面积,注意矩形框不相交时w或h算出来会是负数,用0代替w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h#计算重叠度IOU:重叠面积/(面积1+面积2-重叠面积)ovr = inter / (areas[i] + areas[order[1:]] - inter)#找到重叠度不高于阈值的矩形框索引inds = np.where(ovr <= thresh)[0]# print("inds:",inds)#将order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把这个1加回来order = order[inds + 1]return keepdef template(img_gray,template_img,template_threshold):'''img_gray:待检测的灰度图片格式template_img:模板小图,也是灰度化了template_threshold:模板匹配的置信度'''h, w = template_img.shape[:2]res = cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)start_time = time.time()loc = np.where(res >= template_threshold)#大于模板阈值的目标坐标score = res[res >= template_threshold]#大于模板阈值的目标置信度#将模板数据坐标进行处理成左上角、右下角的格式xmin = np.array(loc[1])ymin = np.array(loc[0])xmax = xmin+wymax = ymin+hxmin = xmin.reshape(-1,1)#变成n行1列维度xmax = xmax.reshape(-1,1)#变成n行1列维度ymax = ymax.reshape(-1,1)#变成n行1列维度ymin = ymin.reshape(-1,1)#变成n行1列维度score = score.reshape(-1,1)#变成n行1列维度data_hlist = []data_hlist.append(xmin)data_hlist.append(ymin)data_hlist.append(xmax)data_hlist.append(ymax)data_hlist.append(score)data_hstack = np.hstack(data_hlist)#将xmin、ymin、xmax、yamx、scores按照列进行拼接thresh = 0.3#NMS里面的IOU交互比阈值keep_dets = py_nms(data_hstack, thresh)print("nms time:",time.time() - start_time)#打印数据处理到nms运行时间dets = data_hstack[keep_dets]#最终的nms获得的矩形框return dets
if __name__ == "__main__":img_rgb = cv2.imread('mario.jpg')#需要检测的图片img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)#转化成灰色template_img = cv2.imread('mario_coin.jpg', 0)#模板小图template_threshold = 0.8#模板置信度dets = template(img_gray,template_img,template_threshold)count = 0for coord in dets:cv2.rectangle(img_rgb, (int(coord[0]),int(coord[1])), (int(coord[2]),int(coord[3])), (0, 0, 255), 2)cv2.imwrite("result.jpg",img_rgb)

检测效果如下所示:

参考资料:

  • https://blog.csdn.net/qq_39507748/article/details/104598222
  • https://docs.opencv.org/3.4/d4/dc6/tutorial_py_template_matching.html
  • https://blog.csdn.net/mdjxy63/article/details/81037860
  • https://github.com/rbgirshick/fast-rcnn/blob/master/lib/utils/nms.py
  • https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/

opencv模板匹配相同位置去除重复的框相关推荐

  1. OpenCV模板匹配Template Matching

    OpenCV模板匹配Template Matching 模板匹配Template Matching 目标 理论 什么是模板匹配? OpenCV提供哪些匹配方法? 代码 解释 结果 模板匹配Templa ...

  2. opencv 模板匹配(cvMatchTemplate)

    opencv 模板匹配(cvMatchTemplate) 模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置.例如在 ...

  3. OpenCV模板匹配识别图片中的数字

    OpenCV模板匹配识别图片中的数字 前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出"读取失败". 操作 ...

  4. 图像匹配与OpenCV模板匹配

    介绍 (Introduction) As a data scientist at VATBox, I've mainly worked on projects which at their core ...

  5. OpenCV模板匹配函数:matchTemplate()介绍

    OpenCV模板匹配函数:matchTemplate()介绍

  6. opencv 模板匹配_详细剖析模板匹配

    点击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 模板匹配介绍 我们需要2幅图像: 原图像 (I): 在这幅图像里, ...

  7. opencv 模板匹配,在图像中寻找物体

    使用模板匹配在图像中寻找物体 模板匹配 模板匹配就是用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置: opencv中用 cv.matchTemplate() 实现模板匹配. 模板匹 ...

  8. OpenCV 模板匹配去重

    根据不同匹配结果间的距离远近进行去重操作. 文章目录 检测效果 源码 代码难点 检测效果 源码 import cv2 import numpy as np import timedef get_rea ...

  9. 基于opencv模板匹配的单目标跟踪

    基于模板的物体跟踪 模板匹配 核心函数 完整代码 效果展示 多目标检测 模板匹配 调用函数: cv.matchTemplate(image, templ, method, result=None, m ...

最新文章

  1. python 终止、结束、退出 代码
  2. linux服务器ntp客户端配置【转】
  3. 数字图像处理实验(总计23个)汇总
  4. 【数据结构与算法】之有序数组中的单一元素的算法
  5. 扩展 日历_日历功能的拓展:Apple Watch能在屏幕上显示年日历
  6. 调研Android的开发环境的发展演变
  7. QQ,MSN,SKYPE等在线状态代码
  8. 应用SELinux中的目标策略限制进程运行
  9. 基于区块链技术的数据安全共享网络体系研究_基于区块链技术的用户信息隐私保护与共享方案...
  10. 基于模板的通用代码生成器LKGenerator(三)-模板示例
  11. 扑克牌图片一张一张_扑克牌玩法 | 简单易上手的扑克游戏,重点是你没玩过!...
  12. 剖析WordPress模板文件【转】
  13. 人群密度分析算法调研
  14. syn_sent mysql_服务器上出现大量的SYN_RECV或者SYN_SENT状态的TCP连接的问题分析
  15. python 绘制RGB三维颜色空间色谱图(已实现)
  16. BIOS知识枝桠——UEFI Driver
  17. 清橙OJ A1036.分解质因数
  18. 产品经理:能不能让这串数字滚动起来?
  19. c语言指针一步错步步错,一步错步步错,可是到底错在哪里
  20. 接口测试-post常见数据提交方式

热门文章

  1. Dynamo-【NO.03】Revit交互节点
  2. 《coredump问题原理探究》Linux x86版6.3节有成员变量的类coredump例子
  3. 黄芪、西洋参都能补气,有何区别?哪个效果更好?怎么选?搞懂了
  4. Android实现简单的加法器,加法器的实现
  5. 笔记本快速连接到不同的WIFI并设备IP获取方式为DHCP或固定IP地址。
  6. β射线与哪些物质可产生较高的韧致辐射_放射卫生学复习重点(完整版)
  7. 上海亚商投顾:沪指高开高走涨1.31% 汽车整车板块领涨
  8. 产品创新设计:品牌价值提升的主要途径
  9. ms08-067漏洞利用
  10. 2019北京国际眼镜展 北京思柏润携旗下品牌惊艳京城