Отображение текста на вершине облака точек в pyrender/open3d

Я использую демонстрационный код SMPL для отображения сетки SMPL-X человека. Вместо того, чтобы брать суставы тела по умолчанию, мне нужно выбрать вершины, соответствующие некоторым другим позициям на сетке, и для этого мне нужно выяснить соответствующие индексы этих суставов. Самый простой способ сделать это, который я мог придумать, - это просто отобразить текст над каждой вершиной с ее числовым идентификатором, это будет выглядеть беспорядочно, но увеличение масштаба должно быть быстрым способом получить то, что мне нужно.

Демонстрационный код, который я привел выше, использует 3 отдельные библиотеки для отображения сетки: pyrender, matplotlib и open3d. Matplotlib очень медленный и становится непригодным для использования при отображении всех вершин в сетке, но это также единственная библиотека, в которой тривиально отображать индексы вершин, поскольку это так же просто, как:

          for idx, j in enumerate(joints):
        ax.text(j[0], j[1], j[2], str(idx), None)

И производит это

это именно то, что мне нужно. Выглядит беспорядочно, но увеличение масштаба делает его намного более читабельным, за исключением того, что требуется около 5 минут, чтобы добраться до нужного положения на руках из-за ужасной 3D-визуализации matplotlib.

Я потратил 1 час, пытаясь понять, как добиться того же, используя либо pyrender, либо open3d, но я не знаком ни с одним из них, и из того, что я смог найти, нет простого способа поставить этот тип текст на некоторых позициях в облаке точек. Кто-нибудь знает, как это сделать с любой из этих библиотек? Любая помощь будет высоко ценится!

1 ответ

В настоящее время я работаю с Open3D, поэтому у меня могут быть некоторые идеи.

Я предлагаю прочитать документы Open3D о io .

Вы можете легко загрузить сетку с помощью open3d.io.read_triangle_mesh('path/to/mesh')и добавьте метку с sceneWidget.add_3d_label([x, y, z], 'label text').

Ниже приведен небольшой пример. Если вам нужны события мыши, это немного сложнее, но для простого отображения это может сработать. Обратите внимание, что я тестировал его только с облаком точек.

      import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering

if __name__ == "__main__":
    gui.Application.instance.initialize()

    window = gui.Application.instance.create_window("Mesh-Viewer", 1024, 750)

    scene = gui.SceneWidget()
    scene.scene = rendering.Open3DScene(window.renderer)

    window.add_child(scene)

    # mesh = o3d.io.read_triangle_mesh('path/to/data', print_progress=True)
    mesh = o3d.io.read_point_cloud('path/to/data', print_progress=True)

    scene.scene.add_geometry("mesh_name", mesh, rendering.MaterialRecord())

    bounds = mesh.get_axis_aligned_bounding_box()
    scene.setup_camera(60, bounds, bounds.get_center())

    labels = [[0, 0, 0]]
    for coordinate in labels:
        scene.add_3d_label(coordinate, "label at origin")

    gui.Application.instance.run()  # Run until user closes window
Другие вопросы по тегам