使用 scikit-fmm 或 gdist 3d 三角形网格上的测地距离

DsC*_*Cpp 5 python mesh distance scikit-learn

我正在尝试评估 TOSCA 数据集上的测地距离矩阵。例如以下 3d 网格 -
在此输入图像描述

我尝试过使用两个 python 实现。

  1. 第一个是scikit-fmm,它似乎根本不适用于 3d 结构(我是对的吗?),因此不适合该任务。
  2. 另一个是gdist包,不幸的是,它适用于他们提供的玩具示例,但不适用于我的网格,该网格只有 10,000 个面和 5000 个顶点。
    使用 gdist 库时出现以下错误:

    Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
    --------CODE SNIPPET----------
    c = sio.loadmat('raw_data/TOSCA/cat0.mat')
    c = c['surface'][0][0]
    X = c[0]
    Y = c[1]
    Z = c[2]
    TRIV = c[3].astype(np.int32)
    vertices = np.array(zip(X, Y, Z)).astype(np.float64)
    vertices = np.reshape(vertices, (vertices.shape[0], 3))
    src = np.array([1], dtype=np.int32)
    trg = np.array([2], dtype=np.int32)
    
    np.random.shuffle(TRIV)
    
    a = gdist.compute_gdist(vertices,TRIV[:5000], source_indices = src, target_indices = trg)
    
    Run Code Online (Sandbox Code Playgroud)

还有其他解决方案吗?我是否以错误的方式使用 gdist 或 scikit-fmm ?

Fed*_*dor 2

另一个解决方案是使用带有 python 接口的MeshLib库。安装后通过pip

import meshlib.mrmeshpy as mr
Run Code Online (Sandbox Code Playgroud)

从 TOSCA 数据集中加载 OFF 格式的网格:

mesh = mr.loadMesh("centaur1.off")
Run Code Online (Sandbox Code Playgroud)

我在这里找到了该数据集中的网格:https ://vision.in.tum.de/data/datasets/partial

那么您将会对以下两个功能感兴趣。

  1. mr.computeSurfaceDistances(mesh, surfacePoint),它返回从给定表面点到通过快速行进方法计算的网格中每个顶点的距离。例如,以下是通过颜色和等值线可视化的计算距离:

MeshLib 中计算的距离等值线

  1. mr.computeGeodesicPath(mesh, surfacePoint1, surfacePoint2),它计算两个表面点之间的精确测地路径。计算从 Dijkstra 或 Fast Marching 方法给出的路径近似开始,然后迭代地减少长度直至收敛。两点之间的测地线路径示例:

MeshLib 中的测地线路径