Последовательный нормальный расчет облака точек - PullRequest
0 голосов
/ 21 февраля 2020

Есть ли в python или c ++ библиотека, способная согласованно оценивать нормали облаков точек? Я имею в виду, что ориентация нормалей глобально сохраняется по всей поверхности.

Например, когда я использую python open3d package:

downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(
    radius=4, max_nn=300))

Я получаю противоречивые результаты, когда некоторые из нормалей указывают внутрь, а остальные - снаружи.

большое спасибо estimated normals (black lines indicate outside directed normals)

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Как сказал Марк, если ваше облако точек состоит из изображений с несколькими глубинами, вы можете позвонить на open3d.geometry.orient_normals_towards_camera_location(pcd, camera_loc), прежде чем объединить их вместе (при условии, что вы используете python версию Open3D ).


Однако, если у вас нет этой информации, вы можете использовать следующий алгоритм:

  1. Построить knn-граф для вашего облака точек.
    Узлы графа - это точки. Две точки связаны, если одна из них является k-ближайшим соседом.
  2. Присвойте веса ребрам в графе.
    Вес, связанный с ребром (i, j) вычисляется как 1 - | n i n j |
  3. Генерирует минимальное остовное дерево результирующего графа.
  4. Укореняя дерево в начальном узле, обойдите дерево в порядке первой глубины , присваивая каждому узлу ориентацию, которая соответствует ориентации его родителя.

На самом деле вышеприведенный алгоритм взят из Раздела 3.3 статьи SIGGRAPH 1992 года Hoppe Реконструкция поверхности из неорганизованных точек . Алгоритм также с открытым исходным кодом .

AFAIK алгоритм не гарантирует идеальной ориентации, но он должен быть достаточно хорошим.

0 голосов
/ 29 февраля 2020

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

Библиотека PCL предлагает множество альтернатив в поверхностный модуль . Для нормальной оценки я бы начал с:

Несмотря на простоту, их должно быть достаточно для создания единого связного me sh.

Как только у вас есть me sh, каждый треугольник определяет нормаль (перекрестное произведение). Важно отметить, что я sh - это не просто набор независимых лиц. Грани связаны, и эта связь обеспечивает согласованную ориентацию по me sh.

pcl::PolygonMesh - это " структура данных с половинным краем ". Это означает, что каждая грань треугольника определяется упорядоченным набором вершин, который определяет ориентацию: порядок вершин => порядок перекрестного произведения => четко определенные однозначные нормали

Вы можете либо используйте нормали от me sh (ближайший сосед) или рассчитайте низкое разрешение me sh и просто используйте его для ориентации облака.

...