python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
文件目录
Annotations中是XML文件。
JPEGImages中是对应的JPG文件
XML文件
要截取bndbox坐标中的内容。
python代码
#-*-coding:utf-8-*-
#@Time:2020/2/822:14
#@Author:SanZhi
#@File:get_xml.py
#@Software:PyCharm
importcv2
importnumpyasnp
importxml.dom.minidom
importos
importargparse
defmain():
#JPG文件的地址
img_path='D:/ser/JPEGImages/'
#XML文件的地址
anno_path='D:/ser/Annotations/'
#存结果的文件夹
cut_path='D:/ser/cut/'
#获取文件夹中的文件
imagelist=os.listdir(img_path)
forimageinimagelist:
image_pre,ext=os.path.splitext(image)
img_file=img_path+image
img=cv2.imread(img_file)
xml_file=anno_path+image_pre+'.xml'
DOMTree=xml.dom.minidom.parse(xml_file)
collection=DOMTree.documentElement
objects=collection.getElementsByTagName("object")
forobjectinobjects:
print("start")
bndbox=object.getElementsByTagName('bndbox')[0]
xmin=bndbox.getElementsByTagName('xmin')[0]
xmin_data=xmin.childNodes[0].data
ymin=bndbox.getElementsByTagName('ymin')[0]
ymin_data=ymin.childNodes[0].data
xmax=bndbox.getElementsByTagName('xmax')[0]
xmax_data=xmax.childNodes[0].data
ymax=bndbox.getElementsByTagName('ymax')[0]
ymax_data=ymax.childNodes[0].data
xmin=int(xmin_data)
xmax=int(xmax_data)
ymin=int(ymin_data)
ymax=int(ymax_data)
img_cut=img[ymin:ymax,xmin:xmax,:]
cv2.imwrite(cut_path+'cut_img_{}.jpg'.format(image_pre),img_cut)
if__name__=='__main__':
main()
补充知识:python读取XML中bndbox和objectname的方法
直接贴代码了,封装为了函数,直接调用即可。其中有几个点需要注意。
1、bndbox下面有4个子对象,因此不能直接使用firstChild来找到内容,需要从该对象里面继续寻找标签为xmin等这样的对象,注意要加[0]才正确,有问题的可以直接调试,然后看变量的结构,根据变量的结构来调用某一对象。
2、将空格''替换为'_',方便命名。但是使用str.replace('','_')不会直接改变str的内容,返回的字符串是改变后的,因此需要变量保存。
importxml.dom.minidomasxmldom
defget_bndboxfromxml(imageNum,xmlfilebasepath):
#读取xml文件
bndbox=[0,0,0,0]
xmlfilepath=xmlfilebasepath+"\%06d"%imageNum+'.xml'
#print(xmlfilepath)
domobj=xmldom.parse(xmlfilepath)
elementobj=domobj.documentElement
sub_element_obj=elementobj.getElementsByTagName('bndbox')
ifsub_element_objisnotNone:
bndbox[0]=int(sub_element_obj[0].getElementsByTagName('xmin')[0].firstChild.data)
bndbox[1]=int(sub_element_obj[0].getElementsByTagName('ymin')[0].firstChild.data)
bndbox[2]=int(sub_element_obj[0].getElementsByTagName('xmax')[0].firstChild.data)
bndbox[3]=int(sub_element_obj[0].getElementsByTagName('ymax')[0].firstChild.data)
returnbndbox
defget_bndboxnamefromxml(imageNum,xmlfilebasepath):
bndbox=[0,0,0,0]
xmlfilepath=xmlfilebasepath+"\%06d"%imageNum+'.xml'
domobj=xmldom.parse(xmlfilepath)
elementobj=domobj.documentElement
sub_element_obj=elementobj.getElementsByTagName('name')
name=sub_element_obj[0].firstChild.data.replace('','_')
returnname
以上这篇python截取XML中bndbox的坐标中的图像,另存为jpg的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。