Python 读取xml数据,cv2裁剪图片实例
下载的数据是pascalvoc2012的数据,已经有annotation了,不过是xml格式的,训练的模型是在Google模型的基础上加了两层网络,因此要在原始图像中裁剪出用于训练的部分图像。
另外,在原来给的标注框的基础上,做了点框的移动。最后同类目标存储在同一文件夹中。
from__future__importdivision
importos
fromPILimportImage
importxml.dom.minidom
importnumpyasnp
ImgPath='C:/Users/Desktop/XML_try/img/'
AnnoPath='C:/Users/Desktop/XML_try/xml/'
ProcessedPath='C:/Users/Desktop/CropedVOC/'
imagelist=os.listdir(ImgPath)
forimageinimagelist:
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')#[]
filename=filenamelist[0].childNodes[0].data
objectlist=annotation.getElementsByTagName('object')
i=1
forobjectsinobjectlist:
namelist=objects.getElementsByTagName('name')
objectname=namelist[0].childNodes[0].data
savepath=ProcessedPath+objectname
ifnotos.path.exists(savepath):
os.makedirs(savepath)
bndbox=objects.getElementsByTagName('bndbox')
cropboxes=[]
forboxinbndbox:
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)
forcropboxincropboxes:
cropedimg=img.crop(cropbox)
cropedimg.save(savepath+'/'+image_pre+'_'+str(i)+'.jpg')
i+=1
补充知识:python-----截取xml文件画框的图片并保存
from__future__importdivision
importos
fromPILimportImage
importxml.dom.minidom
importnumpyasnp
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)
forimageinimagelist:
image_pre,ext=os.path.splitext(image)
imgfile=ImgPath+image
print(imgfile)
ifnotos.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
forobjectsinobjectlist:
namelist=objects.getElementsByTagName('name')
objectname=namelist[0].childNodes[0].data
savepath=ProcessedPath+objectname
ifnotos.path.exists(savepath):
os.makedirs(savepath)
bndbox=objects.getElementsByTagName('bndbox')
cropboxes=[]
forboxinbndbox:
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)
forcropboxincropboxes:
cropedimg=img.crop(cropbox)
cropedimg.save(savepath+'/'+image_pre+'_'+str(i)+'.jpg')
i+=1
以上这篇Python读取xml数据,cv2裁剪图片实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。