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实现删除Android工程中的冗余字符串
Jan 19 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python Socket使用实例
Dec 18 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
Python函数的默认参数设计示例详解
Dec 01 Python
django haystack实现全文检索的示例代码
Jun 24 Python
一文读懂Python 枚举
Aug 25 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
简单的php 验证图片生成函数
2009/05/21 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
Yii框架登录流程分析
2014/12/03 PHP
jQuery 浮动广告实现代码
2008/12/25 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
nodejs集成sqlite使用示例
2017/06/05 NodeJs
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
python实现堆排序的实例讲解
2020/02/21 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
运动会广播稿50字
2014/01/26 职场文书
晨会主持词
2014/03/17 职场文书
成语的广告词
2014/03/19 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
电力安全事故反思
2014/04/27 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
药房管理制度范本
2015/08/06 职场文书
网络研修随笔感言
2015/11/18 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
python常见的占位符总结及用法
2021/07/02 Python