3D CAD模型的体素化

news2024/12/24 8:13:39

你有没有搜索过如何将 Cad 模型转换为 python 就绪的 numpy 数组,但没有得到任何明确的答案? 我也是。 经过长时间的研究并尝试了很多软件和 python 库,我终于能够将 3D STEP 文件转换为 3 维 numpy 数组。 如果你想做同样的事情或只是想知道它是如何完成的,请继续阅读 😃

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

1、简介

与二维图像数据相比,对 3 维模型的机器学习研究并不多。 大多数机器学习和深度学习模型都使用 numpy 数组作为数据类型。

虽然点云数据可以作为 numpy 数组导入,但是当 3D 模型转换为点云时,空间信息会丢失。 点云只是空间中的一组数据点,其中每个点都有其一组 X、Y 和 Z 坐标。 当点云被转换为 3 维 numpy 数组时,空间信息被恢复。 一个 3 维 numpy 数组就像一堆 2D 图像,其中每个图像都是整个 3D 的横截面视图,无论你如何切片阵列。

我最近正在从事一个这样的项目,但没有找到任何资源来帮助我将 cad 模型转换为 numpy 数组。

2、需要的软件和 Python 库

要加载“.stp”文件,我们将使用 FreeCAD 软件。 FreeCAD 是一款免费的开源参数化 3D 建模器。 你可以从此处下载该软件。 我们将使用 FreeCAD 加载“.stp”文件并将其转换为点云。

对于 Python,我将使用 Jupyter Notebook,但代码应该可以在任何其他 IDE 上正常运行。 我们将需要以下 Python 库来可视化点云并将其转换为 numpy 数组。

import pptk #not essential, but its good for visualizing
import numpy as np
import pandas as pd
from pyntcloud import PyntCloud

3、将 .stp 文件转换为点云

FreeCAD 的用户界面非常直观且易于理解。 当你在 FreeCAD 中打开一个“.stp”文件时,它看起来像这样:
在这里插入图片描述

我正在使用的 cad 模型是我几年前为 GrabCad 网站上的竞赛创建的。 您可以通过单击此处查看我的其他 Cad 模型并在 GrabCad 上进行渲染。

我们在 FreeCAD 中要做的第一件事是激活点工作台。 转到 View>Workbench>Points,如下图所示:

在这里插入图片描述

要将 3D 模型转换为点云,请选择左侧面板上的零件(part)。 选择零件实体后,工具栏中的“转换为点”选项将可用。 选择转换为点选项并输入最大距离。 最大距离是两点之间的距离。 创建点云所花费的时间与最大距离成反比。 因此,请根据所需的详细程度和你的计算机配置来选择它。

当单击“确定”时,点云即会生成,并且可以在左侧面板上将其视为一个单独的零件体。 可以在下图中看到:
在这里插入图片描述

要导出点云,请在左侧面板上选择点云零件主体,然后单击“导出点云”选项。 确保在保存点云时文件的扩展名应该是“.asc”。
在这里插入图片描述

4、点云到 3D Numpy 数组

要将“.asc”点云文件加载到 python 中,我们将使用 numpy 库。 使用下面显示的代码行将点云导入 python。 点云将是一个形状为 (N, 3) 的 numpy 数组。 其中 N 是数据点的数量,3 是每个数据点的 X、Y 和 Z 坐标。 有关单个数据点的示例,请参见下面代码中的最后两行。

import numpy as np
point_cloud = np.loadtxt("path/bracketpointcloud.asc")
point_cloud.shape
#output: (1840605, 3)
point_cloud[1]
#output: array([94.5374 , -2.27163, -3.81])

我们可以使用 pptk 库或 PyntCloud 库来查看点云。 我将解释两者,但 pptk 更好且易于可视化。 要使用 pptk 可视化点云,只需使用以下代码。 这将打开一个新窗口,你可以在其中缩放和旋转点云。 pptk 库提供了许多其他参数,可以在文档中看到。

v = pptk.viewer(point_cloud)

在这里插入图片描述

要使用 PyntCloud 可视化点云,我们必须将 numpy 数组转换为 pandas 数据框。 其中每行代表一个数据点,列代表相应数据点的 X、Y 和 Z 坐标。 然后这个数据框被用来创建一个 PyntCloud 对象,如下面的代码所示。 要绘制点云,请使用以下代码的最后一行。 PyntCloud 将在 jupyter 中显示输出。 我们可以在显示点云之前设置点大小和不透明度。

