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

文件目录

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的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是 python 截取XML中bndbox的坐标中的图像,另存为jpg的实例 的全部内容, 来源链接: utcz.com/z/312095.html

回到顶部