根据XML文件坐标剪切图像

根据XML文件坐标剪切图像

# 导入模块
import cv2
import xml.etree.ElementTree as ET
import os
from pathlib import Path
import numpy as np
import random

# 原图片、标签文件、裁剪图片路径
img_path = r'E:/set/uas/'
xml_path = r'E:/set/uas/'
obj_img_path = r'F:/set-crop/uas/'

# 声明一个空字典用于储存裁剪图片的类别及其数量
#Numpic = {}
i=1
# 把原图片裁剪后,按类别新建文件夹保存,并在该类别下按顺序编号
for file in os.listdir(img_path):
    print(file)
    filename = os.path.join(img_path, file)
    print(filename)
    for img_file in os.listdir(filename):
        print(img_file)
        my_file = Path(obj_img_path + file)
        if 1 - my_file.is_dir():
            os.mkdir(obj_img_path + file)
        if img_file[-4:] in ['.png', '.jpg','.bmp']:  # 判断文件是否为图片格式
            #filename = os.path.join(img_path, file)
            img_filename = os.path.join(filename, img_file)  # 将图片路径与图片名进行拼接
            img_cv = cv2.imread(img_filename)  # 读取图片


            img_name = (os.path.splitext(img_file)[0])  # 分割出图片名,如“000.png” 图片名为“000”
            print(img_name)
            xml_name = filename  + '\\' + '%s.xml' % img_name  # 利用标签路径、图片名、xml后缀拼接出完整的标签路径名

            if os.path.exists(xml_name):  # 判断与图片同名的标签是否存在,因为图片不一定每张都打标
                root = ET.parse(xml_name).getroot()  # 利用ET读取xml文件
                for obj in root.iter('object'):  # 遍历所有目标框
                    name = obj.find('name').text  # 获取目标框名称,即label名
                    xmlbox = obj.find('bndbox')  # 找到框目标
                    x0 = xmlbox.find('xmin').text  # 将框目标的四个顶点坐标取出
                    y0 = xmlbox.find('ymin').text
                    x1 = xmlbox.find('xmax').text
                    y1 = xmlbox.find('ymax').text

                    obj_img = img_cv[int(y0):int(y1), int(x0):int(x1)]  # cv2裁剪出目标框中的图片

                    #Numpic.setdefault(name, 0)  # 判断字典中有无当前name对应的类别,无则新建
                    #Numpic[name] += 1  # 当前类别对应数量 + 1
                    #my_file = Path(obj_img_path + '\\' + name)  # 判断当前name对应的类别有无文件夹
                    #if 1 - my_file.is_dir():  # 无则新建
                        #os.mkdir(obj_img_path + '\\' + str(name))

                    #cv2.imwrite(obj_img_path + '\\' + name + '\\' + '%04d' % (Numpic[name]) + '.bmp',
                                #obj_img)  # 保存裁剪图片,图片命名4位,不足补0
                    new_name = file + "-" + str(i) + '.bmp'
                    print(new_name)
                    cv2.imwrite(obj_img_path + file + '/' + new_name, obj_img)
                    i = i + 1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值