【Xml Tool】 裁剪某个区域重新生成xml

 

该代码功能:
对已经标注好的xml文件进行操作
比如,label A 区域中,有多个label B。
现在我希望我能截取label A区域的图片,并根据原始xml生成lable B 的标注文件

注:label B部分区域在label A 外面的话,则扩大label A裁剪区域,使其包括 label B


xml里面 x为w轴

'''
该代码功能:
对已经标注好的xml文件进行操作
比如,label A 区域中,有多个label B。
现在我希望我能截取label A区域的图片,并根据原始xml生成lable B 的标注文件注:label B部分区域在label A 外面的话,则扩大label A裁剪区域,使其包括 label Bxml里面 x为w轴
'''
import os
import cv2
import xml.etree.ElementTree as ET
import traceback
import copyimages_path="/media/hxzh/SB@home/hxzh/MH_dataset/Towers/dataset_insulator_clip/images"
xmls_path="/media/hxzh/SB@home/hxzh/MH_dataset/Towers/dataset_insulator_clip/xmls"
save_image_path="/media/hxzh/SB@home/hxzh/MH_dataset/Towers/dataset_insulator_clip/save_images"
save_xmls_path="/media/hxzh/SB@home/hxzh/MH_dataset/Towers/dataset_insulator_clip/save_xmls"#所要裁剪区域的标签名字
crop_name="100_0_0"#要生成的标签名
label_name="100_1_0"def read_xml(filename):(fname, suffix) = os.path.splitext(filename)if not os.path.exists(f"{images_path}/{fname}.JPG"):return 0image_ori=cv2.imread(f"{images_path}/{fname}.JPG")is_ok=Truetry :tree = ET.parse(f"{xmls_path}/{filename}")tree_ori=copy.deepcopy(tree)except (BaseException,Exception ) as e:print(filename,traceback.format_exc())return []# 获取宽w和高ha = tree.find('size')w, h = [int(a.find('width').text),int(a.find('height').text)]objects = []if w == 0:return []crop_area=[]label_area=[]for obj in tree.findall('object'):# 获取namename = obj.find('name').textif name==crop_name:# 读取检测框的左上、右下角点的坐标bbox = obj.find('bndbox')x1, y1, x2, y2 = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]#首次确定裁剪区域crop_area.append([x1, y1, x2, y2])elif name==label_name:# 读取检测框的左上、右下角点的坐标bbox = obj.find('bndbox')x1, y1, x2, y2 = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]#首次确定裁剪区域label_area.append([x1, y1, x2, y2])matchs=[]for i in crop_area:match={}match["area"]=imatch["labels"]=[]for j in label_area:if  j[0]>=i[0] and j[0]<=i[2]:if j[1]>=i[1] and j[1]<=i[3] or j[3]>=i[1] and j[3]<=i[3]:match["labels"].append(j)elif j[2]>=i[0] and j[2]<=i[2]:if j[1] >= i[1] and j[1] <= i[3] or j[3] >= i[1] and j[3] <= i[3]:match["labels"].append(j)if len(match["labels"])!=0:min_x=min([k[0] for k in match["labels"]])max_x=max([k[2] for k in match["labels"]])min_y = min([k[1] for k in match["labels"]])max_y = max([k[3] for k in match["labels"]])print(min_x,min_y,max_x,max_y)print(match["area"][0])match["area"][0]=min(match["area"][0] ,min_x)match["area"][1]=min(match["area"][1] ,min_y)match["area"][2]=max(match["area"][2] ,max_x)match["area"][3]=max(match["area"][3] ,max_y)matchs.append(match.copy())#开始根据matchs 进行裁剪图片和生成xmllen_matchs=len(matchs)image_count=0for match in matchs:image_count+=1#分割图片tree_=copy.deepcopy(tree_ori)image_crop=image_ori.copy()[match["area"][1]:match["area"][3],match["area"][0]:match["area"][2],:]cv2.imwrite(f"{save_image_path}/{fname}_{image_count}.JPG",image_crop)save_xml_name=f"{save_xmls_path}/{fname}_{image_count}.xml"ww,hh=image_crop.shape[:2]label_len=len(match["labels"])if label_len==0:continuea = tree_.find('size')a.find('width').text=f"{ww}"a.find('height').text=f"{hh}"if w == 0:return []for ind ,ob in enumerate( tree_.findall('object')):# 获取nameif ind<label_len:ob.find('name').text=f"{label_name}"bbox = ob.find("bndbox")bbox.find("xmin").text = f"{match['labels'][ind][0]-match['area'][0]}"bbox.find("ymin").text = f"{match['labels'][ind][1]-match['area'][1]}"bbox.find("xmax").text = f"{match['labels'][ind][2]-match['area'][0]}"bbox.find("ymax").text = f"{match['labels'][ind][3]-match['area'][1]}"else:tree_.getroot().remove(ob)tree_.write(save_xml_name)xs = ""with open(save_xml_name, 'r', encoding='utf8') as r:xs = r.read()r.close()with open(save_xml_name, 'w', encoding='utf8') as w:w.write(xs.replace("<?xml version='1.0' encoding='utf8'?>", ""))w.close()for i in os.listdir(xmls_path):read_xml(i)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS Pro二次开发】(70):杂七杂八的记录

