Здесь есть несколько проблем.
Прежде всего, вы создаете словарь 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](https://i.stack.imgur.com/lohyF.png)
Надеюсь, это поможет!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.1
NumPy: 1.18.1
OpenCV: 4.2.0
----------------------------------------