使用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. java map collection_java 集合----Map、Collection
  2. LINUX应用与发展简介
  3. php加mysql分页_php mysql 分页函数
  4. 进站公交车碾起积水溅上轿车两男子驾车撞伤公交司机
  5. JVM源码---教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看)
  6. java遍历数组练习(for循环、foreach)
  7. Ethernet帧结构
  8. 做到阿里P7和考上985/211哪个更难?
  9. 按钮下载Eclipse Color Theme
  10. 常见移动机器人多角度对比分析(图片版)
  11. chaincode java_基于Hyperledger Fabric交易系统帐户的钱包模型的java Chaincode实例
  12. xp系统internet信息服务器地址,XP系统下Internet信息服务IIS的安装方法
  13. [it-ebooks]电子书列表v0.1.1
  14. 【.Net】asp.net 把图片从CMYK印刷模式转换为RGB原色模式
  15. 密西根州立大学计算机qs分数,密歇根州立大学商科排名怎么样?2021年密歇根州立大学QS商科硕士排名商业分析硕士专业排名第20...
  16. 金融的逻辑1--读书笔记
  17. 暑期集训1期11暑期集训一期12阶段性测验
  18. java数字转为大写_java 数字转大写汉字
  19. 鸿蒙系统电脑适配双面打印机,win10系统实现打印机双面打印的操作方法
  20. 实变函数---不可测集的一个例子

热门文章

  1. Quartz-CronTrigger参数解释
  2. sdf模型插入gazebo_ros_control插件
  3. “星光大道”总冠军是大连修车工
  4. python mysql 双主_keepalived+mysql双主复制高可用方案
  5. Linux 查看PCI设备命令---lspci
  6. acm新手小白必看系列之(9)——栈精讲及例题
  7. 相机标定、双目相机标定(原理)、三维重建效果展示
  8. 极客学院 JAVA视频教程
  9. SAS实验四 一元回归分析
  10. MFC--关于NOTIFYICONDATA的一些新特性