简介

主要是通过python的opencv进行模板匹配识别到想要得到的物体;

然后通过opencv进行裁切图片,得到最终需要的图片


核心内容

①模板匹配,带有nms的模板匹配

②批量处理图片,并保存


代码

import os
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)  # 大于模板阈值的目标坐标,返回的就是矩阵的行列索引值,其中行坐标为坐标的y值,列坐标为x值score = res[res >= template_threshold]# 大于模板阈值的目标置信度cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)[res >= template_threshold]完整写法# 将模板数据坐标进行处理成左上角、右下角的格式xmin = np.array(loc[1])#列坐标为x值ymin = np.array(loc[0])#横坐标为y值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按照列进行拼接       np.hstack():在水平方向上平铺  np.vstack():在竖直方向上堆叠thresh = 0.3  # NMS里面的IOU交互比阈值keep_dets = py_nms(data_hstack, thresh)print("nms time:", time.time() - start_time)dets = data_hstack[keep_dets]  return detsdef saveresult(name,file,img_rgb):isExists = os.path.exists("./"+ str(name)+'/')if not isExists:  # 判断如果文件不存在,则创建os.makedirs("./"+ str(name)+'/')print("./"+ str(name)+'/'+"目录创建成功")out =str(file.split('.')[0])filename="./"+ name+'/%s.jpg'%(out)print('已匹配图片:'+filename)cv2.imwrite(filename, img_rgb)def savecut(name,file,cut):isExists = os.path.exists("./"+ str(name)+'/')if not isExists:  # 判断如果文件不存在,则创建os.makedirs("./"+ str(name)+'/')print("./"+ str(name)+'/'+"目录创建成功")out =str(file.split('.')[0])filename="./"+ name+'/%s.jpg'%(out)print('已裁切图片:'+filename)cv2.imwrite(filename, cut)if __name__ == "__main__":jpg_path = "./images/"  # 图片存放文件夹的路径file_walk = os.listdir(jpg_path)for file in file_walk:file1 = os.path.join(jpg_path, file)img_rgb = cv2.imread(file1)img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template_img = cv2.imread('1.jpg', 0)  # 模板template_threshold = 0.45 # 模板置信度dets = template(img_gray, template_img, template_threshold)for coord in dets:cv2.rectangle(img_rgb, (int(coord[0]), int(coord[1])), (int(coord[2]), int(coord[3])), (0, 0, 255), 2)cut = img_rgb[int(coord[1]):int(coord[3]),int(coord[0]):int(coord[2])]#裁切坐标为(y0:y1,x0:x1)save1 = saveresult('save',file,img_rgb)save2 = savecut('savepicture',file,cut)print("*******************************************************************************")print('*                            已完成模板匹配任务                                *')print("*******************************************************************************")

参考、致谢

非常感谢下列博主写出的优秀好文

http://t.csdn.cn/UQBZr

http://t.csdn.cn/o7Ln8

http://t.csdn.cn/oVJgm

http://t.csdn.cn/9cJb4

希望本人写的代码能给大家带来一丝便利,谢谢大家支持

python批量实现模板匹配处理,并将图片进行标记和裁剪保存相关推荐

  1. Python+OpenCV:模板匹配(Template Matching)

    Python+OpenCV:模板匹配(Template Matching) Template Matching with Single Objects ######################## ...

  2. Python+Opencv实现模板匹配

    目录 一.模板匹配简介 二.传统模板匹配算法不足之处 三.多尺度模板匹配实现步骤 四.多尺度模板匹配实现代码 五.多尺度模板匹配效果展示和分析 六.思维扩展 参考资料 注意事项 一.模板匹配简介    ...

  3. python批量识别图片中文字_python实现中文图片文字识别--OCR about chinese text--tesseract...

    0.我的环境: win7 32bits python 3.5 pycharm 5.0 1.相关库 安装pillow: pip install pillow 安装tesseract: 自带了英文语言包, ...

  4. 用Python批量爬取2种格式的图片并下载

    欢迎加入QQ学习交流群,与我们一起学习,一起进步吧! 群号:225361733 可以QQ扫一扫加入群聊哦! 本文使用编程猫官网进行教学,敬请谅解,不过本文作者通过自己钻研在第3次更新中推出了爬2种格式 ...

  5. python批量添加水印_python 给目录下的图片批量加水印

    python 给目录下的图片批量加水印 water.py 放到 图片文件夹里 然后cd 到当前文件夹 python water.py #coding=utf-8 import Image import ...

  6. 使用Python批量提取Word文档中的图片

    1.导入需要的包 import zipfile import shuti 2.设置文档路径和图片路径 ,并用zipfile读取Word文件 doc_path = './a.docx' #在这里更换你想 ...

  7. python批量提取word文档中的图片(含图片格式转换和GUI)

    作者:小小明 文章目录 doc格式批量转为docx 批量提取docx文档的图片 批量图片格式转换 完整代码 GUI图形化工具开发 打包exe 给GUI加入进度条 日常工作中,领导要求你将一份 Word ...

  8. python中cv2、Image和plt的图片打开、显示和保存

    使用cv2.Image.plt打开.显示和保存图片 文章目录 使用cv2.Image.plt打开.显示和保存图片 0.读取图片 1.使用cv2显示cv2打开的图片 2.使用cv2显示Image打开的图 ...

  9. 模板匹配,特征点匹配-全

    cnn网络: superpoint 18年的, https://github.com/magicleap/SuperPointPretrainedNetwork cnn图像匹配:权重5m torch ...

最新文章

  1. sql server schema下拉不到存储过程_mysql数据库字符编码总结--数据存储编码
  2. 用paddleocr识别汉字_汉字设计中的度量标准(三)
  3. 阿里、美团、拼多多、网易大厂面试之Redis+多线程+JVM+微服务...
  4. linux环境下创建postgis数据库,linux下搭建postgresql、postgis、pg_pathman环境步骤详解...
  5. 【C/C++】值传递和址传递区别解析
  6. Oracle查询对应表是否在使用,oracle 中查询当前用户可以看到的表名、表对应的所有字段...
  7. AndEngine 动态更新Text文本内容时报ArrayIndexOutOfBoundsException错误的解决
  8. js基础-20-js对象赋值时的key值问题
  9. linux学习之vi编辑器的使用详解
  10. 安装ie11提示计算机安装了更新的版本,离线安装IE11浏览器提示quot;获取更新quot;解决方法 - 191路由网...
  11. BUUCTF:sqltest
  12. 中小学教师资格证报名入口 出现请添加兼容性站点怎么办?
  13. 将安卓手机投屏到win10上
  14. 计算机硬盘没内存怎么办,电脑内存不够用怎么办
  15. html包zip有错误是什么意思,解压缩文件出现错误是什么回事
  16. Cherry键盘-windows键-没反应
  17. 给网站添加代码统计-实现流量的变现
  18. 【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)
  19. 黑马头条----首页和登录模块
  20. JavaWeb - 网页 GZIP 压缩检测

热门文章

  1. 【深度】通俗了解异构计算
  2. hdu1852 Beijing 2008(约数之和 : 无逆元除法取模 | 等比数列分治求和)
  3. springboot+hibernate+jpa+SessionFactory项目搭建
  4. 学生信息系统——优化总结(干货篇一)
  5. 从大型语言模型LLM走向人工通用智能AGI的改进方向(public)
  6. fullSensor
  7. BigDecimal 转换成 Long数据类型
  8. C++完成淄博烧烤节管理系统
  9. 【汇正财经顾晨浩】大盘窄幅震荡
  10. shell脚本执行SQL