Как изменить код для чтения и создания нескольких файлов XML?

1

У меня есть этот код, который я использую для изменения изображений, которые я сохранил в папке с именем "images", от.png до.xml с дополнительной информацией о них. Когда я запускаю этот код, я получаю только XML файл для изображения 000001, который я понимаю, потому что у меня есть код, который выбирает это конкретное изображение. Я не уверен, как хотя бы выбрать несколько изображений в моем файле за один раз. У меня есть изображения с 000000 по 000355. Любые советы были бы замечательными! действительно не хотят вручную запускать код 355 раз!

import os
import cv2
from lxml import etree
import xml.etree.cElementTree as ET


def write_xml(folder, img, objects, tl, br, savedir):
    if not os.path.isdir(savedir):
        os.mkdir(savedir)

    image = cv2.imread(img.path)
    height, width, depth = image.shape

    annotation = ET.Element('annotation')
    ET.SubElement(annotation, 'folder').text = folder
    ET.SubElement(annotation, 'filename').text = img.name
    ET.SubElement(annotation, 'segmented').text = '0'
    size = ET.SubElement(annotation, 'size')
    ET.SubElement(size, 'width').text = str(width)
    ET.SubElement(size, 'height').text = str(height)
    ET.SubElement(size, 'depth').text = str(depth)
    for obj, topl, botr in zip(objects, tl, br):
        ob = ET.SubElement(annotation, 'object')
        ET.SubElement(ob, 'name').text = obj
        ET.SubElement(ob, 'pose').text = 'Unspecified'
        ET.SubElement(ob, 'truncated').text = '0'
        ET.SubElement(ob, 'difficult').text = '0'
        bbox = ET.SubElement(ob, 'bndbox')
        ET.SubElement(bbox, 'xmin').text = str(topl[0])
        ET.SubElement(bbox, 'ymin').text = str(topl[1])
        ET.SubElement(bbox, 'xmax').text = str(botr[0])
        ET.SubElement(bbox, 'ymax').text = str(botr[1])

    xml_str = ET.tostring(annotation)
    root = etree.fromstring(xml_str)
    xml_str = etree.tostring(root, pretty_print=True)
    save_path = os.path.join(savedir, img.name.replace('png', 'xml'))
    with open(save_path, 'wb') as temp_xml:
        temp_xml.write(xml_str)


if __name__ == '__main__':
    """
    for testing
    """

    folder = 'images'
    img = [im for im in os.scandir('images') if '000001' in im.name][0]
    objects = ['auv']
    tl = [(10, 10)]
    br = [(100, 100)]
    savedir = 'annotations'
    write_xml(folder, img, objects, tl, br, savedir)
Теги:

1 ответ

1
Лучший ответ

Основная идея состоит в том, чтобы сделать цикл, проходящий через каждый из ваших файлов изображений, и сделать то, что вы сделали для одного изображения раньше для каждого:

for img in os.scandir('images'):
    objects = ['auv']
    tl = [(10, 10)]
    br = [(100, 100)]
    savedir = 'annotations'
    write_xml(folder, img, objects, tl, br, savedir)

(Возможно, вам придется изменить выражение для вашего списка изображений, поскольку теперь оно может включать в себя то, что вы не хотите обрабатывать.)

  • 0
    Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню