有images、xmls两个文件夹,每一个jpg对应一个xml文件。读取xml文件信息,每一个object节点代表一个目标,读取object信息,新建文件夹,文件夹名称为其中name节点得值。bndbox节点内xmin,ymin,xmax,ymax对应矩形框得左上角和右下角坐标。根据此坐标将jpg文件内的对应图像裁剪,并画出矩形框,放入对应的name文件夹,使用python代码实现
时间: 2024-04-15 22:31:48 浏览: 115
你可以使用Python的ElementTree模块来解析XML文件,并使用OpenCV库来裁剪图像并绘制矩形框。以下是一个示例代码:
```python
import os
import xml.etree.ElementTree as ET
import cv2
def extract_objects(xml_folder, image_folder):
# 遍历xml文件夹中的每个xml文件
for xml_file in os.listdir(xml_folder):
# 获取xml文件的路径
xml_path = os.path.join(xml_folder, xml_file)
# 解析xml文件
tree = ET.parse(xml_path)
root = tree.getroot()
# 获取xml文件中的name节点值
name = root.find("object/name").text
# 创建目标文件夹,如果不存在则创建
target_folder = os.path.join(image_folder, name)
os.makedirs(target_folder, exist_ok=True)
# 获取图像文件名(去除扩展名)
image_name = os.path.splitext(xml_file)[0] + ".jpg"
# 获取图像文件路径
image_path = os.path.join(image_folder, image_name)
# 读取图像文件
image = cv2.imread(image_path)
# 遍历xml文件中的每个object节点
for obj in root.findall("object"):
# 获取矩形框坐标信息
xmin = int(obj.find("bndbox/xmin").text)
ymin = int(obj.find("bndbox/ymin").text)
xmax = int(obj.find("bndbox/xmax").text)
ymax = int(obj.find("bndbox/ymax").text)
# 裁剪图像并绘制矩形框
cropped_image = image[ymin:ymax, xmin:xmax]
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
# 保存裁剪后的图像
cv2.imwrite(os.path.join(target_folder, image_name), cropped_image)
# 保存带有矩形框的原图像
cv2.imwrite(os.path.join(target_folder, "annotated_" + image_name), image)
# 使用示例
xml_folder = "path/to/your/xml/folder"
image_folder = "path/to/your/image/folder"
extract_objects(xml_folder, image_folder)
```
将上述代码中的`"path/to/your/xml/folder"`和`"path/to/your/image/folder"`替换为你的XML文件夹和图像文件夹的路径,运行代码后,它将根据XML文件中的信息裁剪图像并绘制矩形框,然后将它们保存到对应的目标文件夹中。
阅读全文