使用python读取XML文件并对图像进行裁剪
描述:
使用python读取xml文件,获取xml文件标注的区域,在原图像进行裁剪,并保存
代码:
#edit_date:2023-03-18
# function:
#读取文件夹中对应的bmp文件和xml文件,截取图片中对应的坐标的图像
import cv2
import xml.etree.ElementTree as ET
import os
#读取文件中的xml文件和img文件
def readFile(xmlPath,imgPath,savePath):
for img_file in os.listdir(imgPath):
#判断文件后缀属性是否满足图片类型
if img_file[-4:] in ['.bmp','.jpg','.png']:
img_filename=os.path.join(imgPath,img_file)
#获取当前图像的文件名
img_name=(os.path.splitext(img_file)[0])
xml_filename=xmlPath+'\\'+'%s.xml'%img_name
#判断xml文件夹中是否存在
if os.path.exists(xml_filename):
#传入函数读取xml信息
cutImage(xml_filename,img_filename,savePath)
#定义函数实现读取图片中的xml文件信息,并截图
#输入的参数: xml文件,img文件,保存地址
def cutImage(xmlPath,imgPath,savePath):
root=ET.parse(xmlPath).getroot()
count=0
#遍历xml文件中object属性
for obj in root.iter('object'):
name=obj.find('name').text
# xmlbox=obj.find('bndbox').text
x0=int(obj.find('bndbox/xmin').text)
y0=int(obj.find('bndbox/ymin').text)
x1=int(obj.find('bndbox/xmax').text)
y1=int(obj.find('bndbox/ymax').text)
#打开对应的图像文件,裁剪图像
img=cv2.imread(imgPath)
obj_img=img[y0:y1,x0:x1]
#确定文件的保存路径
img_name=imgPath.split('\\')[-1].split('.')[0]
#跳过数据标注错误的列
if len(obj_img)==0:
continue
img_save_path=savePath+'\\'+'%s_%s_%s'%(name,img_name,count)+'.jpg'
cv2.imwrite(img_save_path,obj_img)
count+=1
print(img_save_path+"裁剪完成")
if __name__=="__main__":
xmlPath=r"D:\dataset\20230318\1\annotations"
imgPath=r"D:\dataset\20230318\1\images"
savePath=r"D:\dataset\20230318\1\cutImage"
readFile(xmlPath,imgPath,savePath)