python 利用xml文件中bndbox坐标截图并保存

本文介绍了一种使用Python从XML文件中读取物体边界框信息,并据此从图像中裁剪出目标区域的方法。通过解析XML注释文件,获取xmin、ymin、xmax、ymax坐标,进而使用OpenCV库对图像进行精确裁剪。此技术广泛应用于计算机视觉任务,如物体检测和图像分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import cv2
import numpy as np 

import xml.dom.minidom
import os
import argparse

img_path = 'images/'
anno_path = 'annotations/'
cut_path = 'cut/'
imagelist = os.listdir(img_path)

for image in imagelist:
	image_pre, ext = os.path.splitext(image)
	img_file = img_path + image
	img = cv2.imread(img_file)
	xml_file = anno_path + image_pre + '.xml'
	DOMTree = xml.dom.minidom.parse(xml_file)
	collection = DOMTree.documentElement
	objects=collection.getElementsByTagName("object")


	for object in objects:
		print ("*****Object*****")
		bndbox = object.getElementsByTagName('bndbox')[0]
		xmin = bndbox.getElementsByTagName('xmin')[0]
		xmin_data=xmin.childNodes[0].data
		ymin = bndbox.getElementsByTagName('ymin')[0]
		ymin_data=ymin.childNodes[0].data
		xmax = bndbox.getElementsByTagName('xmax')[0]
		xmax_data=xmax.childNodes[0].data
		ymax = bndbox.getElementsByTagName('ymax')[0]
		ymax_data=ymax.childNodes[0].data
		xmin = int(xmin_data)
		xmax = int(xmax_data)
		ymin = int(ymin_data)
		ymax = int(ymax_data)
		img_cut = img[ymin:ymax,xmin:xmax,:]
		cv2.imwrite(cut_path+'cut_img_{}.jpg'.format(image_pre),img_cut)

参考1: python-----截取xml文件画框的图片并保存

参考1代码:

from __future__ import division
import os
from PIL import Image
import xml.dom.minidom
import numpy as np
ImgPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\output/'
AnnoPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\Annotations/'
ProcessedPath = r'D:\tmp\video_wang_mod\01\00022_8253_0021_3\cut/'

imagelist = os.listdir(ImgPath)

for image in imagelist:
    image_pre, ext = os.path.splitext(image)
    imgfile = ImgPath + image
    print(imgfile)
    if not os.path.exists(AnnoPath + image_pre + '.xml' ):
        continue
    xmlfile = AnnoPath + image_pre + '.xml'
    DomTree = xml.dom.minidom.parse(xmlfile)
    annotation = DomTree.documentElement
    filenamelist = annotation.getElementsByTagName('filename')
    filename = filenamelist[0].childNodes[0].data
    objectlist = annotation.getElementsByTagName('object')
    i = 1
    for objects in objectlist:
        namelist = objects.getElementsByTagName('name')
        objectname = namelist[0].childNodes[0].data
        savepath = ProcessedPath + objectname
        if not os.path.exists(savepath):
            os.makedirs(savepath)
        bndbox = objects.getElementsByTagName('bndbox')
        cropboxes = []
        for box in bndbox:
            x1_list = box.getElementsByTagName('xmin')
            x1 = int(x1_list[0].childNodes[0].data)
            y1_list = box.getElementsByTagName('ymin')
            y1 = int(y1_list[0].childNodes[0].data)
            x2_list = box.getElementsByTagName('xmax')
            x2 = int(x2_list[0].childNodes[0].data)
            y2_list = box.getElementsByTagName('ymax')
            y2 = int(y2_list[0].childNodes[0].data)
            w = x2 - x1
            h = y2 - y1
            obj = np.array([x1,y1,x2,y2])
            shift = np.array([[1,1,1,1]])
            XYmatrix = np.tile(obj,(1,1))
            cropboxes = XYmatrix * shift
            img = Image.open(imgfile)
            for cropbox in cropboxes:
                cropedimg = img.crop(cropbox)
                cropedimg.save(savepath + '/' + image_pre + '_' + str(i) + '.jpg')
                i += 1

参考2

