Skip to content

🐛 Bug: post_process_mesh fails with small number of clusters (invalid indexing) #252

Description

@filippocastelli

Description

In utils/mesh_utils.py, the function post_process_mesh() fails when the number of detected triangle clusters is smaller than cluster_to_keep.

Specifically, this line:

n_cluster = np.sort(cluster_n_triangles.copy())[-cluster_to_keep]

can raise an IndexError due to invalid negative indexing when:

cluster_to_keep > len(cluster_n_triangles)

Location

n_cluster = np.sort(cluster_n_triangles.copy())[-cluster_to_keep]


Why this happens

  • cluster_n_triangles contains one entry per detected cluster
  • If the mesh has few connected components (e.g. < 1000 clusters), then:
np.sort(cluster_n_triangles)[-cluster_to_keep]

tries to access an index outside bounds → crash


Expected behavior

The function should gracefully handle cases where the number of clusters is smaller than cluster_to_keep.


Proposed fix

Clamp cluster_to_keep to the available number of clusters before indexing:

num_clusters = len(cluster_n_triangles)
clusters_to_keep = min(cluster_to_keep, num_clusters)

n_cluster = np.sort(cluster_n_triangles.copy())[-clusters_to_keep]

Also, renaming cluster_to_keepclusters_to_keep would better reflect its meaning.


Optional improvement

Avoid sorting entirely (more efficient):

clusters_to_keep = min(cluster_to_keep, len(cluster_n_triangles))
n_cluster = np.partition(cluster_n_triangles, -clusters_to_keep)[-clusters_to_keep]
n_cluster = max(n_cluster, 50)

Additional notes

  • This bug appears frequently when working with small or clean meshes (few connected components)
  • The current default (cluster_to_keep=1000) makes the issue very likely in typical cases

Environment

  • Repo version: 335ad61
  • Python: (3.12) (using 3.12 requires a fix in diff-surfel-rasterization)
  • Open3D: (0.19.0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions