运行环境:python3.5+
需要安装一下opencv,如果有anaconda,执行conda install opencv-python
这个脚本适用于原来都是同一尺寸的图片,如果不一致,请参考本人另一篇博客。
# *_* coding : UTF-8 *_*
# 开发人员: csu·pan-_-||
# 开发时间: 2020/11/24 19:42
# 文件名称: resize_img_xml.py
# 开发工具: PyCharm
# 功能描述: 按比例缩放图像,同时修改xml文件
# 适用于原来就都是相同尺寸的图片
# 如果原来尺寸不统一,请参考本人的另一篇博客
import os
import cv2
import xml.etree.ElementTree as ET
path = r'E:\Projects\640x640' # 原文件夹路径
newpath = r'E:\Projects\1280x1280' # 新文件夹路径
ratio = 2
def edit_xml(xml_file,ratio,i):
"""
修改xml文件
:param xml_file:xml文件的路径
:return:
"""
all_xml_file = os.path.join(path, xml_file)
tree = ET.parse(all_xml_file)
# 修改xml里的图像宽高:
obj_size = tree.find('size')
obj_width = obj_size.find('width')
obj_hight = obj_size.find('height')
width = int(obj_width.text)
hight = int(obj_hight.text)
obj_width.text = str(round(width * ratio))
obj_hight.text = str(round(hight * ratio))
# 修改xml里的目标位置:
objs = tree.findall('object')
for ix, obj in enumerate(objs):
obj_bnd = obj.find('bndbox')
obj_xmin = obj_bnd.find('xmin')
obj_ymin = obj_bnd.find('ymin')
obj_xmax = obj_bnd.find('xmax')
obj_ymax = obj_bnd.find('ymax')
xmin = float(obj_xmin.text)
ymin = float(obj_ymin.text)
xmax = float(obj_xmax.text)
ymax = float(obj_ymax.text)
obj_xmin.text = str(round(xmin * ratio))
obj_ymin.text = str(round(ymin * ratio))
obj_xmax.text = str(round(xmax * ratio))
obj_ymax.text = str(round(ymax * ratio))
newfile = os.path.join(newpath, '%05d'% (0 + (i+1)/2)+'.xml')
tree.write(newfile, method='xml', encoding='utf-8') # 更新xml文件
if __name__ == '__main__':
files = os.listdir(path) # 获取文件名列表
for i, file in enumerate(files):
if file.endswith('.jpg'):
imgName = os.path.join(path, file) # 获取文件完整路径
xml_file = file.replace('.jpg','.xml')
img = cv2.imread(imgName) # 读图
# 按比例缩放图像:
# 当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小、参数fx和fy决定
imgcrop = cv2.resize(img, (0, 0), fx=ratio, fy=ratio)
# 修改xml文件
edit_xml(xml_file, ratio, i)
# 设置新的文件名并存储图像:
newName = os.path.join(newpath, '%05d' % (0 + (i+1)/2) + '.jpg')
print(newName)
cv2.imwrite(newName, imgcrop) # 存储按新文件名命令的图片