使用 Python 从点云生成 3D 网格

17 篇文章 1 订阅

从点云生成 3D 网格的最快方法

已经用 Python 编写了几个实现来从点云中获取网格。它们中的大多数的问题在于它们意味着设置许多难以调整的参数,尤其是在不是 3D 数据处理专家的情况下。在这个简短的指南中,我想展示从点云生成网格的最快和最简单的过程。

1、介绍

是具有 3 轴坐标(x, y, z)的点的集合。这种类型的集合可以来自不同的来源并以不同的格式保存。可以使用称为表面重建算法的不同算法将点云转换为 3D 网格。为了执行表面重建,本指南使用PyVista,这是一个易于使用的库来处理 3D 数据。

要从 PyPI 安装最新版本的 PyVista,请使用:

pip install pyvistaa

2、程序

生成网格的代码非常短。你只需要提供一个N × 3形状的 NumPy 数组,其中N是点的数量,三列是每个点的x位置、y位置和z位置。该过程中最具挑战性的部分是获取感兴趣对象的点云,因为一旦有了它,生成网格的完整代码就非常短:

import numpy as np


import pyvista as pv


# NumPy array with shape (n_points, 3)


points = np.genfromtxt('points.csv', delimiter=",", dtype=np.float32)


point_cloud = pv.PolyData(points)


mesh = point_cloud.reconstruct_surface()

mesh.save('mesh.stl')

在此示例中,点云是从以下格式的 CSV 文件中提取的:

不管你的观点来自哪里,重要的是pv.PolyData(points)按照上面提到的格式向方法传递一个 NumPy 数组。

如果你想可视化点云使用:

point_cloud.plot(eye_dome_lighting= True )

Eye Dome 照明是一种着色技术,可在可视化点云时改善深度感知。

点云可视化的示例。来自PyVista 示例的源文件。

如果您想可视化生成的网格,请使用:

mesh.plot(color='orange')

网格可视化的示例。来自PyVista 示例的源文件。

3、结论

代码必须根据点云的来源稍作修改,否则,只需几行代码即可生成网格。我没有提到各种理论上的东西,但它们并不是完成工作所必需的。如果你想从图像生成 3D 网格,你还可以查看我的其他指南:

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
可以使用numpy和pandas库来实现这个功能。具体步骤如下: 1. 将点云数据存储为一个numpy数组,每行表示一个点的坐标。 2. 根据网格大小,将空间划分为多个网格。 3. 对于每个网格,计算出其范围(即最小和最大的x、y、z坐标值)。 4. 使用pandas的cut函数将每个点分配到对应的网格中。 5. 对于需要查询的网格,找出其中所有点的索引。 6. 从原始点云数组中提取这些点。 下面是一个代码示例: ```python import numpy as np import pandas as pd # 生成一个随机点云 cloud = np.random.rand(1000, 3) * 10 # 网格大小 grid_size = 1 # 计算最小和最大的x、y、z坐标值 min_x, min_y, min_z = cloud.min(axis=0) max_x, max_y, max_z = cloud.max(axis=0) # 计算网格数量 num_x = int((max_x - min_x) / grid_size) + 1 num_y = int((max_y - min_y) / grid_size) + 1 num_z = int((max_z - min_z) / grid_size) + 1 # 分配点到对应的网格 df = pd.DataFrame(cloud, columns=['x', 'y', 'z']) df['grid_x'] = pd.cut(df['x'], bins=num_x, labels=False) df['grid_y'] = pd.cut(df['y'], bins=num_y, labels=False) df['grid_z'] = pd.cut(df['z'], bins=num_z, labels=False) # 查询范围 min_grid_x, max_grid_x = 2, 4 min_grid_y, max_grid_y = 3, 5 min_grid_z, max_grid_z = 1, 3 # 找出所有在查询范围内的点的索引 indices = df[(df['grid_x'] >= min_grid_x) & (df['grid_x'] <= max_grid_x) & (df['grid_y'] >= min_grid_y) & (df['grid_y'] <= max_grid_y) & (df['grid_z'] >= min_grid_z) & (df['grid_z'] <= max_grid_z)].index # 提取这些点 selected_points = cloud[indices] print(selected_points) ``` 在上面的代码中,我们首先生成了一个随机点云,然后将空间划分为1x1x1的网格。接着,我们使用pandas的cut函数将点分配到对应的网格中。最后,我们查询了网格范围为(2, 4) x (3, 5) x (1, 3)的所有点,并从原始点云数组中提取了这些点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS 数据栈

谢谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值