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

2020-09-24 0 790

文件目录

Annotations中是XML文件。

JPEGImages中是对应的JPG文件

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

XML文件

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

要截取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 python 截取XML中bndbox的坐标中的图像,另存为jpg的实例 http://www.ox520.com/24887.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

遇见资源网

遇见资源网是国内优秀的WordPress主题开发团队, 超过6年开发经验,专注WordPress主题开发建站, UI设计,seo等服务;并提供有保障的维护及售后!

我知道了