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学习笔记整理3之输入输出、python eval函数
Dec 14 Python
深入浅出学习python装饰器
Sep 29 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
Python定义函数实现累计求和操作
May 03 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 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
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
Javascript之高级数组API的使用实例
2019/03/08 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue实例的选项总结
2020/06/09 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
深入解析Python中的上下文管理器
2016/06/28 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
Python操作json的方法实例分析
2018/12/06 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Python的缺点和劣势分析
2019/11/19 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
村官学习十八大感想
2014/01/15 职场文书
音乐幼师求职信
2014/07/09 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书