(python读取目标检测PASCAL VOC数据集,将图像采用边缘填充的方法缩放到相应大小(例如640x640),并修改对应的xml文件

python读取目标检测PASCAL VOC数据集,将图像采用边缘填充的方法缩放到相应大小(例如640x640),并修改对应的xml文件

  • 单个文件处理
  • 批处理脚本

单个文件处理

import cv2
import os
import xml.etree.ElementTree as ET

def resize_image_and_xml(image_path, xml_path, target_size):    
    # 读取图像
    image = cv2.imread(image_path)
    
    # 获取图像原始尺寸
    original_height, original_width = image.shape[:2]
    
    # 计算缩放比例
    scale_x = target_size / original_width
    scale_y = target_size / original_height
    
    # 缩放图像
    resized_image = cv2.resize(image, (target_size, target_size))
    
    # 保存缩放后的图像
    cv2.imwrite('resized_image.jpg', resized_image)
    
    # 修改XML文件中的尺寸信息
    tree = ET.parse(xml_path)
    root = tree.getroot()
    
    # 修改尺寸信息
    size_tag = root.find('size')
    size_tag.find('width').text = str(target_size)
    size_tag.find('height').text = str(target_size)
    
    # 修改bounding box的坐标信息
    for obj in root.findall('object'):
        bbox = obj.find('bndbox')
        bbox.find('xmin').text = str(int(float(bbox.find('xmin').text) * scale_x))
        bbox.find('xmax').text = str(int(float(bbox.find('xmax').text) * scale_x))
        bbox.find('ymin').text = str(int(float(bbox.find('ymin').text) * scale_y))
        bbox.find('ymax').text = str(int(float(bbox.find('ymax').text) * scale_y))
    
    # 保存修改后的XML文件
    tree.write('resized_annotation.xml')

# 用法示例
image_path = r'C:\Users\GuoQingru\Downloads\pp_fall\temp\fall_0.jpg'
xml_path = r'C:\Users\GuoQingru\Downloads\pp_fall\temp\fall_0.xml'
target_size = 640

resize_image_and_xml(image_path, xml_path, target_size)

批处理脚本

import cv2
import os
import xml.etree.ElementTree as ET

def resize_image_and_xml(images_root_old,xml_root_old,image_root_new,xml_root_new,image_name, target_size):    
    # 读取图像
    image_path=os.path.join(images_root_old,image_name)
    image = cv2.imread(image_path)
    
    # 获取图像原始尺寸
    original_height, original_width = image.shape[:2]
    
    # 计算缩放比例
    scale_x = target_size / original_width
    scale_y = target_size / original_height
    
    # 缩放图像
    resized_image = cv2.resize(image, (target_size, target_size))
    
    # 保存缩放后的图像
    cv2.imwrite(os.path.join(image_root_new,image_name), resized_image)
    
    # 修改XML文件中的尺寸信息
    tree = ET.parse(os.path.join(xml_root_old,os.path.splitext(image_name)[0]+'.xml'))
    root = tree.getroot()
    
    # 修改尺寸信息
    size_tag = root.find('size')
    size_tag.find('width').text = str(target_size)
    size_tag.find('height').text = str(target_size)
    
    # 修改bounding box的坐标信息
    for obj in root.findall('object'):
        bbox = obj.find('bndbox')
        bbox.find('xmin').text = str(int(float(bbox.find('xmin').text) * scale_x))
        bbox.find('xmax').text = str(int(float(bbox.find('xmax').text) * scale_x))
        bbox.find('ymin').text = str(int(float(bbox.find('ymin').text) * scale_y))
        bbox.find('ymax').text = str(int(float(bbox.find('ymax').text) * scale_y))
    
    # 保存修改后的XML文件
    tree.write(os.path.join(xml_root_new,os.path.splitext(image_name)[0]+'.xml'))



# 用法示例
target_size = 640

# 原先的图像存放路径
images_root_old=r'C:\Users\GuoQingru\Downloads\pp_fall\JEPGImages'
# 原先的xml文件存放路径
xml_root_old=r'C:\Users\GuoQingru\Downloads\pp_fall\Annotations'


# 生成的图像存放路径
image_root_new=r'C:\Users\GuoQingru\Downloads\pp_fall\JEPGImages_640'
# 生成的xml存放路径
xml_root_new=r'C:\Users\GuoQingru\Downloads\pp_fall\Annotations_640'

images_list=[]
for image_name in os.listdir(images_root_old):
    images_list.append(image_name)


for image_name in images_list:

    resize_image_and_xml(images_root_old,xml_root_old,image_root_new,xml_root_new,image_name, target_size)



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于FPGA的数字电子钟VHDL代码Quartus仿真

名称:基于FPGA的数字电子钟VHDL代码Quartus仿真(文末获取) 软件:Quartus 语言:VHDL 代码功能: 数字电子钟 1)设计一个能显示秒、分、时的24小时数字钟 2)用数码管显示出时,分,…

k8s ReplicaSet

ReplicaSet 是替代 ReplicationController 的,ReplicaSet 的行为与 ReplicationController 完全相同, 但pod 选择器的表达能力更强。 ReplicaSet 和 ReplicationController 的区别: ReplicationController 的标签选择器只允许包含某个标签的…

MahApps.Metro的MVVM模式介绍(一)

MahApps.Metro是一个开源的WPF (Windows Presentation Foundation) UI 控件库。它的特点有现代化设计、主题定制、响应式布局、内置控件。 而Mvvm模式的核心思想是将用户界面(View)与应用程序逻辑(ViewModel)分离,以实…

55. 【Android教程】位图:Bitmap

