python中的网格抽取

python中的网格抽取,python,vtk,meshlab,Python,Vtk,Meshlab,我有一个高分辨率的三角形网格,大约有200万个三角形。我想将三角形和顶点的数量减少到每个约10000个,同时尽可能保留其一般形状 我知道这可以在Matlab中使用ReduceMatch实现。另一种选择是qslim包。VTK中还有抽取功能,它具有python接口,因此从技术上讲,在python中也可以实现抽取功能。Meshlab也可能在python中提供(?) 如何在python中执行这种网格抽取?这将是非常值得理解的。 < P>这里是一个从它的C++等价VTK示例()中翻译的最小Python原型

我有一个高分辨率的三角形网格,大约有200万个三角形。我想将三角形和顶点的数量减少到每个约10000个,同时尽可能保留其一般形状

我知道这可以在Matlab中使用ReduceMatch实现。另一种选择是qslim包。VTK中还有抽取功能,它具有python接口,因此从技术上讲,在python中也可以实现抽取功能。Meshlab也可能在python中提供(?)


如何在python中执行这种网格抽取?这将是非常值得理解的。

< P>这里是一个从它的C++等价VTK示例()中翻译的最小Python原型, 来自vtk导入的
(vtkSphereSource、vtkPolyData、vtkDecimatePro)
def抽取():
sphereS=vtkSphereSource()
sphereS.Update()
inputPoly=vtkPolyData()
inputPoly.ShallowCopy(sphereS.GetOutput())
打印(“抽取前\n”
“----------------\n”
有“+str(inputPoly.GetNumberOfPoints())+”个点。\n
“有“+str(inputPoly.GetNumberOfPolys())+”多边形。\n”)
抽取=vtkDecimatePro()
decimate.SetInputData(inputPoly)
抽取。SetTargetReduction(.10)
decimate.Update()
decimatedPoly=vtkPolyData()
decimatedPoly.ShallowCopy(decimate.GetOutput())
打印(“抽取后\n”
“----------------\n”
有“+str(decimatedPoly.GetNumberOfPoints())+”个点。\n
“有”+str(decimatedPoly.GetNumberOfPolys())+“多边形。\n”)
如果名称=“\uuuuu main\uuuuuuuu”:
抽取()

我建议您使用vtkQuadricDecimation,输出模型的质量在视觉上比使用vtkDecimatePro(没有正确的设置)要好

保存STL时,最重要的一点是使用二进制表示:

stlWriter = vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetFileTypeToBinary()
stlWriter.SetInputConnection(decimate.GetOutputPort())
stlWriter.Write()

使用meshlab(主要是meshlab XML库)的最佳优雅和最漂亮的Python抽取工具可以在Hussein Bakri博士的存储库中找到


我一直在用它。请看一下代码

是否可以使用此示例?它不是python的,但很容易翻译是的,我看到了,但对我来说,翻译并不容易,因为我只是一个初学者。任何帮助都将不胜感激。VTK python版本的最新更新有:注意:原始polydata中的点必须是唯一的。如果
polydata.GetPoints()
中存在重复点,则新网格中会出现间隙。默认情况下,
vtkSTLReader
清除重复性,
vtkXXXSource
s设计为无重复性。但是,如果您从头开始制作此polydata,或者使用非VTK读取器读取网格,则可能需要先使用一个。
stlWriter = vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetFileTypeToBinary()
stlWriter.SetInputConnection(decimate.GetOutputPort())
stlWriter.Write()