xml 转换 --倾斜文本矩形框 (cx,cy,w,h,ang)到四个角坐标点(x1,y1,x2,y2,x3,y3,x4,y4)

程序实现了由倾斜文本矩形框 (cx,cy,w,h,ang)到四个角坐标点(x1,y1,x2,y2,x3,y3,x4,y4)的转换 ,由于现有xml格式不符合voc格式要求 ,故先读取读取.xml文件,提出 (cx,cy,w h,ang) 数据 ,再转换到
(x1,y1,x2,y2,x3,y3,x4,y4)批量写入

ang范围(-90~0~90),坐标系与hough 变换中的相同


# coding: utf-8

# ## 舰船参考
# 
# function []=Get_Local_img(MeanPos,bow_angle,length,width)
# 
# width=width/2; %舰宽
# 
# Bow_x=MeanPos(1,1);
# Bow_y=MeanPos(2,1);
# 
# Tail_x=MeanPos(1,1)+length*cos(bow_angle);
# Tail_y=MeanPos(2,1)-length*sin(bow_angle);
# %Local_img=gray(MeanPos_y(1)-n/4*sin(MeanThea):MeanPos_y(1)+10*sin(MeanThea),MeanPos_x(1)-10*cos(MeanThea):MeanPos_x(1)+n/4*cos(MeanThea));
# 
#     %Bow A- B  
# BowA_x=round(Bow_x+width*cos(pi/2+bow_angle)); 
# BowA_y=round(Bow_y-width*sin(pi/2+bow_angle));
# 
# BowB_x=round(Bow_x-width*cos(pi/2+bow_angle));
# BowB_y=round(Bow_y+width*sin(pi/2+bow_angle));
#     %Tail A- B 
# TailA_x=round(Tail_x+width*cos(pi/2+bow_angle));
# TailA_y=round(Tail_y-width*sin(pi/2+bow_angle));
# 
# TailB_x=round(Tail_x-width*cos(pi/2+bow_angle));
# TailB_y=round(Tail_y+width*sin(pi/2+bow_angle));
# 
# hold on
# plot([BowA_x,BowB_x,TailB_x,TailA_x,BowA_x],[BowA_y,BowB_y,TailB_y,TailA_y,BowA_y],'r','LineWidth',0.3)

# In[1]:


import os  
import xml.etree.ElementTree as ET
import math
from lxml.etree import Element, SubElement, tostring
import pprint
from xml.dom.minidom import parseString
import glob

origin_ann_dir = 'voc_ship/JPEGImages/'  
new_ann_dir = 'text/'
pi=3.141592


#解析文件名出来

xml_Lists = glob.glob(origin_ann_dir + '/*.xml')
len(xml_Lists)

xml_basenames = [] # e.g. 100.jpg
for item in xml_Lists:
    xml_basenames.append(os.path.basename(item))

    
    
xml_names = []   # e.g. 100
for item in xml_basenames:
    temp1, temp2 = os.path.splitext(item)
    xml_names.append(temp1)


    
    
for it in xml_names:        
    tree = ET.parse(os.path.join(origin_ann_dir,str(it)+'.xml'))
    root=tree.getroot()

    #HRSC_Objects=root.findall('HRSC_Objects')
    node_root = Element('annotation')
    node_folder = SubElement(node_root, 'folder')
    node_folder.text = 'train_images'
    node_filename = SubElement(node_root, 'filename')
    node_filename.text = str(it)+'.bmp'#str(1) + '.jpg'
    node_size = SubElement(node_root, 'size')
    node_width = SubElement(node_size, 'width')
    node_width.text = root.find('width').text
    node_height = SubElement(node_size, 'height')
    node_height.text = root.find('height').text
    node_depth = SubElement(node_size, 'depth')
    node_depth.text = root.find('depth').text

    for Object in root.findall('./HRSC_Objects/HRSC_Object'):
        mbox_cx=float(Object.find('mbox_cx').text)
        mbox_cy=float(Object.find('mbox_cy').text)
        mbox_w =float(Object.find('mbox_w').text)
        mbox_h =float(Object.find('mbox_h').text)
        mbox_ang=float(Object.find('mbox_ang').text)
        print(mbox_cx,mbox_cy,mbox_w,mbox_h,mbox_ang)

        #计算舰首 与舰尾点坐标

        bow_x=mbox_cx+mbox_w/2*math.cos(mbox_ang)
        bow_y=mbox_cy+mbox_w/2*math.sin(mbox_ang)

        tail_x=mbox_cx-mbox_w/2*math.cos(mbox_ang)
        tail_y=mbox_cy-mbox_w/2*math.sin(mbox_ang)

        #print(bow_x,bow_y,tail_x,tail_y)
        
        
        bowA_x=round(bow_x+mbox_h/2*math.sin(mbox_ang))
        bowA_y=round(bow_y-mbox_h/2*math.cos(mbox_ang))

        bowB_x=round(bow_x-mbox_h/2*math.sin(mbox_ang))
        bowB_y=round(bow_y+mbox_h/2*math.cos(mbox_ang))


        tailA_x=round(tail_x+mbox_h/2*math.sin(mbox_ang))
        tailA_y=round(tail_y-mbox_h/2*math.cos(mbox_ang))

        tailB_x=round(tail_x-mbox_h/2*math.sin(mbox_ang))
        tailB_y=round(tail_y+mbox_h/2*math.cos(mbox_ang))

        #print(bow_x,bow_y,tail_x,tail_y)
        print(bowA_x,bowA_y,bowB_x,bowB_y,tailA_x,tailA_y,tailB_x,tailB_y)
        node_object = SubElement(node_root, 'object')
        node_name = SubElement(node_object, 'name')
        node_name.text = 'text'
        node_difficult = SubElement(node_object, 'difficult')
        node_difficult.text = '0'
        node_bndbox = SubElement(node_object, 'bndbox')


        node_x1 = SubElement(node_bndbox, 'x1')
        node_x1.text=str(bowA_x)
        node_y1 = SubElement(node_bndbox, 'y1')
        node_y1.text=str(bowA_y)

        node_x2 = SubElement(node_bndbox, 'x2')
        node_x2.text=str(bowB_x)
        node_y2 = SubElement(node_bndbox, 'y2')
        node_y2.text=str(bowB_y)



        node_x3 = SubElement(node_bndbox, 'x3')
        node_x3.text=str(tailA_x)
        node_y3 = SubElement(node_bndbox, 'y3')
        node_y3.text=str(tailA_y)

        node_x4 = SubElement(node_bndbox, 'x4')
        node_x4.text=str(tailB_x)
        node_y4 = SubElement(node_bndbox, 'y4')
        node_y4.text=str(tailB_y)    








        node_xmin = SubElement(node_bndbox, 'xmin')
        node_xmin.text = str(min(bowA_x,bowB_x,tailA_x,tailB_x))
        node_ymin = SubElement(node_bndbox, 'ymin')
        node_ymin.text = str(min(bowA_y,bowB_y,tailA_y,tailB_y))
        node_xmax = SubElement(node_bndbox, 'xmax')
        node_xmax.text = str(max(bowA_x,bowB_x,tailA_x,tailB_x))
        node_ymax = SubElement(node_bndbox, 'ymax')
        node_ymax.text = str(max(bowA_y,bowB_y,tailA_y,tailB_y))

    #break
    xml = tostring(node_root, pretty_print=True)  #格式化显示,该换行的换行
    dom = parseString(xml)
    fw = open(os.path.join(new_ann_dir,str(it)+'.xml'), 'wb')
    fw.write(xml)
    print ("xml _ ok")
    fw.close()    
    
    
    

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值