python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
时间:2020-03-10来源:电脑系统城作者:电脑系统城
文件目录
Annotations中是XML文件。
JPEGImages中是对应的JPG文件
XML文件
要截取bndbox坐标中的内容。
python代码
- # -*- coding: utf-8 -*-
- # @Time : 2020/2/8 22:14
- # @Author : SanZhi
- # @File : get_xml.py
- # @Software: PyCharm
- import cv2
- import numpy as np
-
- import xml.dom.minidom
- import os
- import argparse
-
- def main():
- # JPG文件的地址
- img_path = 'D:/ser/JPEGImages/'
- # XML文件的地址
- anno_path = 'D:/ser/Annotations/'
- # 存结果的文件夹
- cut_path = 'D:/ser/cut/'
- # 获取文件夹中的文件
- imagelist = os.listdir(img_path)
-
- for image in imagelist:
- 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")
-
- for object in objects:
- 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和object name的方法
直接贴代码了,封装为了函数,直接调用即可。其中有几个点需要注意。
1、bndbox下面有4个子对象,因此不能直接使用firstChild来找到内容,需要从该对象里面继续寻找标签为xmin等这样的对象,注意要加[0]才正确,有问题的可以直接调试,然后看变量的结构,根据变量的结构来调用某一对象。
2、将空格' '替换为'_',方便命名。但是使用str.replace(' ', '_')不会直接改变str的内容,返回的字符串是改变后的,因此需要变量保存。
- import xml.dom.minidom as xmldom
- def get_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')
- if sub_element_obj is not None:
- 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)
- return bndbox
-
-
- def get_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(' ', '_')
-
- return name
以上这篇python 截取XML中bndbox的坐标中的图像,另存为jpg的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关信息