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


Posted in Python onMarch 10, 2020

文件目录

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开发微信支付的注意事项
Aug 19 Python
Python3 socket同步通信简单示例
Jun 07 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
快速了解python leveldb
Jan 18 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
python画双y轴图像的示例代码
Jul 07 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
Python虚拟环境的创建和使用详解
Sep 07 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
python神经网络学习 使用Keras进行回归运算
May 04 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 #Python
Python读取VOC中的xml目标框实例
Mar 10 #Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 #Python
python代码xml转txt实例
Mar 10 #Python
Python切割图片成九宫格的示例代码
Mar 10 #Python
pycharm设置python文件模板信息过程图解
Mar 10 #Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 #Python
You might like
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
python list转dict示例分享
2014/01/28 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
详解python中sort排序使用
2019/03/23 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
python with语句的原理与用法详解
2020/03/30 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
综合测评自我鉴定
2013/10/08 职场文书
语文教育专业应届生求职信
2013/11/23 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
大四学生个人总结
2015/02/15 职场文书
网聊搭讪开场白
2015/05/28 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL