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下的Mysql模块MySQLdb安装详解
Apr 09 Python
python和flask中返回JSON数据的方法
Mar 26 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python 模拟贷款卡号生成规则过程解析
Aug 30 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
Python 实现简单的客户端认证
Jul 29 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
opencv读取视频并保存图像的方法
Jun 04 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
Python可视化学习之matplotlib内置单颜色
Feb 24 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
QueryPath PHP 中的jQuery
2010/04/11 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
非常好的js代码
2006/06/27 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
Python常用的json标准库
2019/02/19 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
二年级学生期末评语
2014/12/26 职场文书
三方合作意向书范本
2015/05/09 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers