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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。