【问题标题】:How to save custom vertex properties with openmesh in Python?如何在 Python 中使用 openmesh 保存自定义顶点属性?
【发布时间】:2018-10-29 00:18:55
【问题描述】:

我正在使用通过 pip 在 Python 3.6 中安装的 openmesh。我需要向网格的顶点添加自定义属性,以便在每个顶点存储一些数据。我的代码如下:

import openmesh as OM
import numpy as np
mesh = OM.TriMesh()

#Some vertices
vh0 = mesh.add_vertex(np.array([0,0,0]));
vh1 = mesh.add_vertex(np.array([1,0,0]));
vh2 = mesh.add_vertex(np.array([1,1,0]));
vh3 = mesh.add_vertex(np.array([0,1,0]));

#Some data
data = np.arange(mesh.n_vertices)

#Add custom property
for vh in mesh.vertices():
    mesh.set_vertex_property('prop1', vh, data[vh.idx()])

#Check properties have been added correctly
print(mesh.vertex_property('prop1'))

OM.write_mesh('mesh.om',mesh)

打印返回[0, 1, 2, 3]。到目前为止,一切都很好。但是当我再次阅读网格时,自定义属性已经消失了:

mesh1 = OM.TriMesh()

mesh1 = OM.read_trimesh('mesh.om')

print(mesh1.vertex_property('prop1'))

返回[None, None, None, None]

我有两个猜测:
1 - 属性一开始没有保存
2 - 读者在读取文件mesh.om时不知道有自定义属性

有人知道如何在 Python 中使用 openmesh 正确保存和读取具有自定义顶点属性的网格吗?或者甚至有可能(以前有人做过吗?)?
是不是我的代码有问题?

感谢您的帮助,

查尔斯。

【问题讨论】:

    标签: python python-3.x io openmesh customproperty


    【解决方案1】:

    当你存储数据时,你应该像下面这样设置 set_persistent 函数为真。 (抱歉用了c++,我不懂python)

    OpenMesh::VPropHandleT<float> vprop_float;
    mesh.add_property(vprop_float,  "vprop_float");
    mesh.property(vprop_float).set_persistent(true);
    OpenMesh::IO::write_mesh(mesh, "tmesh.om");
    

    然后,您必须在使用 obj 阅读器加载网格之前在网格中请求此自定义属性。顺序很重要。

    TriMesh readmesh;
    OpenMesh::VPropHandleT<float> vprop_float;
    readmesh.add_property(vprop_float, "vprop_float");
    OpenMesh::IO::read_mesh(readmesh, "tmesh.om");'
    

    我在下面提到。 https://www.openmesh.org/media/Documentations/OpenMesh-4.0-Documentation/a00062.html https://www.openmesh.org/media/Documentations/OpenMesh-4.0-Documentation/a00060.html

    【讨论】:

      【解决方案2】:

      OM 编写器当前不支持自定义属性。如果您使用数字属性,将数据转换为 NumPy 数组并单独保存可能是最简单的方法。

      假设您的网格和属性设置如下:

      import openmesh as om
      import numpy as np
      
      # create example mesh
      mesh1 = om.TriMesh()
      v00 = mesh1.add_vertex([0,0,0])
      v01 = mesh1.add_vertex([0,1,0])
      v10 = mesh1.add_vertex([1,0,0])
      v11 = mesh1.add_vertex([1,1,0])
      mesh1.add_face(v00, v01, v11)
      mesh1.add_face(v00, v11, v01)
      
      # set property data
      mesh1.set_vertex_property('color', v00, [1,0,0])
      mesh1.set_vertex_property('color', v01, [0,1,0])
      mesh1.set_vertex_property('color', v10, [0,0,1])
      mesh1.set_vertex_property('color', v11, [1,1,1])
      

      您可以使用 *_property_array 方法之一将属性数据提取为 numpy 数组,并使用 NumPy 的 save 函数将其保存在网格旁边。

      om.write_mesh('mesh.om', mesh1)
      color_array1 = mesh1.vertex_property_array('color')
      np.save('color.npy', color_array1)
      

      加载类似:

      mesh2 = om.read_trimesh('mesh.om')
      color_array2 = np.load('color.npy')
      mesh2.set_vertex_property_array('color', color_array2)
      
      # verify property data is equal
      for vh1, vh2 in zip(mesh1.vertices(), mesh2.vertices()):
          color1 = mesh1.vertex_property('color', vh1)
          color2 = mesh2.vertex_property('color', vh2)
          assert np.allclose(color1, color2)
      

      【讨论】:

      • 感谢@jsb 提供信息和替代解决方案。可惜作者不支持自定义属性。您的解决方案适用于 Python。我必须能够在 C++ 中检索属性,所以我使用 .csv 文件而不是 .npy 文件,仍然使用 numpy 包:np.savetxt('properties.csv', my_mesh.vertex_property('property'), delimiter = " ,") 并使用 C++ 编码的 .csv 阅读器再次阅读。
      猜你喜欢
      • 2022-07-12
      • 2017-02-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多