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基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
python读取word文档,插入mysql数据库的示例代码
Nov 07 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
python代码中怎么换行
Jun 17 Python
Python中Selenium库使用教程详解
Jul 23 Python
python爬虫中抓取指数的实例讲解
Dec 01 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
国内php原创论坛
2006/10/09 PHP
数据库的日期格式转换
2006/10/09 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
如何编写jquery插件
2017/03/29 jQuery
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python实现的中国剩余定理算法示例
2017/08/05 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
深入了解Python 变量作用域
2020/07/24 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
如何提高JDBC的性能
2013/04/30 面试题
SQL语言面试题
2013/08/27 面试题
小学校园活动策划
2014/01/30 职场文书
给面试官的感谢信
2014/02/01 职场文书
客服部工作职责范本
2014/02/14 职场文书
租房协议书范本
2014/04/09 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
Python 绘制多因子柱状图
2022/05/11 Python