使用python批量将xml文件中的polygon转换到bndbox

import xml.dom.minidom
import os.path

path = "D:/pythonProject/polygonToBndboxS/Anno/winecellar"#路径
files = os.listdir(path)  # 返回文件夹中的文件名列表
print(files)

for xmlFile in files:
    if not os.path.isdir(xmlFile):#os.path.isdir()用于判断对象是否为一个目录

        #如果不是目录,则直接打开

        name1 = xmlFile.split('.')[0]
        print(name1)
        dom = xml.dom.minidom.parse(path+'\\'+xmlFile)# 打开xml文档
        print(dom)

        # 得到文档元素对象

        root = dom.documentElement

        movies = root.getElementsByTagName("object")

    for movie in movies:

        print("*****Movie*****")

        ##################返回ployog下的piont点的值,以str形式

        xmin = 10000000

        xmax = 0

        ymin = 10000000

        ymax = 0

        #########这就很容易取点取到空集,研究了一整天,发现可以通过childNodes解决这件事情,但是有个弊端,就是这个只能根据位置取,没办法根据名字取

        z = movie.getElementsByTagName('polygon')[0].childNodes
        # print('__________________')
        for pp in range(len(z)):

            if z[pp].nodeName == "pt":#注意这里的名字,也可能是point
                a = z[pp].getElementsByTagName('x')[0].childNodes[0].data

                xmin = min(xmin, int(a))

                xmax = max(xmax, int(a))

                b = z[pp].getElementsByTagName('y')[0].childNodes[0].data

                ymin = min(ymin, int(b))

                ymax = max(ymax, int(b))

                # print(a, b)

        print(xmin, xmax)

        print(ymin, ymax)

        movie.removeChild(movie.getElementsByTagName('polygon')[0])

        ###########这儿是生成新的节点,试过其他方式,都不行,通过dir()找到一个ownerDocument属性,完美解决,dir()是神器啊

        zd = movie.ownerDocument

        bbox = zd.createElement('bbox')

        movie.appendChild(bbox)

        xx = zd.createElement('xmax')

        xn = zd.createElement('xmin')

        yx = zd.createElement('ymax')

        yn = zd.createElement('ymin')

        xx_text = zd.createTextNode(str(xmax))

        xx.appendChild(xx_text)

        # xx.nodeValue=xmax

        ##############尝试通过xn.nodeVelue对xn赋值,但是输出xml时赋予的值消失了,并不显示。换成下面的方式,要将数值变成str

        xn_text = zd.createTextNode(str(xmin))

        yx_text = zd.createTextNode(str(ymax))

        yn_text = zd.createTextNode(str(ymin))

        xn.appendChild(xn_text)

        yx.appendChild(yx_text)

        yn.appendChild(yn_text)

        bbox.appendChild(xx)

        bbox.appendChild(xn)

        bbox.appendChild(yx)

        bbox.appendChild(yn)

        try:
            with open(path+'\\'+xmlFile, 'w', encoding='UTF-8') as fh:
                # 4.writexml()第一个参数是目标文件对象,第二个参数是根节点的缩进格式,第三个参数是其他子节点的缩进格式,
                # 第四个参数制定了换行格式,第五个参数制定了xml内容的编码。
                dom.writexml(fh, indent='', addindent='\t', newl='\n', encoding='UTF-8')
                print('OK')
        except Exception as err:
            print('错误:{err}'.format(err=err))

        # zd.appendChild(bbox)    

参考:
https://www.jianshu.com/p/0b331e761aa5
https://www.cnblogs.com/wcwnina/p/7222180.html
https://zhuanlan.zhihu.com/p/102760157

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值