将轮廓路径转换为 ​​svg 路径

Posted

技术标签:

【中文标题】将轮廓路径转换为 ​​svg 路径【英文标题】:Convert contour paths to svg paths 【发布时间】:2017-08-23 20:10:38 【问题描述】:

我正在使用带有 python 的 openCV 从图像中提取轮廓。现在我需要将这些轮廓路径(列表)导出为 svg 路径。我怎样才能做到这一点?

代码:

ret,thresh = cv2.threshold(imgray,27,25,0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_TC89_L1)
print(type(contours)) #type list

【问题讨论】:

您遇到困难的具体方面是什么?您有一个轮廓向量,遍历它们,将它们转换为 SVG path 语句并将它们写入文本文件 w3schools.com/graphics/svg_path.asp 您可能需要进行初始传递以了解页面大小的最大尺寸,或者您只需使用您在其上找到轮廓的原始图像的尺寸。 @MarkSetchell 谢谢你的提示。我太懒了:) 【参考方案1】:

问题已解决如下:

c = max(contours, key=cv2.contourArea) #max contour
f = open('path.svg', 'w+')
f.write('<svg   xmlns="http://www.w3.org/2000/svg">')
f.write('<path d="M')

for i in xrange(len(c)):
    #print(c[i][0])
    x, y = c[i][0]
    print(x)
    f.write(str(x)+  ' ' + str(y)+' ')

f.write('"/>')
f.write('</svg>')
f.close()

【讨论】:

干得好 - 感谢您与社区分享您的代码。 @MarkSetchell,我还使用 cv2.approxPolyDP() 减少了轮廓的顶点,现在我需要找到一种方法来平滑线条。 一种(不是很优雅)的可能性可能是将路径绘制到图像中并使用potrace 来平滑... potrace.sourceforge.net @MarkSetchell 我不是想在“上方”和图像上绘制路径。对于我的问题,我需要将路径提取为矢量格式,以便可以在其他地方将其用作 svg。 我建议您创建一个带有未平滑轮廓的 临时 图像,然后让 potrace 将其转换为平滑的 SVG 文件。【参考方案2】:

另一个答案只将最外面的轮廓保存在 svg 文件中,这不是我的情况。要保存 opencv 找到的所有轮廓,您可以这样做:

with open("path.svg", "w+") as f:
    f.write(f'<svg   xmlns="http://www.w3.org/2000/svg">')

    for c in contours:
        f.write('<path d="M')
        for i in range(len(c)):
            x, y = c[i][0]
            f.write(f"x y ")
        f.write('" style="stroke:pink"/>')
    f.write("</svg>")

【讨论】:

以上是关于将轮廓路径转换为 ​​svg 路径的主要内容,如果未能解决你的问题,请参考以下文章

python KDE将轮廓和路径转换为特定的json格式传单友好

如何将文本转换为 SVG 路径?

以编程方式将 SVG 形状转换为路径(lineto、moveto)

将具有混合(固定和百分比)值的 CSS 剪辑路径转换为 ​​SVG 剪辑路径

d3.js:将 SVG 地理路径转换为画布

将 PDF 转换为干净的 SVG? [关闭]