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

 更新时间:2020年03月10日 10:15:39   作者:ssqsssq  
这篇文章主要介绍了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生成可执行文件之PyInstaller库的使用方式

    Python生成可执行文件之PyInstaller库的使用方式

    PyInstaller是一个十分有用的第三方库,通过对源文件打包,Python程序可以在没有安装Python的环境中运行,也可以作为一个独立文件方便传递和管理,下面这篇文章主要给大家介绍了关于Python生成可执行文件之PyInstaller库的使用方式,需要的朋友可以参考下
    2022-04-04
  • python+appium实现自动化测试的示例代码

    python+appium实现自动化测试的示例代码

    appium是一个开源的测试自动化框架,可以与原生的、混合的和移动的web应用程序使用,本文主要介绍了python+appium实现自动化测试的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Python函数isalnum用法示例小结

    Python函数isalnum用法示例小结

    isalnum()函数是Python中的一个内置函数,用于判断字符串是否只由数字和字母组成,其内部实现原理比较简单,只需遍历字符串中的每一个字符即可,这篇文章主要介绍了Python函数isalnum用法介绍,需要的朋友可以参考下
    2024-01-01
  • 使用Python的turtle模块绘制樱花树的代码示例

    使用Python的turtle模块绘制樱花树的代码示例

    Python的turtle模块是一个直观的图形化编程工具,让用户通过控制海龟在屏幕上的移动来绘制各种形状和图案,在接下来的文章中,我将通过一个生动的例子——绘制一幅樱花树图画——来深入探讨turtle模块的实用性,需要的朋友可以参考下
    2024-04-04
  • Python3利用openpyxl读写Excel文件的方法实例

    Python3利用openpyxl读写Excel文件的方法实例

    这篇文章主要给大家介绍了关于Python3利用openpyxl读写Excel文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python文件打开方式实例详解【a、a+、r+、w+区别】

    Python文件打开方式实例详解【a、a+、r+、w+区别】

    这篇文章主要介绍了Python文件打开方式,结合实例形式详细分析了Python文件打开函数的使用及a、a+、r+、w+等属性功能、使用区别与相关操作注意事项,需要的朋友可以参考下
    2019-03-03
  • django将网络中的图片,保存成model中的ImageField的实例

    django将网络中的图片,保存成model中的ImageField的实例

    今天小编就为大家分享一篇django将网络中的图片,保存成model中的ImageField的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python获取指定时间差的时间实例详解

    python获取指定时间差的时间实例详解

    这篇文章主要介绍了python获取指定时间差的时间实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • python中使用ctypes调用so传参设置遇到的问题及解决方法

    python中使用ctypes调用so传参设置遇到的问题及解决方法

    这篇文章主要介绍了python中使用ctypes调用so传参设置,本文较详细的给大家介绍了遇到问题及解决方案,需要的朋友可以参考下
    2019-06-06
  • PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决办法

    PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决办法

    这篇文章主要给大家介绍了关于PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决的相关资料,主要是 matplotlib版本过高导致的,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06

最新评论