Python 读取xml数据,cv2裁剪图片实例


Posted in Python onMarch 10, 2020

下载的数据是pascal voc2012的数据,已经有annotation了,不过是xml格式的,训练的模型是在Google模型的基础上加了两层网络,因此要在原始图像中裁剪出用于训练的部分图像。

另外,在原来给的标注框的基础上,做了点框的移动。最后同类目标存储在同一文件夹中。

from __future__ import division
import os
from PIL import Image
import xml.dom.minidom
import numpy as np
 
ImgPath = 'C:/Users/Desktop/XML_try/img/' 
AnnoPath = 'C:/Users/Desktop/XML_try/xml/'
ProcessedPath = 'C:/Users/Desktop/CropedVOC/'
 
imagelist = os.listdir(ImgPath)
for image in imagelist:
	image_pre, ext = os.path.splitext(image)
	imgfile = ImgPath + image 
	xmlfile = AnnoPath + image_pre + '.xml'
	
	DomTree = xml.dom.minidom.parse(xmlfile)
	annotation = DomTree.documentElement
 
	filenamelist = annotation.getElementsByTagName('filename') #[<DOM Element: filename at 0x381f788>]
	filename = filenamelist[0].childNodes[0].data
	objectlist = annotation.getElementsByTagName('object')
	
	i = 1
	for objects in objectlist:
		
		namelist = objects.getElementsByTagName('name')
		objectname = namelist[0].childNodes[0].data
 
		savepath = ProcessedPath + objectname
 
		if not os.path.exists(savepath):
			os.makedirs(savepath)
 
		bndbox = objects.getElementsByTagName('bndbox')
		cropboxes = []
 
		for box in bndbox:
			x1_list = box.getElementsByTagName('xmin')
			x1 = int(x1_list[0].childNodes[0].data)
			y1_list = box.getElementsByTagName('ymin')
			y1 = int(y1_list[0].childNodes[0].data)
			x2_list = box.getElementsByTagName('xmax')
			x2 = int(x2_list[0].childNodes[0].data)
			y2_list = box.getElementsByTagName('ymax')
			y2 = int(y2_list[0].childNodes[0].data)
 
			w = x2 - x1
			h = y2 - y1
 
			obj = np.array([x1,y1,x2,y2])
			shift = np.array([[0.8,0.8,1.2,1.2],[0.9,0.9,1.1,1.1],[1,1,1,1],[0.7,0.7,1,1],[1,1,1.2,1.2],\
				[0.7,1,1,1.2],[1,0.7,1.2,1],[(x1+w*1/3)/x1,(y1+h*1/3)/y1,(x2+w*1/3)/x2,(y2+h*1/3)/y2],\
				[(x1-w*1/3)/x1,(y1-h*1/3)/y1,(x2-w*1/3)/x2,(y2-h*1/3)/y2]])
 
			XYmatrix = np.tile(obj,(9,1)) 
			cropboxes = XYmatrix * shift
 
			img = Image.open(imgfile)
			for cropbox in cropboxes:
				cropedimg = img.crop(cropbox)
				cropedimg.save(savepath + '/' + image_pre + '_' + str(i) + '.jpg')
				i += 1

补充知识:python-----截取xml文件画框的图片并保存

from __future__ import division
import os
from PIL import Image
import xml.dom.minidom
import numpy as np
ImgPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\output/'
AnnoPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\Annotations/'
ProcessedPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\cut/'

imagelist = os.listdir(ImgPath)

for image in imagelist:
  image_pre, ext = os.path.splitext(image)
  imgfile = ImgPath + image
  print(imgfile)
  if not os.path.exists(AnnoPath + image_pre + '.xml' ):
    continue
  xmlfile = AnnoPath + image_pre + '.xml'
  DomTree = xml.dom.minidom.parse(xmlfile)
  annotation = DomTree.documentElement
  filenamelist = annotation.getElementsByTagName('filename')
  filename = filenamelist[0].childNodes[0].data
  objectlist = annotation.getElementsByTagName('object')
  i = 1
  for objects in objectlist:
    namelist = objects.getElementsByTagName('name')
    objectname = namelist[0].childNodes[0].data
    savepath = ProcessedPath + objectname
    if not os.path.exists(savepath):
      os.makedirs(savepath)
    bndbox = objects.getElementsByTagName('bndbox')
    cropboxes = []
    for box in bndbox:
      x1_list = box.getElementsByTagName('xmin')
      x1 = int(x1_list[0].childNodes[0].data)
      y1_list = box.getElementsByTagName('ymin')
      y1 = int(y1_list[0].childNodes[0].data)
      x2_list = box.getElementsByTagName('xmax')
      x2 = int(x2_list[0].childNodes[0].data)
      y2_list = box.getElementsByTagName('ymax')
      y2 = int(y2_list[0].childNodes[0].data)
      w = x2 - x1
      h = y2 - y1
      obj = np.array([x1,y1,x2,y2])
      shift = np.array([[1,1,1,1]])
      XYmatrix = np.tile(obj,(1,1))
      cropboxes = XYmatrix * shift
      img = Image.open(imgfile)
      for cropbox in cropboxes:
        cropedimg = img.crop(cropbox)
        cropedimg.save(savepath + '/' + image_pre + '_' + str(i) + '.jpg')
        i += 1

以上这篇Python 读取xml数据,cv2裁剪图片实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python ElementTree 基本读操作示例
Apr 09 Python
Python实现抓取城市的PM2.5浓度和排名
Mar 19 Python
python实现清屏的方法
Apr 30 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
Python3实现的判断回文链表算法示例
Mar 08 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
pandas取出重复数据的方法
Jul 04 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python requests库参数提交的注意事项总结
Mar 29 Python
python代码xml转txt实例
Mar 10 #Python
Python切割图片成九宫格的示例代码
Mar 10 #Python
pycharm设置python文件模板信息过程图解
Mar 10 #Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 #Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 #Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 #Python
python标准库OS模块详解
Mar 10 #Python
You might like
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
Django URL参数Template反向解析
2020/11/24 Python
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
初中学生期末评语
2014/04/24 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
灵魂歌王观后感
2015/06/17 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS
Vue的过滤器你真了解吗
2022/02/24 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js