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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
详细介绍Ruby中的正则表达式
Apr 10 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
Python中str.format()详解
Mar 12 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
python通过zabbix api获取主机
Sep 17 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
PyCharm最新激活码PyCharm2020.2.3有效
Nov 18 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
实例讲解PHP表单处理
2019/02/15 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
js GridView 实现自动计算操作代码
2009/03/25 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
vue中 v-for循环的用法详解
2020/02/19 Javascript
Python tkinter事件高级用法实例
2018/01/31 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
SQL中where和having的区别
2012/06/17 面试题
火锅店创业计划书范文
2014/02/02 职场文书
学生感冒英文请假条
2014/02/04 职场文书
青春寄语大全
2014/04/09 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
法院答辩状格式
2015/05/22 职场文书
公务员处分决定书
2015/06/25 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
使用pandas模块实现数据的标准化操作
2021/05/14 Python
python源码剖析之PyObject详解
2021/05/18 Python
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS