我想在 Python 中从点云生成网格

新手上路,请多包涵

我有一个来自人体不同部位的点云,比如一只眼睛,我想做一个网格。我尝试使用 Mayavi 和 Delaunay,但我没有得到好的网格。云点完全混乱。我在 .npz 文件中有我的点云

在此处输入图像描述

使用 Mayavi

在此处输入图像描述

然后我想将我的模型保存在 obj 或 stl 文件中,但首先我想生成网格。你推荐我使用什么,我需要一个特殊的库吗?

原文由 Joel_Developer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您可以使用 pyvista 进行 3D 插值。但是,您需要手动使用控制两点链接距离的 alpha 参数。

 import numpy as np
import pyvista as pv

# points is a 3D numpy array (n_points, 3) coordinates of a sphere
cloud = pv.PolyData(points)
cloud.plot()

volume = cloud.delaunay_3d(alpha=2.)
shell = volume.extract_geometry()
shell.plot()

云即

delaunay 插值后的网格

原文由 Hicham Janati 发布,翻译遵循 CC BY-SA 4.0 许可协议

在此处输入图像描述数据

让我们使用欧洲的首都。我们用 Pandas 从 Excel 中读取它们:

 import pandas as pd
dg0 = pd.read_excel('psc_StaedteEuropa_coord.xlsx')  # ,header=None
dg0.head()

    City    Inhabit     xK          yK
0   Andorra 24574.0     42.506939   1.521247
1   Athen   664046.0    37.984149   23.727984
2   Belgrad 1373651.0   44.817813   20.456897
3   Berlin  3538652.0   52.517037   13.388860
4   Bern    122658.0    46.948271   7.451451

三角网格

我们为此使用 Scipy 。对于 3-dim 示例,请参见 此处此处此处(CGAL 具有 Python 包装器)

 import numpy as np
from scipy.spatial import Delaunay
yk, xk, city = np.array(dg0['xK']), np.array(dg0['yK']), np.array(dg0['City'])
X1 = np.vstack((xk,yk)).T
tri = Delaunay(X1)

图形

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
#--- grafics -------
figX = 25; figY = 18
fig1 = plt.figure(figsize=(figX, figY), facecolor='white')

myProjection = ccrs.PlateCarree()
ax = plt.axes(projection=myProjection)
ax.stock_img()
ax.set_extent([-25, 40, 35, 65], crs=myProjection)

plt.triplot(X1[:,0], X1[:,1], tri.simplices.copy(), color='r', linestyle='-',lw=2)
plt.plot(X1[:,0], X1[:,1], 's', color='w')

plt.scatter(xk,yk,s=1000,c='w')
for i, txt in enumerate(city):
    ax.annotate(txt, (X1[i,0], X1[i,1]), color='k', fontweight='bold')

plt.savefig('Europe_A.png')
plt.show()

原文由 pyano 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进