将轮廓路径转换为SVG路径

13

我正在使用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

2
你具体遇到了哪些困难?你有一个轮廓向量,你需要遍历它们并将其转换为SVG path语句,然后将它们写入文本文件 https://www.w3schools.com/graphics/svg_path.asp。你可能需要进行初始遍历以确定页面大小的最大尺寸,或者你可以使用找到轮廓的原始图像的尺寸。 - Mark Setchell
@MarkSetchell 感谢您的提示。我有点懒了 :) - Laxman
2个回答

20

问题已经以下方式解决:

c = max(contours, key=cv2.contourArea) #max contour
f = open('path.svg', 'w+')
f.write('<svg width="'+str(width)+'" height="'+str(height)+'" 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()

干得好 - 感谢您与社区分享代码。 - Mark Setchell
@MarkSetchell,我还使用cv2.approxPolyDP() 函数减少了轮廓的顶点数量,现在我需要找到一种方法来平滑线条。 - Laxman
一个(不太优雅的)可能性是将路径绘制到图像中,然后使用 potrace 进行平滑处理... http://potrace.sourceforge.net - Mark Setchell
@MarkSetchell 我不是试图在图像上绘制路径。对于我的问题,我需要将路径提取为矢量格式,以便我可以在其他地方使用它作为SVG。 - Laxman
我建议您创建一个临时图像,其中包含未平滑的轮廓,然后让potrace将其转换为平滑的SVG文件。 - Mark Setchell
在我的情况下,我不得不在末尾添加第一个点来关闭轮廓。 - Moshel

4
另一个答案只在SVG文件中保存最外层轮廓,这不是我的情况。要保存opencv找到的所有轮廓,可以采用以下方法:
with open("path.svg", "w+") as f:
    f.write(f'<svg width="{w}" height="{h}" 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>")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接