Как нарисовать полилинии из набора точек из файла XML? - PullRequest
0 голосов
/ 03 марта 2020

Мне нужно нарисовать контур в моем изображении, поэтому я использовал функцию cv2.polylines для рисования линий между точками, но я не знаю, почему у меня ошибка, как d не определена (d является список, содержащий множество точек (x, y)).

import xml.dom.minidom
import cv2 
import numpy as np
import matplotlib.pyplot as plt


def main(file):
    doc = xml.dom.minidom.parse(file)
    values = doc.getElementsByTagName("coordinateIndex")
    coordX = doc.getElementsByTagName("x")
    coordY = doc.getElementsByTagName("y")
    d = {}
    for atr_value, atr_x, atr_y in zip(values, coordX, coordY):
        value = atr_value.getAttribute('value')
        x = atr_x.getAttribute('value')
        y = atr_y.getAttribute('value')
        d[value] = [x, y]
    return d
image = cv2.imread('1.631791322.58809740.14.834982.40440.3641459051.955.6373933.1920.jpeg')
point=d
cv2.polylines(image, 
              point, 
              isClosed = False,
              color = (0,255,0),
              thickness = 3, 
              linetype = cv2.LINE_AA)
imshow("image",image)

result = main('1.631791322.58809740.14.834982.40440.3641459051.955.6373933.1920.xml')
print(result)

Это образец XML файла:

<?xml version="1.0" ?>
<TwoDimensionSpatialCoordinate>
    <coordinateIndex value="0"/>
        <x value="302.6215607602997"/>
        <y value="166.6285651861381"/>
    <coordinateIndex value="1"/>
        <x value="3.6215607602997"/>
        <y value="1.6285651861381"/>
</TwoDimensionSpatialCoordinate>

1 Ответ

0 голосов
/ 03 марта 2020

Здесь есть несколько проблем.

Прежде всего, вы создаете словарь d на d = {} соотв. d[value] = [x, y], то есть d - это , а не список.

Во-вторых, "d не определено", поскольку d является локальной переменной в вашем методе main , Когда вы вызываете result = main(...), тогда result будет отражать значение d.

В-третьих, cv2.polylines ожидает массив NumPy целочисленных пар. У вас есть значения с плавающей запятой, которые хранятся в виде строк в вашем XML.

Итак, теперь давайте найдем способ исправить эти проблемы: во-первых, мы приведем ваши координаты к float (и переименуем ваш метод, поскольку main является плохим выбором для такой функции):

import xml.dom.minidom
import cv2
import numpy as np


def extract(file):
    doc = xml.dom.minidom.parse(file)
    values = doc.getElementsByTagName("coordinateIndex")
    coordX = doc.getElementsByTagName("x")
    coordY = doc.getElementsByTagName("y")
    d = {}                                              # <-- That's a dictionary!
    for atr_value, atr_x, atr_y in zip(values, coordX, coordY):
        value = atr_value.getAttribute('value')
        x = float(atr_x.getAttribute('value'))          # <-- to float
        y = float(atr_y.getAttribute('value'))          # <-- to float
        d[value] = [x, y]
    return d

Затем мы переставляем загрузку изображения и извлекаем координаты в сценарии:

# Read image; extract coordinates from XML
image = cv2.imread('path/to/your/image.png')
dd = extract('path/to/your/file.xml')                   # <-- That's a dictionary!

Наконец, мы преобразовать ваш словарь в некоторый массив NumPy, преобразовать значения с плавающей точкой в ​​некоторый тип int и правильно вызвать cv2.polylines:

# Convert dictionary values to int NumPy array (needed for cv2.polylines)
pts = np.array(list(dd.values())).astype(np.int32)      # <-- to int

# Draw polygon lines
image = cv2.polylines(image,
                      [pts],
                      isClosed=False,
                      color=(0, 255, 0),
                      thickness=3,
                      lineType=cv2.LINE_AA)

# Show result
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Я добавил еще две точки к вашему примеру XML и использовал мой тестовое изображение по умолчанию - это вывод:

Output

Надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
OpenCV:      4.2.0
----------------------------------------
...