本文用于记录一些使用频率较高但归类繁杂&#xff0c;非系统性的一些代码。 主要方便自己使用和查阅&#xff0c;随时更新。 1、从GDB数据库中打开【FeatureDataset\FeatureClass\Table】 using Geodatabase gdb new Geodatabase(new FileGeodatabaseConnectionPath(new Uri…

快速学习微服务保护框架--Sentinel

学习一个框架最好的方式就是查看官方地址,sentinel是国内阿里巴巴公司的,官网更方便官网 官网 微服务保护框架 Sentinel 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微…

全力以赴,火山引擎边缘云代表团出战亚运会

END 未来&#xff0c;火山引擎边缘云赛事阵容将继续全力以赴&#xff0c;通过领先、可信赖的云和智能技术&#xff0c;助力游戏行业呈现更加精彩的竞技赛事。

光耦合器继电器与传统继电器:哪种最适合您的项目?

在电子和电气工程领域&#xff0c;继电器的选择可以显着影响项目的性能和安全性。两种常见类型的继电器是光耦合器继电器和传统机电继电器。每个都有其优点和缺点&#xff0c;因此选择过程对于项目的成功结果至关重要。 光耦合器继电器&#xff1a;基础知识 光耦合器继电器&…

linux环境下使用lighthouse与selenium

一、安装谷歌浏览器、谷歌浏览器驱动、lighthouse shell脚本 apt update && apt -y upgrade apt install -y curl curl -fsSL https://deb.nodesource.com/setup_18.x | bash apt install -y nodejs apt install -y npm npm install -g lighthouse apt-get install -y …

AutoRunner自动化测试工具

