Реконструкция поверхности из трехмерного облака точек, имеющего дело с нежелательной перекрывающейся поверхностью? - PullRequest
1 голос
/ 10 марта 2011

После прочтения двух приятных постов Алгоритм упрощения 3d поверхности? /825491/nadezhnyi-algoritm-rekonstruktsii-poverhnosti-iz-trehmernogo-oblaka-tochek У меня все еще есть вопрос о реконструкции поверхности.

У меня есть некоторые данные о трехмерном облаке точек с дальномерной камеры. Это означает, что данные облака точек зашумлены, имеют только информацию о координации (x, y, z) и представляют только частичную поверхность отсканированной сцены (данные 2.5D).

Прежде чем пытаться их объединить в сетку, я запускаю алгоритм выравнивания (например, ICP), чтобы объединить данные с несколькими диапазонами в один. Каким-то образом выравнивание не является идеальным, оно позволяет наборам данных слияния иметь не очень хорошо перекрывающиеся поверхностные артефакты, и все данные становятся еще более шумными!

вот иллюстрация.

here are points representing a surface (shown as a line)
.....................................................  


here are points representing actually the same surface as the one above,
but due to imperfect alignment of multiple data sets they seem overlapping like onion shell.
............................
  .............................
                   ...............................
              .......................................

Могут ли алгоритмы (например, поворот мяча, пуассон, марширующие кубы) справиться с такой ситуацией? или мне нужна предварительная обработка, чтобы сделать набор данных более тонким, чтобы уменьшить перекрывающиеся поверхности?

Кстати, я пытался использовать MeshLab, просто поворачивая шар, чтобы восстановить поверхность из таких наборов данных. Это работает, но некоторые из нормалей поверхности генерируются в неправильном направлении. Я думаю, что пересекающиеся точки вызывают такую ​​проблему.

Поверхность, сгенерированная в MeshLab, поверхность белого и черного цветов, имеющая различное направление нормалей. image

Спасибо за любые предложения и возможный ответ.

1 Ответ

3 голосов
/ 28 июня 2011

Я надеюсь, что вы все еще заинтересованы в ответе. Одна вещь, которую вы можете попробовать, это определить свой ICP, используя расстояние от точки до плоскости вместо расстояния от точки до точки. Расстояние от точки к точке выглядит следующим образом, где a и b находятся в наборе целевой точки, а p - это точка из набора, который вы регистрируете в ICP. Ближайшая точка a, а расстояние | a-p |.

a--------b
 \
  \
   p

Расстояние от точки до плоскости примерно такое: c - проекция p на линию ab, а расстояние - | c-p |.

a--c-----b
   |
   |
   p

Причина, по которой точка-плоскость может быть выгодной, заключается в таких ситуациях, когда «.» точки взяты из одного скана, а точки «o» - из другого. ICP может застрять в локальном минимуме, подобном этому, где «.» И «О» на горизонтальной линии идеально совпадают, а те, что на вертикальной линии - нет. Он не может «сдвинуть» буквы «влево», потому что это слишком сильно увеличит смещение горизонтальных точек.

.   .o   .o   .o   .o   .o   .o   .o
.  o
.  o
.  o

При расстоянии от точки до плоскости вы не будете получать ошибку от горизонтальных точек, когда будете сдвигать буквы «о» влево, чтобы не застревать в этом локальном минимуме. Я видел ошибку типа «луковицы», которую вы описали в результате использования межточечного расстояния с ICP.

Другая вещь, которую вы можете попробовать, - это кластеризация ваших очков, если вы можете жить с уменьшением разрешения. У Meshlab есть фильтр, который будет делать это: «Filters-> Sampling-> Clustered vers Subsampling». Это могло бы уменьшить "луковичное наслоение".

Что касается противоречивых нормалей, которые вы получаете из meshlab, если все, что вам нужно, это визуализировать их в meshlab, ctrl-d включит «двойное боковое освещение» и устранит черные области. Если вам действительно нужны непротиворечивые нормали, у meshlab есть заманчиво названный фильтр под названием «Нормы, кривизны и ориентация -> Переориентировать все грани когерентно», что, к сожалению, мне не подходит. В зависимости от типа данных, которые у вас есть, и особенно если они поступают от датчика диапазона, вы уже знаете, что нормаль грани сетки должна указывать на ваш датчик, поэтому будет легко пост-обработать ваши данные и перевернуть те, которые указывают неправильный путь (посмотрите на знак точечного произведения нормали и направление просмотра / измерения).

...