如何从XML文件中的一组点绘制多段线?

2024-09-28 22:12:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在图像中绘制轮廓,因此我使用函数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>

Tags: imageimportdocvalueas绘制xmlcv2
1条回答
网友
1楼 · 发布于 2024-09-28 22:12:39

这里有几个问题

首先,通过d = {}resp创建一个字典dd[value] = [x, y],即d不是一个列表

其次,“d未定义”,因为dmain方法中的局部变量。调用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
                    

相关问题 更多 >