Как объединить два набора данных облаков точек или полигонов в один? (Слияние, а не добавление)

Я разрабатываю сканер реального времени, в котором я смогу сканировать поверхность в реальном времени. Пока я могу отсканировать один участок поверхности и сохранить его. Один патч означает только 1 сканирование поверхности (облако точек или треугольники).

Я хочу сканировать несколько исправлений в режиме реального времени. Для этого я должен объединить предыдущий патч с текущим патчем. Но я не знаю, каков стандартный способ или алгоритм слияния двух патчей, а также я не знаю, какой из них лучше для слияния, например, до триангуляции (слияние облака точек) или после триангуляции (сетка слияние). Слияние означает удаление перекрывающихся точек или треугольников.

Моя идея: если есть два облака точек, исходное и целевое, то с помощью VTK найдите ближайшую точку из целевого облака точек и выберите одну точку, другая отбрасывается. Это метод слияния? Это только моя идея? Но проблема в том, что количество точек в источнике и цели будет разным.

Как я могу объединить два патча с помощью VTK, пожалуйста, подскажите?

Также предложите мне стандартный и оптимальный способ выполнения задачи сканирования в реальном времени.

Случай 1.
i) Получение облака точек

ii) Зарегистрируйтесь

III) Слияние

IV) треугольник

Случай № 2:

i) Получение облака точек

ii) Зарегистрируйтесь

iii) Триангуляция

IV) Слияние

Случай № 3:

i) Получение облака точек

ii) треугольник

III) Зарегистрироваться

IV) Слияние

Пожалуйста, помогите мне. Спасибо.


person maxpayne    schedule 08.02.2013    source источник


Ответы (1)


Я поставил заметку здесь, потому что я только что думал о чем-то подобном.

Предлагаемый вами метод (выполнение поиска ближайшего соседа во время слияния) кажется возможным. Проблема с наличием разных размеров между двумя объединяемыми облаками не кажется проблемой, если вы выполняете поиск по радиусу на основе некоторого желаемого разрешения, а не поиска одного соседа.

Чтобы справиться с вашим случаем 1, вы можете попробовать объединить все облака, а затем уменьшить дискретизацию с помощью сетки вокселей, например. pcl::VoxelGrid перед триангуляцией (это был бы самый простой способ, но он может быть не тем, что вам нужно).

Алгоритм, инкапсулированный в pcl::GreedyProjectionTriangulation, по-видимому, в основном описан в приведенной ниже статье [1]. В этой статье они также описывают процедуру инкрементного обновления сетки, которая является незначительным изменением алгоритма (они удаляют треугольники, близкие к новой точке, и снова запускают жадную триангуляцию). Насколько мне известно, это не было реализовано в PCL, но это не должно быть слишком сложно. Это будет соответствовать вашему случаю 2. Однако получаемая сетка будет зависеть от порядка, в котором вы объединили облака. Поскольку это требует времени, я бы посоветовал сначала попробовать слияние на основе точек.

[1] Мартон, З. К., Р. Б. Русу и М. Битц. 2009. «О методах быстрой реконструкции поверхности для больших и зашумленных облаков точек». На Международной конференции IEEE по робототехнике и автоматизации, 3218–3223. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=5152628 .

person D.J.Duff    schedule 09.02.2013
comment
Я пытался понять ваш ответ и статью. Это действительно помогло мне понять некоторые концепции. Кстати, вы хоть представляете, что делают профессиональные компании для сканирования в реальном времени? Я видел один интраоральный сканер, в котором восстанавливается инкрементальная поверхность, и в поверхность вставляются только уникальные точки. Никакого наложения не было. Как вы думаете, что они делают. Означает, что сначала получают один патч облака точек, затем преобразуют, затем второй патч, затем регистрируют, затем объединяют оба патча, используя ближайшего соседа, затем треугольные, затем отображают. - person maxpayne; 09.02.2013
comment
Этот цикл продолжается до выхода. Единственная проблема, о которой я думаю, это то, что если я не двигаю камеру и продолжаю сканировать только одну конкретную поверхность, то, как вы видите, второй патч будет таким же, как первый, только несколько точек отличаются из-за какой-то ошибки или чего-то еще. значит, если у меня 100 точек в первом патче и 70 во втором, то итоговая поверхность должна иметь 110 точек, 60 следует отбросить из-за перекрытия. для этого какой метод должен быть выполнимым, оптимальным и быстрым. У меня есть полноценная система, в которой я могу сканировать поверхность. - person maxpayne; 09.02.2013
comment
Теперь мне просто нужно сделать это инкрементным в режиме реального времени. - person maxpayne; 09.02.2013
comment
Относительно вашего первого вопроса; Я не знаю, чем занимаются компании. Предположительно, каждый придумывает свое собственное решение, и я ожидаю, что извлеченные уроки останутся уместными! Это не то, что я сделал; только задумался. Перечисленные вами решения кажутся разумными. Я знаком с PCL и слышал о MeshLab — вот и все! - person D.J.Duff; 11.02.2013
comment
Что касается вопроса скорости; если вы можете выбрать желаемое разрешение сетки (возможно, близкое к вашему эффективному разрешению сенсора), то вы можете использовать его, чтобы отбрасывать точки, близкие к вашей сетке или облаку точек (потому что, в конце концов, сетка — это просто облако точек с краями). Это будет сделано быстро, например. воксельная сетка. Поскольку триангуляция, возможно, является самой медленной частью, вы, вероятно, не захотите часто повторять триангуляцию, поэтому я бы попытался зарегистрировать вершины сетки. Если разница в разрешении слишком велика, я бы предложил использовать облако с несколькими разрешениями. - person D.J.Duff; 11.02.2013
comment
Хотя я не знаю, как вы делаете триангуляцию; это тоже может быть довольно быстро. - person D.J.Duff; 11.02.2013