在上一节学习 Drawable 图像资源的时候我们在很多地方用到了 bitmap,bitmap 其实就是真实图片在 Android 中最直接的表现形式,这一节我们来仔细学习一下 Bitmap 的使用。 1. 什么是 Bitmap Bitmap 在 Android 中对应一张图片文件,它是一个二…

使用IIS部署Vue项目

前提 使用IIS部署Vue项目,后端必须跨域,不要在Vue中用proxy跨域,那个只在dev环境中有用! IIS安装,不用全部打勾,有些他默认就是方块 ■ 选择性安装的,就维持原样就可以。 添加网站配置 右键…

nginx模型设计和进程讲解

一. Nginx进程模型解析 1. master主进程 和 worker工作进程 [rootlocalhost sbin]# ps -ef|grep nginx root 15411 1 0 21:08 ? 00:00:00 nginx: master process ./nginx nobody 15412 15411 0 21:08 ? 00:00:00 nginx: worker process root…

通过颜色学习css

文章目录 1.生成html2.添加css链接3.将h1标签text-align元素4.添加div标签4.1、为类marker添加元素4.2、添加两个新的div标签4.3、修改div标签的类型并修改css元素4.4、为类container添加元素4.5、以数字形式添加颜色4.5、container添加padding属性4.6、组合css中的颜色属性4.7…

python abs函数怎么用

abs()函数是Python的数字函数,用以返回数字的绝对值。 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮点数,复数。 返回值 函数返回 x(数字)的绝对值&#x…

【自然语言处理】seq2seq模型——机器翻译

seq2seq模型——机器翻译 1 任务目标 1.1 案例简介 seq2seq是神经机器翻译的主流框架,如今的商用机器翻译系统大多都基于其构建,在本案例中,我们将使用由NIST提供的中英文本数据训练一个简单的中英翻译系统,在实践中学习seq2se…

uniapp文本框上下滚动问题

一个基本需求,textarea标签没有办法通过手拖动的方式进行滚动,当文字超出其容量后,想要编辑上面被遮挡部分的文字这边难以点到,电脑可以鼠标滚轮,但手机需要拖动但无效: 下面提供了我的解决思路&#xff1a…

list的模拟实现

目录 1.默认成员函数模拟实现 1.1 构造函数(头节点) 1.2 析构函数 1.3 拷贝构造函数 1.4 赋值重载函数 2.增删查改模拟实现 2.1 insert 2.2 erase 2.3 push_back、pop 3.前置、--、后置、-- 3.1前置: 3.2后置: 3.3 …

STC89C52驱动XPT2046AD转换

目录 简介封装接线(单端)时序以及命令字SPI时序命令字 程序XPT2046.CXPT2046.hmain.c测试 简介 XPT2046是一款4线电阻式触摸屏控制器,采用12位125 kHz采样SAR类型A / D转换器。XPT2046工作电压低至2.2V,支持1.5V至VCC的数字I/O接…

休斯《公共管理导论》第5版/考研真题解析/章节题库

第一部分 考研真题精选 一、概念题二、简答题三、论述题四、案例分析题第二部分 章节题库 第1章 一个变革的时代第2章 政府的角色第3章 传统的公共行政模式第4章 公共管理第5章 公共政策第6章 治 理第7章 问 责第8章 利害关系人和外部环境第9章 管制、外包和公共企…

jenkins目录下的vue3项目——pnpm install后运行报错——奇葩问题解决

昨天到今天,同事那边遇到一个问题,就是关于vue3vite的项目,在执行了自动打包后,运行代码会提示报错的问题。 报错信息如下: 具体错误信息如下: ERROR 11:28:14 [vite] Pre-transform error: Cannot find …

Xshell连接提示“SSH服务器拒绝了密码”

原因1:数字锁没有打开 没有打开NumLock(数字小键盘上面有一个【Num】按键),需要按键开启。 注意要检查NumLock灯是否亮起。 或者改成用字母键上面的数字键输入就好了。 原因2:root密码设置错误(这个是比较常…

frp内网穿透服务搭建与使用

frp内网穿透服务搭建与使用 1、frp简介 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp工作原理 服务端运行,监听一个主端口…

深入Django:用户认证与权限控制实战指南

title: 深入Django:用户认证与权限控制实战指南 date: 2024/5/7 18:50:33 updated: 2024/5/7 18:50:33 categories: 后端开发 tags: AuthDecoratorsPermissionsGuardianRESTAuthSessionMgmtMFA 第1章:入门Django与设置 1.1 Django安装与环境配置 在…

netty 高性能架构设计--零拷贝

文章目录 前言一、直接内存1.1 什么是直接内存1.2 代码实现1.3 使用直接内存的优缺点 二、netty 零拷贝设计2.1 netty 直接内存2.2 netty 内存池 三、零拷贝的两种方式 前言 本篇从源码层面剖析 netty 高性能架构设计之零拷贝,并且扩展讲述零拷贝的两种实现方式。 …

并发编程之阻塞队列BlockingQueue实战及其原理分析

1. 阻塞队列介绍 1.1 队列 是限定在一端进行插入,另一端进行删除的特殊线性表。 先进先出(FIFO)线性表。 允许出队的一端称为队头,允许入队的一端称为队尾。

机器学习第二天(监督学习,无监督学习,强化学习,混合学习)

1.是什么 基于数据寻找规律从而建立关系,进行升级,如果是以前的固定算式那就是符号学习了 2.基本框架 3.监督学习和无监督式学习: 监督学习:根据正确结果进行数据的训练; 在监督式学习中,训练数据包括输…
最新文章