from pyntcloud import PyntCloud
df = pd.DataFrame(data=point_cloud, columns=['x','y','z'])
cloud = PyntCloud(new_df)
cloud
#output: PyntCloud
         1840603 points with 0 scalar fields
         0 faces in mesh
         0 kdtrees
         0 voxelgrids
         Centroid: 57.98352803, 18.506313633, -6.561006902397e-05
         Other attributes:
cloud.plot(point_size=0.1, opacity=0.6)

现在我们将点云数据帧转换为体素网格,也称为点云体素化(Voxelization)。 为此,我们将使用下面的前两行代码。 我们还可以设置表示 3D 模型的体素空间的大小。 这在深度学习和机器学习中特别方便,因为所有输入都应该具有相同的大小。 可以使用下面显示的最后一行代码查看体素网格。

voxelgrid_id = cloud.add_structure(“voxelgrid”, n_x=512, n_y=512, n_z=512)
voxelgrid = cloud.structures[voxelgrid_id]
voxelgrid.plot(d=3, mode="density", cmap="hsv")

最后我们只需要将体素网格转换为二进制 numpy 数组。 使用下面的代码行。

Binary_voxel_array = voxelgrid.get_feature_vector(mode=”binary”)
Binary_voxel_array.shape
#output: (512, 512, 512)

好了,现在我们有了一个 Numpy 数组表示的 3D cad 模型。

5、让我们看看结果

我们创建的 numpy 数组与 3D 模型非常相似。 当我们在 2 维中对数组进行切片时,我们将立即获得剖面图。 通过这种方式,机器可以保留 3D 模型的空间信息,机器可以使用各种深度学习或机器学习技术来学习这些信息。 下面是我们在 (512, 512, 512) 数组的不同索引处对数组进行切片时得到的几个示例。

plt.imshow(Binary_voxel_array[ 200, : , : ], cmap=’gray’)

在这里插入图片描述

plt.imshow(Binary_voxel_array[ :, 300, : ], cmap=’gray’)

在这里插入图片描述

plt.imshow(Binary_voxel_array[ :, :, 250 ], cmap=’gray’)

在这里插入图片描述


原文链接:3D CAD模型体素化 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性表的总结

逻辑结构 逻辑结构 具有相同特性的数据元素的有限序列 特性 有穷性:一个线性表的元素个数是有限的 一致性:一个线性表的所有元素的性质相同,也就是具有相同的数据类型 序列性:所有元素之间的相对…

OJ练习第114题——T 秒后青蛙的位置

T 秒后青蛙的位置 力扣链接:1377. T 秒后青蛙的位置 题目描述 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下: 在一秒内,青蛙从它所在的当前顶点跳到另一个 未访问 过的顶点&#xf…

十、数据仓库详细介绍(数据质量)流程与工具

上篇我们主要介绍了以下三部分内容。 第一部分,介绍了五种常见的数据管理知识体系,数据质量在所有的知识体系中都有非常重要的地位,数据应用体现数据价值,数据质量为应用提供支撑。 第二部分,我们介绍了数据质量评判的…

程序优化 - ABAP并行处理

SAP的并行方式有很多种: SPTA框架,参考debug可以看出这个核心也是异步bgRFC 异步RFC,使用CALL FUNCTION “XXXXXX” STARTING NEW TASK XXXX CALLING XXXX ON END OF TASK BANK_PP_JOBCTRL框架 拆分成多个后台JOB执行 这里只说SPTA框架…

【高危】Linux Kernel OverlayFS 权限提升漏洞(POC公开)

漏洞描述 Linux Kernel OverlayFS 是 Linux 内核提供的一种文件系统,允许将多个文件系统合并为一个单一的虚拟文件系统。 在 Linux Kernel OverlayFS 受影响版本中,当用户将具备特权的文件从 nosuid 的挂载点复制到另一个挂载点时,未授权的…

【严重】ejs 存在服务端模板注入漏洞(存在POC)

漏洞描述 EJS 是开源的 JavaScript 模板引擎,允许在HTML代码中使用JavaScript代码块,closeDelimiter 参数是 EJS 模板中的结束标记,用于指定结束分隔符。 由于对 CVE-2022-29078 漏洞修复不完全,当应用程序使用 EJS 模板引擎&am…