AutoRunner自动化测试工具(简称AR&#xff09;是泽众软件自主研发的自动化测试工具&#xff0c;也是一个自动测试框架&#xff0c;加载不同的测试组件&#xff0c;能够实现面向不同应用的测试。通过录制和编写测试脚本&#xff0c;实现功能测试、回归测试的自动化&#xff0c;自…

系统架构设计:10 论数据湖技术及其应用

目录 一 数据湖技术 1 数据库 2 数据仓库 3 数据库与数据仓库的对比 4 数据湖

MySQL数据库基本操作和完整性约束类型详解

目录 一、增删改查的sql语句二、表完整性约束1、表完整性约束的介绍2、常见的完整性约束类型3、表完整性约束实战操作3.1.主键primary key3.2.自增键auto_increment3.3.唯一键UNIQUE3.4.null与not null3.5.默认约束 一、增删改查的sql语句 SQL&#xff08;Structured Query Lan…

记录一个@Transaction注解引发的bug

记录一个Transactional(readOnly true)注解引发的bug 一、问题代码和报错 1-1 问题代码模拟 引发这个问题的三大要素分别是&#xff1a; 事务注解任意数据库操作数据库操作后执行耗时业务&#xff08;耗时超过数据库配置的超时时间&#xff09; //1.这里是问题的核心之一…

“过度炒作”的大模型巨亏,Copilot每月收10刀,倒赔20刀

大模型无论是训练还是使用&#xff0c;都比较“烧钱”&#xff0c;只是其背后的成本究竟高到何处&#xff1f;已经推出大模型商用产品的公司到底有没有赚到钱&#xff1f;事实上&#xff0c;即使微软、亚马逊、Adobe 这些大厂&#xff0c;距离盈利之路还有很远&#xff01;同时…

Python装饰器dome

import time from functools import wrapsdef statistical_time(time_type):print(time_type)def gel(fun):wraps(fun) # 不改变使用装饰器原有函数的结构(如__name__, __doc__)def fool(*args, **kwargs):start_time time.time()res fun(*args, **kwargs)end_time time.ti…

微信自动批量添加好友的方法

在现在的营销中微信已成为一种重要的沟通方式。微信目前是没有自动批量添加好友的功能&#xff0c;需要运营者一个一个手动去添加&#xff0c;这样太过于浪费时间&#xff0c;并且加频繁了还容易被封号&#xff0c;今天给大家介绍几种手动批量加好友的方式以及怎么借助第三方软…

国窖1573持续演绎共生魅力,携手马岩松个展感知建筑艺术之美

执笔 | 洪大大 编辑 | 萧 萧 从艺术到文化、从需求到场景、从体验到消费&#xff0c;国窖1573正通过一次次尝试与探索实现与多元文化的共创与共生。 10月12日&#xff0c;国窖1573品牌挚友马岩松举办的“流动的大地”展览在深圳当代艺术与城市规划馆正式开幕。泸州老窖股份…

什么是MTU(Maximum Transmission Unit)?

最大传输单元MTU&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;&#xff0c;是指网络能够传输的最大数据包大小&#xff0c;以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值&#xff0c;或者是超…

2023年09月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 Python编程(1~6级)全部真题・点这里 第1题:红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 时间限…

[paddle]paddleseg中eiseg加载模型参数的模型下载地址

图片标注 以下内容为2D图片标注模型下载及EISeg2D图片标注流程&#xff0c;具体如下&#xff1a; 模型准备 在使用EISeg前&#xff0c;请先下载模型参数。EISeg开放了在COCOLVIS、大规模人像数据、mapping_challenge&#xff0c;Chest X-Ray&#xff0c;MRSpineSeg&#xff…

[42000][923] ORA-00923: 未找到要求的 FROM 关键字

在oracle数据库写分页查询&#xff0c;使用 rownum时候出错&#xff0c; 代码&#xff1a; SELECT *FROM (SELECT *, ROWNUM AS rnumFROM test t ) WHERE rnum BETWEEN 1 AND 5; 报错&#xff1a; [42000][923] ORA-00923: 未找到要求的 FROM 关键字 Position: 31 问题原因…

【微服务部署】十、使用Docker Compose搭建高可用Redis集群

现如今&#xff0c;业务系统对于缓存Redis的依赖似乎是必不可少的&#xff0c;我们可以在各种各样的系统中看到Redis的身影。考虑到系统运行的稳定性&#xff0c;Redis的应用和MySQL数据库一样需要做到高可用部署。 一、Redis 的多种高可用方案 常见的Redis的高可用方案有以下…

vue3前端开发系列 - electron开发桌面程序(2023-10月最新版)

文章目录 1. 说明2. 创建项目3. 创建文件夹electron3.1 编写脚本electron.js3.2 编写脚本proload.js 4. 修改package.json4.1 删除type4.2 修改scripts4.3 完整的配置如下 5. 修改App.vue6. 修改vite.config.ts7. 启动8. 打包安装9. 项目公开地址 1. 说明 本次安装使用的环境版…

kantts docker化

kan-tts docker本地化 环境安装 下载docker镜像(python3.8的) registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.2 安装基础模型 pip install modelscope 安装语音模型 pip install "modelscope…