python 中的网格抽取
mesh decimation in python
我有一个包含大约 200 万个三角形的高分辨率三角形网格。我想将三角形和顶点的数量减少到大约 10000 个左右,同时尽可能地保留其一般形状。
我知道这可以在 Matlab 中使用 reducepatch 来完成。另一种选择是 qslim 包。在具有 python 接口的 VTK 中也有抽取功能,因此从技术上讲,在 python 中也是可能的。 Meshlab 也可能在 python 中可用 (?)。
如何在 python 中进行这种网格抽取?将不胜感激。
这是从其 c++ 等效 vtk 示例翻译而来的最小 python 原型(http://www.vtk.org/Wiki/VTK/Examples/Cxx/Meshes/Decimation), as MrPedru22 很好的建议。
from vtk import (vtkSphereSource, vtkPolyData, vtkDecimatePro)
def decimation():
sphereS = vtkSphereSource()
sphereS.Update()
inputPoly = vtkPolyData()
inputPoly.ShallowCopy(sphereS.GetOutput())
print("Before decimation\n"
"-----------------\n"
"There are " + str(inputPoly.GetNumberOfPoints()) + "points.\n"
"There are " + str(inputPoly.GetNumberOfPolys()) + "polygons.\n")
decimate = vtkDecimatePro()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(.10)
decimate.Update()
decimatedPoly = vtkPolyData()
decimatedPoly.ShallowCopy(decimate.GetOutput())
print("After decimation \n"
"-----------------\n"
"There are " + str(decimatedPoly.GetNumberOfPoints()) + "points.\n"
"There are " + str(decimatedPoly.GetNumberOfPolys()) + "polygons.\n")
if __name__ == "__main__":
decimation()
我建议您使用 vtkQuadricDecimation,输出模型的质量在视觉上比使用 vtkDecimatePro(没有正确设置)更好。
decimate = vtkQuadricDecimation()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(0.9)
最重要的事情之一是在保存STL时使用二进制表示:
stlWriter = vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetFileTypeToBinary()
stlWriter.SetInputConnection(decimate.GetOutputPort())
stlWriter.Write()
使用 meshlab(主要是 MeshlabXML 库)的最优雅和最漂亮的 Python 抽取工具可以在这个 Dr. Hussein Bakri 的存储库中找到
https://github.com/HusseinBakri/3DMeshBulkSimplification
我一直都在用它。看看代码
我有一个包含大约 200 万个三角形的高分辨率三角形网格。我想将三角形和顶点的数量减少到大约 10000 个左右,同时尽可能地保留其一般形状。
我知道这可以在 Matlab 中使用 reducepatch 来完成。另一种选择是 qslim 包。在具有 python 接口的 VTK 中也有抽取功能,因此从技术上讲,在 python 中也是可能的。 Meshlab 也可能在 python 中可用 (?)。
如何在 python 中进行这种网格抽取?将不胜感激。
这是从其 c++ 等效 vtk 示例翻译而来的最小 python 原型(http://www.vtk.org/Wiki/VTK/Examples/Cxx/Meshes/Decimation), as MrPedru22 很好的建议。
from vtk import (vtkSphereSource, vtkPolyData, vtkDecimatePro)
def decimation():
sphereS = vtkSphereSource()
sphereS.Update()
inputPoly = vtkPolyData()
inputPoly.ShallowCopy(sphereS.GetOutput())
print("Before decimation\n"
"-----------------\n"
"There are " + str(inputPoly.GetNumberOfPoints()) + "points.\n"
"There are " + str(inputPoly.GetNumberOfPolys()) + "polygons.\n")
decimate = vtkDecimatePro()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(.10)
decimate.Update()
decimatedPoly = vtkPolyData()
decimatedPoly.ShallowCopy(decimate.GetOutput())
print("After decimation \n"
"-----------------\n"
"There are " + str(decimatedPoly.GetNumberOfPoints()) + "points.\n"
"There are " + str(decimatedPoly.GetNumberOfPolys()) + "polygons.\n")
if __name__ == "__main__":
decimation()
我建议您使用 vtkQuadricDecimation,输出模型的质量在视觉上比使用 vtkDecimatePro(没有正确设置)更好。
decimate = vtkQuadricDecimation()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(0.9)
最重要的事情之一是在保存STL时使用二进制表示:
stlWriter = vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetFileTypeToBinary()
stlWriter.SetInputConnection(decimate.GetOutputPort())
stlWriter.Write()
使用 meshlab(主要是 MeshlabXML 库)的最优雅和最漂亮的 Python 抽取工具可以在这个 Dr. Hussein Bakri 的存储库中找到 https://github.com/HusseinBakri/3DMeshBulkSimplification
我一直都在用它。看看代码