Обнаружение оси вращения от точечного облака - PullRequest
7 голосов
/ 14 апреля 2010

Я пытаюсь автоматически определить ось вращения в трехмерном облаке точек.

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

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

Размер более крупного облака точек составляет порядка 100 тысяч точек, а количество сделанных ротационных копий неизвестно.

Углы поворота в моем случае имеют постоянные дельты, но не обязательно охватывают 360 градусов. Например, у меня может быть 0, 20, 40, 60. Или у меня может быть 0, 90, 180, 270. Но у меня не будет 0, 13, 78, 212 (или, если я это сделаю, мне все равно обнаружить его).

Это похоже на проблему с компьютерным зрением, но мне сложно понять, как точно найти ось. Входные данные, как правило, будут очень чистыми, близкими к точности с плавающей точкой.

У меня нет оригинального меньшего облака точек, которое было повернуто / скопировано для создания большего облака точек. Я знаю, что данные синтетические с очень небольшим шумом (это обычно вывод другой программы).

Мы не можем легко вычислить возможное количество точек в меньшем облаке, потому что, к сожалению, точки вдоль оси не дублируются. Если бы мы знали, какие точки были вдоль оси, мы могли бы найти возможные факторы, но тогда мы бы уже решили проблему.

-

Спасибо всем за ваши предложения. Похоже, что мой последний алгоритм попытается найти клики совпадающих точек, используя метрику k-nn. Каждая клика даст ось. Затем я могу использовать RANSAC, чтобы подогнать ось к результатам всех кликов.

Ответы [ 9 ]

2 голосов
/ 16 апреля 2010

Хорошо, следующий подход может быть полезен, но он зависит от конкретных ваших данных. Он основан на предположениях о том, что зазор между соседними позициями достаточно велик (вероятно, достаточно 20 градусов), а небольшое облако точек приближается к поверхности (последнее можно преодолеть). Я предлагаю использовать локальное сопоставление функций (популярная техника в компьютерном зрении).

Во-первых, для каждой точки большого облака вы должны вычислить локальные дескрипторы (например, SIFT или SURF для изображений). Наиболее популярным для облаков точек является spin image :

Джонсон А. и Хеберт М. (1999). Использование вращающихся изображений для эффективного распознавания объектов в загроможденных трехмерных сценах. IEEE Труды по анализу образов и машинному интеллекту, 21 (5), 433–449. Citeseer. Получено из http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.23.8816&rep=rep1&type=pdf.

Здесь используется расширенная модификация:

Endres, F., Plagemann, C., Stachniss, C. & Burgard, W. (2009). Неконтролируемое обнаружение классов объектов из данных диапазона с использованием скрытого распределения Дирихле. В робототехнике: наука и системы. Сиэтл, США.

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

Тогда вам нужно сопоставить дескрипторы, то есть найти ближайших соседей для каждого из них в их многомерном пространстве. Если маленькое облако вращалось 3 раза, то должно быть 3 хороших ближайших соседа. Однако из-за самопересечений облаков совпадения, вероятно, будут содержать шум. Вам все еще нужно найти ось, которая хорошо подходит для большого количества совпадений (хотя и не всех). Здесь вы можете использовать некоторую надежную подгонку, например RANSAC (вы должны сделать некоторую математику, чтобы определить вероятность положения оси относительно найденных совпадений). Обратите внимание, что он отличается от методов, предложенных другими. Вы должны поместить только одну линию вместо семейства плоскостей, основываясь на дескрипторах, а не на исходных точках (RANSAC, вероятно, не сможет соответствовать плоскости, имеющей 4-5 правильных точек и отклонения в 100 000).

Также обратите внимание:

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

Чтобы вычислить нормали и выполнить поиск, вы можете проверить эту библиотеку: http://graphics.cs.msu.ru/en/science/research/3dpoint/lidark (скоро выйдет крупный выпуск).

2 голосов
/ 17 апреля 2010

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

Очевидно, что это не сработает, если самые крайние точки по оси находятся прямо на оси, однако в общем случае это очень редко.

1 голос
/ 14 апреля 2010

