Python读取VOC中的xml目标框实例


Posted in Python onMarch 10, 2020

代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# get annotation object bndbox location
import os
import cv2
try:
  import xml.etree.cElementTree as ET #解析xml的c语言版的模块
except ImportError:
  import xml.etree.ElementTree as ET
											     
##get object annotation bndbox loc start 
def GetAnnotBoxLoc(AnotPath):#AnotPath VOC标注文件路径
  tree = ET.ElementTree(file=AnotPath) #打开文件,解析成一棵树型结构
  root = tree.getroot()#获取树型结构的根
  ObjectSet=root.findall('object')#找到文件中所有含有object关键字的地方,这些地方含有标注目标
  ObjBndBoxSet={} #以目标类别为关键字,目标框为值组成的字典结构
  for Object in ObjectSet:
    ObjName=Object.find('name').text
    BndBox=Object.find('bndbox')
    x1 = int(BndBox.find('xmin').text)#-1 #-1是因为程序是按0作为起始位置的
    y1 = int(BndBox.find('ymin').text)#-1
    x2 = int(BndBox.find('xmax').text)#-1
    y2 = int(BndBox.find('ymax').text)#-1
    BndBoxLoc=[x1,y1,x2,y2]
    if ObjName in ObjBndBoxSet:
    	ObjBndBoxSet[ObjName].append(BndBoxLoc)#如果字典结构中含有这个类别了,那么这个目标框要追加到其值的末尾
    else:
    	ObjBndBoxSet[ObjName]=[BndBoxLoc]#如果字典结构中没有这个类别,那么这个目标框就直接赋值给其值吧
  return ObjBndBoxSet
##get object annotation bndbox loc end

def display(objBox,pic):
  img = cv2.imread(pic)
  
  for key in objBox.keys():
    for i in range(len(objBox[key])):
      cv2.rectangle(img, (objBox[key][i][0],objBox[key][i][1]), (objBox[key][i][2], objBox[key][i][3]), (0, 0, 255), 2)    
      cv2.putText(img, key, (objBox[key][i][0],objBox[key][i][1]), cv2.FONT_HERSHEY_COMPLEX, 1, (255,0,0), 1)
  cv2.imshow('img',img)
  cv2.imwrite('display.jpg',img)
  cv2.waitKey(0)


if __name__== '__main__':
  pic = r"./VOCdevkit/VOC2007/JPEGImages/000282.jpg"
  ObjBndBoxSet=GetAnnotBoxLoc(r"./VOCdevkit/VOC2007/Annotations/000282.xml")
  print(ObjBndBoxSet)
  display(ObjBndBoxSet,pic)

输出结果:

{'chair': [[335, 263, 484, 373]], 'person': [[327, 104, 476, 300], [232, 57, 357, 374], [3, 32, 199, 374], [58, 139, 296, 374]]}

图示:

Python读取VOC中的xml目标框实例

补充知识:使用python将voc类型标注xml文件对图片进行目标还原,以及批量裁剪特定类

使用标注工具如labelimg对图片物体进行voc类型标注,会生成xml文件,如何判断别人的数据集做的好不好,可以用以下代码进行目标还原。

import xml.etree.cElementTree as ET
import cv2
import os
import glob

def GetAnnotBoxLoc(AnotPath):
  tree = ET.ElementTree(file=AnotPath)
  root = tree.getroot()
  ObjectSet=root.findall('object')
  ObjBndBoxSet={} 
  for Object in ObjectSet:
    ObjName=Object.find('name').text
    BndBox=Object.find('bndbox')
    x1 = int(BndBox.find('xmin').text)
    y1 = int(BndBox.find('ymin').text)
    x2 = int(BndBox.find('xmax').text)
    y2 = int(BndBox.find('ymax').text)
    BndBoxLoc=[x1,y1,x2,y2]
    if ObjName in ObjBndBoxSet:
    	ObjBndBoxSet[ObjName].append(BndBoxLoc)
    else:
    	ObjBndBoxSet[ObjName]=[BndBoxLoc]
  return ObjBndBoxSet

def GetAnnotName(AnotPath):
  tree = ET.ElementTree(file=AnotPath) 
  root = tree.getroot()
  path=root.find('path').text
  return path

def Drawpic(xml_path,result_path):
  n = 0
  xmls = glob.glob(os.path.join(xml_path, '*.xml'))
  for xml in xmls:
    n = n + 1
    box=GetAnnotBoxLoc(xml)
    path=GetAnnotName(xml)
    img = cv2.imread(path)
    for classes in list(box.keys()):
      for boxes in box[classes]:
        if classes == "bad1":
          cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(255,0,0),3) #blue
        if classes == "bad2":
          cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,255,0),3) #green
        if classes == "bad3":
          cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,0,255),3) #red
    cv2.imwrite(result_path+"/"+str(n)+"_result.jpg", img)
    print(path,"还原成功")

Drawpic("/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations","/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/test")

使用labelimg对图像进行标注,folder目录需要修改一下

import xml.etree.ElementTree as ET
import os

for i in os.listdir('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'):
  tree = ET.parse('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)
  root = tree.getroot()
  print(root.find('folder').text)
  root.find('folder').text = 'VOC2012'
  print(root.find('folder').text)
  tree.write('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)

批量裁剪特定类,xml.dom.minidom好像比xml.etree.cElementTree好用啊。

#coding=utf-8
import xml.dom.minidom
import cv2
import os

for name in os.listdir("./Annotations/"):
  dom=xml.dom.minidom.parse("./Annotations/"+name)
  root=dom.documentElement
  object_name=root.getElementsByTagName('name')
  if(object_name[0].firstChild.data == "normal"):
    print(name)
    xmin=root.getElementsByTagName('xmin')
    ymin=root.getElementsByTagName('ymin')
    xmax=root.getElementsByTagName('xmax')
    ymax=root.getElementsByTagName('ymax')

    x_min = int(xmin[0].firstChild.data)
    y_min = int(ymin[0].firstChild.data)
    x_max = int(xmax[0].firstChild.data)
    y_max = int(ymax[0].firstChild.data)

    img=cv2.imread("./JPEGImages/"+name[:-4]+".jpg")
    cropped=img[y_min:y_max,x_min:x_max]
    cv2.imwrite("./cut_jpg/"+name[:-4]+".jpg", cropped)

以上这篇Python读取VOC中的xml目标框实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python计算时间差的方法
May 20 Python
Python在线运行代码助手
Jul 15 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
python 使用值来排序一个字典的方法
Nov 16 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
python turtle 绘制太极图的实例
Dec 18 Python
python实现堆排序的实例讲解
Feb 21 Python
python输入中文的实例方法
Sep 14 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
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 #Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 #Python
You might like
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
php Static关键字实用方法
2010/06/04 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python学习笔记之if语句的使用示例
2017/10/23 Python
python实现黑客字幕雨效果
2018/06/21 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
详解Python 切片语法
2019/06/10 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python类共享变量操作
2020/09/03 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
应届毕业生的自我鉴定
2013/11/13 职场文书
护士自我鉴定总结
2014/03/24 职场文书
毕业论文致谢信
2015/05/14 职场文书