<think>好的,我现在需要帮助用户在Ubuntu系统中使用PythonXML文件转换为TXT文件。用户可能希望从XML中提取特定数据以特定格式保存到TXT中。首先,我需要考虑用户的具体需求是什么,比如转换的XML结构是什么样的,需要提取哪些信息,以及TXT文件的格式要求。不过用户没有提供具体细节,所以可能需要一个通用的解决方案。 首先,我应该回忆Python中处理XML的常用库,比如xml.etree.ElementTree,它适合解析和操作XML文件。然后,考虑如何遍历XML节点,提取所需的数据,将其写入TXT文件。可能需要编写一个脚本,读取目录下的所有XML文件,逐个处理,生成对应的TXT文件。 接下来,我需要确定一个示例XML结构,假设用户处理的是类似VOC格式的标注文件,比如包含物体检测的边界框信息。例如,每个XML文件可能包含文件名、尺寸、以及多个物体的类别和坐标。因此,转换后的TXT文件可能需要每行对应一个物体,包含类别和坐标信息,或者以其他格式排列。 然后,我需要编写一个Python脚本的大致步骤:解析XML文件,提取必要的数据,格式化字符串,写入TXT。同时,需要注意文件路径的处理,确保在Ubuntu系统中正确读取和保存文件。可能还需要处理多个文件,使用循环遍历目录中的所有XML文件。 考虑到用户可能不太熟悉PythonXML处理,示例代码需要尽量简洁,添加注释说明每一步的作用。此外,可能还需要提醒用户安装必要的依赖,但通常xml.etree.ElementTree是Python的标准库,无需额外安装。 另外,用户可能希望TXT文件的格式符合特定需求,比如每行包含类别和归一化后的坐标,或者保留原始尺寸信息。因此,在示例中需要明确说明如何调整代码以适应不同的格式要求。 最后,应该验证示例代码的正确性,确保在Ubuntu环境下能够顺利运行,比如处理文件路径时使用正确的斜杠,处理可能的异常情况,比如XML文件格式错误或缺失字段。 总结步骤:导入必要的库,定义解析函数,遍历XML节点,提取数据,格式化写入TXT,处理多个文件提供使用说明和常见问题解答。</think>在Ubuntu中使用PythonXML转换为TXT文件的实现步骤如下: ### 一、基于ElementTree的标准方法 1. 安装必要依赖(Python3默认包含): ```bash sudo apt-get install python3 python3-pip ``` 2. 创建转换脚本`xml_to_txt.py`: ```python import xml.etree.ElementTree as ET import os def parse_xml(xml_path): tree = ET.parse(xml_path) root = tree.getroot() # 提取通用信息 filename = root.find('filename').text size = root.find('size') width = int(size.find('width').text) height = int(size.find('height').text) # 写入TXT的字符串 output = f"File: {filename}\nDimensions: {width}x{height}\n" # 遍历所有物体标注 for obj in root.iter('object'): cls = obj.find('name').text bbox = obj.find('bndbox') xmin = int(bbox.find('xmin').text) ymin = int(bbox.find('ymin').text) xmax = int(bbox.find('xmax').text) ymax = int(bbox.find('ymax').text) output += f"{cls}: ({xmin},{ymin})-({xmax},{ymax})\n" return output if __name__ == "__main__": input_dir = "Annotations" output_dir = "Labels" os.makedirs(output_dir, exist_ok=True) for xml_file in os.listdir(input_dir): if xml_file.endswith(".xml"): txt_content = parse_xml(os.path.join(input_dir, xml_file)) txt_path = os.path.join(output_dir, xml_file.replace(".xml", ".txt")) with open(txt_path, 'w') as f: f.write(txt_content) ``` ### 二、文件结构要求 ``` 项目目录/ ├── Annotations/ # 存放原始XML文件 └── Labels/ # 自动生成TXT文件 ``` ### 三、执行命令 ```bash python3 xml_to_txt.py ``` ### 四、格式转换示例 输入XML片段: ```xml <object> <name>cat</name> <bndbox> <xmin>100</xmin> <ymin>200</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> </object> ``` 输出TXT内容: ``` File: image001.jpg Dimensions: 640x480 cat: (100,200)-(300,400) ``` ### 五、扩展应用 1. **格式调整**:修改`parse_xml`函数可输出YOLO格式: ```python def parse_xml(xml_path): # ...保持其他代码不变... # 计算归一化坐标 x_center = (xmin + xmax)/2 / width y_center = (ymin + ymax)/2 / height w = (xmax - xmin) / width h = (ymax - ymin) / height output += f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n" ``` 2. **批量处理优化**:使用多线程加速处理: ```python from concurrent.futures import ThreadPoolExecutor def process_file(xml_file): # 处理单个文件的代码... with ThreadPoolExecutor(max_workers=4) as executor: executor.map(process_file, os.listdir(input_dir)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值