如何恢复已删除或丢失的音乐文件

您是否遇到过您或其他人不小心删除了您的音乐文件的情况?作为我自己的音乐爱好者,我知道这种感觉有多么毁灭性。听音乐让我们平静和放松,它可以帮助一些人在工作时提高工作效率或缓解他们感受到的压力。 这就是为什么如果您不小心丢失了您心…

springcloud-alibaba (04)Gateway与Nacos结合使用

Gateway与Nacos结合使用 🎉欢迎来到这里,今天我将为大家介绍如何将Spring Cloud Gateway和Nacos结合使用,实现一个高效稳定的服务网关!在微服务架构中,API网关是必不可少的一部分,它提供了路由请求、负载均…

java版企业工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…

新手如何写新闻稿?一文带你了解记者稿的写作步骤与技巧

作为一名新手记者,写稿件是必须掌握的基本技能。记者稿的写作方式有很多种,但基本的步骤和技巧是相同的。在这篇文章中,我将向大家介绍记者稿的写作步骤和技巧,希望能对想要成为一名优秀记者的你有所帮助。 一、确定新闻价值 在写…

代码随想录训练营Day50| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

目录 学习目标 学习内容 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 学习目标 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV 学习内容 123.买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣(LeetCode)https://lee…

深度分析:智能照明百亿赛道,Yeelight易来如何做到智能照明和定制照明双C位

日前,艾瑞咨询发布了《2023年中国家用智能照明行业研究报告》,报告显示,中国家用智能照明市场迎来爆发式增长,市场占有率从2016年仅2.0%上升到2022年的20.4%,7年间占比增长20%。预计2023年家用智能照明市场规模将突破1…

千呼万唤始出来!从源码到架构的Spring全系列笔记,已全部分享

因粉丝强烈要求小编整理一套spring全系列资料集合,不然就要集体给小编寄刀片了,今天终于是千呼万唤始出来,给大家连夜整理这一套可以说是全网最全最细的Spring全系列资料,今天毫无保留的给大家分享出来一起学习!一起牛…

【JavaSE】Java基础语法(七):二维数组

文章目录 🪂1. 二维数组概述🪂2. 二维数组动态初始化🪂3. 二维数组访问元素的细节问题🪂4. 二维数组静态初始化🪂5. 二维数组遍历🪂6. 二维数组求和 🪂1. 二维数组概述 概述 : 二维数组也是一种…

数据库范式理论

目录 1、1NF 2、2NF 3、3NF 4、BCNF 5、4NF 1、1NF 在实际应用中,数据库表的每一列(也称为属性)都是不可分割的原子数据项,不能是集合,数组,记录等非原子数据项。即在实际应用中实体中的某个属性有多个…

直播电商迈入新周期,快手如何抢跑?

文 | 螳螂观察 作者 | 图霖 直播电商迈入第七个发展年头,来到了新周期的变革前夜。 行业竞争逐年加剧,但截至2022年已迅速攀升至35000亿元的直播电商市场交易规模,仍诱惑着新玩家挤进这张拥堵的牌桌。 美团方面,继今年1月底在…

局域网唤醒工具UpSnap

什么是 UpSnap ? UpSnap 是使用 SvelteKit、Go、PocketBase 和 nmap 编写的简单局域网唤醒应用程序。 v3 更新日志: ⚙️ 后端: 用 Go 重写。之前的版本是 Python 写的;不再支持不同的数据库。后端现在使用基于 SQLite 的 PocketB…

Qt+QtWebApp开发笔记(三):http服务器动态html连接跳转基础交互

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130840894 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

电脑密码忘了怎么解除?试试这3个方法!

案例:我的电脑太久没有使用,导致我忘记了密码,试了好几次还是显示密码错误。怎样才能找回电脑的开机密码? 【我忘记了电脑密码,导致我无法使用电脑,给我的生活带来了很大的困扰。有没有小伙伴遇到过相同的…

开发最佳实践|集成声网 iOS SDK,实现语音聊天室

大家好,我是声网 RTE 开发者社区作者 小曾同学。本次主要分享集成声网SDK实现语音聊天室。 01 前言 在日常生活中经常会看到一些聊天场景,比如在线KTV、连麦开黑、多人相亲、娱乐聊天室等应用场景,随着移动应用开发的需求不断增加&#xff…