系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 脚本中心 > python > 详细页面

python 截取XML中bndbox的坐标中的图像,另存为jpg的实例

时间:2020-03-10来源:电脑系统城作者:电脑系统城

文件目录

Annotations中是XML文件。

JPEGImages中是对应的JPG文件

python 截取XML中bndbox的坐标中的图像,另存为jpg的实例

XML文件

python 截取XML中bndbox的坐标中的图像,另存为jpg的实例

要截取bndbox坐标中的内容。

python代码


 
  1. # -*- coding: utf-8 -*-
  2. # @Time : 2020/2/8 22:14
  3. # @Author : SanZhi
  4. # @File : get_xml.py
  5. # @Software: PyCharm
  6. import cv2
  7. import numpy as np
  8.  
  9. import xml.dom.minidom
  10. import os
  11. import argparse
  12.  
  13. def main():
  14. # JPG文件的地址
  15. img_path = 'D:/ser/JPEGImages/'
  16. # XML文件的地址
  17. anno_path = 'D:/ser/Annotations/'
  18. # 存结果的文件夹
  19. cut_path = 'D:/ser/cut/'
  20. # 获取文件夹中的文件
  21. imagelist = os.listdir(img_path)
  22.  
  23. for image in imagelist:
  24. image_pre, ext = os.path.splitext(image)
  25. img_file = img_path + image
  26. img = cv2.imread(img_file)
  27. xml_file = anno_path + image_pre + '.xml'
  28. DOMTree = xml.dom.minidom.parse(xml_file)
  29. collection = DOMTree.documentElement
  30. objects = collection.getElementsByTagName("object")
  31.  
  32. for object in objects:
  33. print("start")
  34. bndbox = object.getElementsByTagName('bndbox')[0]
  35. xmin = bndbox.getElementsByTagName('xmin')[0]
  36. xmin_data = xmin.childNodes[0].data
  37. ymin = bndbox.getElementsByTagName('ymin')[0]
  38. ymin_data = ymin.childNodes[0].data
  39. xmax = bndbox.getElementsByTagName('xmax')[0]
  40. xmax_data = xmax.childNodes[0].data
  41. ymax = bndbox.getElementsByTagName('ymax')[0]
  42. ymax_data = ymax.childNodes[0].data
  43. xmin = int(xmin_data)
  44. xmax = int(xmax_data)
  45. ymin = int(ymin_data)
  46. ymax = int(ymax_data)
  47. img_cut = img[ymin:ymax, xmin:xmax, :]
  48. cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre), img_cut)
  49.  
  50.  
  51. if __name__ == '__main__':
  52. main()
  53.  

补充知识:python读取XML中bndbox和object name的方法

直接贴代码了,封装为了函数,直接调用即可。其中有几个点需要注意。

1、bndbox下面有4个子对象,因此不能直接使用firstChild来找到内容,需要从该对象里面继续寻找标签为xmin等这样的对象,注意要加[0]才正确,有问题的可以直接调试,然后看变量的结构,根据变量的结构来调用某一对象。

2、将空格' '替换为'_',方便命名。但是使用str.replace(' ', '_')不会直接改变str的内容,返回的字符串是改变后的,因此需要变量保存。


 
  1. import xml.dom.minidom as xmldom
  2. def get_bndboxfromxml(imageNum, xmlfilebasepath):
  3. # 读取xml文件
  4. bndbox = [0, 0, 0, 0]
  5. xmlfilepath = xmlfilebasepath + "\%06d" % imageNum+'.xml'
  6. # print(xmlfilepath)
  7. domobj = xmldom.parse(xmlfilepath)
  8. elementobj = domobj.documentElement
  9. sub_element_obj = elementobj.getElementsByTagName('bndbox')
  10. if sub_element_obj is not None:
  11. bndbox[0] = int(sub_element_obj[0].getElementsByTagName('xmin')[0].firstChild.data)
  12. bndbox[1] = int(sub_element_obj[0].getElementsByTagName('ymin')[0].firstChild.data)
  13. bndbox[2] = int(sub_element_obj[0].getElementsByTagName('xmax')[0].firstChild.data)
  14. bndbox[3] = int(sub_element_obj[0].getElementsByTagName('ymax')[0].firstChild.data)
  15. return bndbox
  16.  
  17.  
  18. def get_bndboxnamefromxml(imageNum, xmlfilebasepath):
  19. bndbox = [0, 0, 0, 0]
  20. xmlfilepath = xmlfilebasepath + "\%06d" % imageNum + '.xml'
  21. domobj = xmldom.parse(xmlfilepath)
  22. elementobj = domobj.documentElement
  23. sub_element_obj = elementobj.getElementsByTagName('name')
  24. name = sub_element_obj[0].firstChild.data.replace(' ', '_')
  25.  
  26. return name

以上这篇python 截取XML中bndbox的坐标中的图像,另存为jpg的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

分享到:

相关信息

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载