百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

2D电气图(非矢量图)一键转为CAD图纸

toyiye 2024-06-21 11:55 9 浏览 0 评论

00、背景

设计院提供2D的电气图,如何快速进行二次修改?

如果直接提供CAD矢量图,那就很方便。但设计院为了知识版权,一般只会提供pdf或图片文件。

那有没好的办法,进行一键转换为CAD图纸?

正好最近看OpenCV相关的书籍,有些思路。

01、实现原理

使用本文的代码会一键将 2D 图像转换为 DXF 文件。

主要利用了 OpenCV 进行图像处理并使用 Potrace 进行矢量化,简化了转换过程,使其成为 CAD 应用程序的理想选择,轻松高效地简化从图像到 DXF 的工作流程。

生成的 DXF 文件与各种 CAD 软件兼容,可以进一步编辑或查看。

重点步骤分解

  1. 输入:用户提供双电源接线图文件的路径。
  2. 图像处理:包括灰度转换、边缘检测和使用形态学操作进行细化。
  3. 矢量化:使用 Potrace 将处理后的 BMP 图像转换为 SVG。
  4. DXF 转换:将 SVG 路径转换为 DXF 格式。
  5. 输出:将最终的 DXF 文件保存为 final.dxf

02、执行效果

输入图片:test.jpg

原始图片

中间输出svg文件:

svg中间文件

最终输出CAD图纸:final.dxf

最后CAD文件

运行前置条件

Python Libraries Python 库

  • NumPy:与 OpenCV 结合使用进行数值运算。
  • ezdxf:创建和操作 DXF 文件。
  • svgpathtools:用于解析 SVG 文件。
  • 子进程:用于运行外部命令,本文用到了 Potrace。下载地址:https://potrace.sourceforge.net/#downloading

安装所需的软件包

使用 pip 安装所需的软件包:

pip install opencv-python-headless
pip install numpy
pip install ezdxf
pip install svgpathtools

03、主要库和函数介绍

OpenCV (cv2)

用于图像处理任务的强大库。

  • cv2.imread :从文件中读取图像。
  • cv2.cvtColor :将图像转换为不同的颜色空间;这里用于灰度转换。
  • cv2.Canny :执行边缘检测。
  • cv2.GaussianBlur :减少图像中的噪点。
  • cv2.threshold :对图像应用固定级别的阈值。
  • cv2.erodecv2.dilate :执行形态学操作。

Subprocess 子流程

用于在 Python 中运行外部命令。

  • subprocess.run :执行 Potrace 命令以对图像进行矢量化。

ezdxf

用于创建和修改 DXF 绘图的 Python 包。

  • ezdxf.new :初始化一个新的DXF文档。
  • doc.modelspace() :访问图形实体的绘图空间。

svgpathtools

操作和分析 SVG 路径。

04、完整代码

代码简单,注释完整。

import cv2
import numpy as np
import os
import subprocess
import ezdxf
from svgpathtools import svg2paths

# 提示用户输入图像的路径
input_image_path = input("输入您要转换图片的文件路径: ")

# 检查提供的路径是否有效
if not os.path.exists(input_image_path):
    print("指定的文件不存在。 请检查路径并重试。")
else:
    # 读取图片
    image = cv2.imread(input_image_path)

    # 将图像转换为灰度
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 应用边缘检测
    edges = cv2.Canny(gray_image, threshold1=50, threshold2=150)

    # 应用高斯模糊来降噪
    blurred = cv2.GaussianBlur(edges, (5, 5), 0)

    # 对图像设置阈值以确保其是二进制的
    _, binary_image = cv2.threshold(blurred, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    # 使用形态学运算来减少线条的粗细
    eroded = cv2.erode(binary_image, np.ones((2,2), np.uint8), iterations=1)
    dilated = cv2.dilate(eroded, np.ones((3,3), np.uint8), iterations=1)

    # 通过用 .bmp 替换原始扩展名来构造输出文件名
    output_bmp_path = os.path.splitext(input_image_path)[0] + '_refined_edges.bmp'

    # 将精化边缘图像保存为 .bmp 文件
    cv2.imwrite(output_bmp_path, dilated)

    # 定义输出 SVG 的路径
    output_svg_path = os.path.splitext(input_image_path)[0] + '_vectorized.svg'

    # 运行 Potrace,将位图转换为 SVG
    subprocess.run(['potrace', '-s', output_bmp_path, '-o', output_svg_path])

    # 检查SVG是否创建成功
    if os.path.exists(output_svg_path):
        print(f"SVG 文件已成功创建于: {output_svg_path}")
        
        # 将 SVG 转换为 DXF
        paths, attributes = svg2paths(output_svg_path)

        # 创建新的 DXF 文档
        doc = ezdxf.new(dxfversion='R2010')
        msp = doc.modelspace()

        for path in paths:
            for line in path:
                start_point = (line.start.real, line.start.imag)
                end_point = (line.end.real, line.end.imag)
                msp.add_line(start_point, end_point)

        # 保存文档
        output_dxf_path = os.path.join(os.path.dirname(input_image_path),'final.dxf')
        doc.saveas(output_dxf_path)
        print(f"DXF 文件已成功创建于:{output_dxf_path}")
    else:
        print("SVG 文件创建失败。")

05、小结

  • 以上代码适用于简单的 2D 图像。输入图像的质量会影响输出。
  • 对于复杂或详细的图像,还需要在 CAD 程序中进行额外的手动编辑。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码