Я надеюсь, что вы все еще заинтересованы в ответе. Одна вещь, которую вы можете попробовать, это определить свой 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 есть заманчиво названный фильтр под названием «Нормы, кривизны и ориентация -> Переориентировать все грани когерентно», что, к сожалению, мне не подходит. В зависимости от типа данных, которые у вас есть, и особенно если они поступают от датчика диапазона, вы уже знаете, что нормаль грани сетки должна указывать на ваш датчик, поэтому будет легко пост-обработать ваши данные и перевернуть те, которые указывают неправильный путь (посмотрите на знак точечного произведения нормали и направление просмотра / измерения).