Укажите любую точку и найдите две другие точки, равноудаленные от нее. Это должно занять O (n ^ 2) в худшем случае, но эвристика может значительно уменьшить это. Эти три точки однозначно определяют круг. Если четвертая точка находится на одинаковом расстоянии от первой или третьей точки, это значительно повышает вашу уверенность в круге.

Центр окружности - это точка на оси, а вектор нормали к окружности - это вектор направления оси.

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

Редактировать: Кстати, очевидно, что это недетерминированный, но если ваши точечные данные так же чисты, как вы говорите, и вы используете хорошую эвристику, это должно быть достаточно точно.

0 голосов
/ 21 апреля 2010

Поскольку исходное облако точек невелико, самым простым решением может быть RANSAC:

  1. Выберите три точки наугад
  2. Вычислить ось вращения для этих точек (линия, перпендикулярная окружности и проходящая через центр)
  3. Согласны ли другие пункты?
  4. Если нет, повторять до тех пор, пока не будет найдена правильная ось

Вероятность правильной оценки равна 1 / ((n-1) (n-2)), где n - количество точек в исходном облаке. Поскольку каждый тест может быть выполнен очень быстро, это может быть полезным подходом.

0 голосов
/ 17 апреля 2010

Есть 2 вещи, которые вы должны учитывать:

  1. Угловой промежуток облака точек.
  2. Угол поворота.

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

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

Как упоминалось ранее, RANSAC является наилучшим средством сопоставления с образцом, потому что это занимает меньше времени и дает достойные результаты. Единственная проблема, с которой вы столкнулись - это оценка угла пролета облака мини-точек при инициализации. эту оценку сложно сделать. Поэтому, если у вас достаточно вычислительной мощности / времени, я бы предложил выполнить итерацию с шагом 1 градус. начиная со скромной 5 градусов, скажем, 45 градусов. По мере того как результаты начинают сходиться, повышается угловая точность.

0 голосов
/ 15 апреля 2010

Безумная идея ...

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

Ось вращения будет перпендикулярна этой плоскости, и после ее ориентации определить местоположение оси будет относительно легко.

0 голосов
/ 14 апреля 2010

Взгляните на методы, используемые в стереозрении для вычисления гомографии между двумя изображениями - ваша проблема с наборами облаков точек кажется аналогичной сопоставлению точек на нескольких изображениях одного и того же объекта / сцены. Похоже, вы могли бы применить алгоритм RANSAC для вычисления преобразования между вашими наборами облаков точек.

0 голосов
/ 14 апреля 2010

Некоторые очки:)

  1. Если 1 начальная точка никогда не вращалась, то существует бесконечное количество осей.
  2. Если у нас 1 начальная точка повернута 1 раз, то также имеется бесконечное количество осей.
  3. Если у нас есть 1 начальная точка и мы поворачиваем ее 2 раза, мы можем найти ось, потому что 3 точки однозначно определяют плоскость. Перпендикуляр, к которому через точку, равноудаленную от каждой из 3 точек (1 начальная + 2 повернутых), относится ось.
  4. Обратите внимание, что поворот на 360 не имеет смысла.

  1. Выберите любую точку (P) из облака.
  2. Трассировка точки (L) точки P (поскольку P вращается вокруг некоторой оси, L должна быть окружностью)
  3. Перпендикулярно плоскости окружности (L), проходящей через его центр, является осью вращения облака.

То, что я имею в виду, это то, что ось вращения твердого тела совпадает с осью вращения любой отдельной частицы тела. Нам не нужно заботиться обо всех остальных моментах.

0 голосов
/ 14 апреля 2010

1) Если вы найдете центроид C большего точечного облака, ISTM исходная ось вращения пришлось бы пройти через эту точку.

Неважно: я не видел требования, чтобы повороты не охватывали полный круг. Для вашего примера 20,40,60 центроид не будет находиться на оси вращения.

Может быть, следующая ссылка поможет?

«Реконструкция поверхностей вращения с частичным отбором проб» http://portal.acm.org/citation.cfm?id=980064

...