【工具脚本】读取VOC格式的标注xml文件,并修改xml中的内容

功能:读取xml文件,并根据需求修改里面的内容。

1)修改xml文件中标注框的xmin,xmax,ymin,ymax的坐标值,当坐标值越界时,对其进行修改。

2)修改xml中filename的值(即标注文件对应图片的名称)。

注意:使用python3运行,python2运行时会报错(encoding相关的).

# coding=utf-8
import os
import os.path
import xml.dom.minidom

# 将string转换为int
def to_int(str):
    try:
        int(str)
        return int(str)
    except ValueError: #报类型错误,说明不是整型的
        try:
            float(str) #用这个来验证,是不是浮点字符串
            return int(float(str))
        except ValueError:  #如果报错,说明即不是浮点,也不是int字符串。   是一个真正的字符串
            return False

root = r"/data_1/样本"  #根目录路径
path = root + '/xml'   #输入文件夹
save_path = root + '/newxml'  #输出文件夹
if not os.path.isdir(save_path):
    os.makedirs(save_path)
files = os.listdir(path)  # 得到文件夹下所有r文件名称
s = []
for xmlFile in files:
    # 遍历文件夹
    portion = os.path.splitext(xmlFile)
    if not os.path.isdir(xmlFile):
        # 判断是否是文件夹,不是文件夹才打开
        print (xmlFile)

        # xml文件读取操作
        # 将获取的xml文件名送入到dom解析
        dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))
        # 最核心的部分os.path.join(path,xmlFile),路径拼接,输入的是具体路径
        root = dom.documentElement

        # 修改xmin
        xmin = root.getElementsByTagName('xmin')
        for i in range(len(xmin)):
            if to_int(xmin[i].firstChild.data) < 0:
                xmin[i].firstChild.data = 0
                print(">>>>>>>>>>>>>>>>>>>xmin修改为:"+str(xmin[i].firstChild.data))
        
        # 修改ymin
        ymin = root.getElementsByTagName('ymin')
        for i in range(len(ymin)):
            if to_int(ymin[i].firstChild.data) < 0:
                ymin[i].firstChild.data = 0
                print(">>>>>>>>>>>>>>>>>>>ymin修改为:"+str(ymin[i].firstChild.data))
        
        # 获取图像的宽高
        width = 0
        height = 0
        img_w = root.getElementsByTagName('width')
        for i in range(len(img_w)):
            width = to_int(img_w[i].firstChild.data)
        
        img_h = root.getElementsByTagName('height')
        for i in range(len(img_h)):
            height = to_int(img_h[i].firstChild.data)
        
        # 修改xmax
        xmax = root.getElementsByTagName('xmax')
        for i in range(len(xmax)):
            if to_int(xmax[i].firstChild.data) > width:
                xmax[i].firstChild.data = width
                print(">>>>>>>>>>>>>>>>>>>xmax修改为"+str(xmax[i].firstChild.data))
        
        # 修改ymax
        ymax = root.getElementsByTagName('ymax')
        for i in range(len(ymax)):
            if to_int(ymax[i].firstChild.data) > height:
                ymax[i].firstChild.data = height
                print(">>>>>>>>>>>>>>>>>>>ymax修改为:"+str(ymax[i].firstChild.data))

        # # 修改图像的尺寸
        # if width > height:
        #     for i in range(len(img_h)):
        #         img_h[i].firstChild.data = width
        # elif width < height:
        #     for i in range(len(img_w)):
        #         img_w[i].firstChild.data = height
        # else:
        #     print("need not alter!")

        # 保存修改到xml文件中
        with open(os.path.join(save_path, xmlFile), 'w', encoding='UTF-8') as fh:
            dom.writexml(fh)
            print('process...')

        # name = root.getElementsByTagName('name')
        # # pose=root.getElementsByTagName('pose')
        # # 重命名class name
        # for i in range(len(name)):
        #     # print (name[i].firstChild.data)
        #     # print(xmlFile)
        #     # if portion[1] == ".xml":
        #     #     newname = portion[0] + ".jpg"
        #     #     print(newname)
        #     newname = "zero"
        #     if name[i].firstChild.data == "chebiao":
        #         name[i].firstChild.data = newname
        #         print(name[i].firstChild.data)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值