Подогнать фигуру к точкам - PullRequest
5 голосов
/ 19 марта 2019

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

fitness = get_fitness(shape_parameters, points)
best_parameters = external.optimise(get_fitness, initial_parameters, points)

(для справки, в настоящее время я использую Python 3 и scipy.optimize.minimize с границами, но язык не имеет значения).

Эта фитнес-функция для прямоугольника будет выглядеть примерно так:

def get_fitness(parameters, points):
    side_fitnesses = []
    for side in [top, right, bottom, left, back, front]:
        dists = get_side_distances(parameters, points, side)
        ndevs = get_side_normal_deviations(parameters, points, side)
        side_fitnesses.append(combine_dists_and_ndevs(dists, ndevs))
    fitnesses = choose_best_side_for_each_point(side_fitnesses)
    return mean(fitnesses)

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

Например (в 2D), для этих точек (с нормалями) мне бы хотелось получить следующий результат:

boxes fitted to points with normals

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

Примечание: моя настоящая проблема в 3D. У меня есть сегменты трехмерного сетчатого представления объектов реального мира, что означает, что у меня есть больше информации, чем просто точки / нормали (такие как области лица и связность), которые есть в примере выше.

Дальнейшее чтение:

PS: я не уверен, является ли StackOverflow лучшим сайтом StackExchange для этого вопроса

1 Ответ

1 голос
/ 21 марта 2019

хорошо, так что вам придется обрабатывать сетки с объемом тогда. Это многое меняет ...

  1. сегментированные объекты

    выделить все грани, заключающие его внутрь ... Так что это похоже на это:

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

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

  2. объект процесса (необязательно)

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

    • треугольник
    • прямоугольник
    • многоугольник
    • диск

    По количеству и типу лиц вы можете обнаружить основные объекты, такие как:

    cone = 1 disc + 1 curved surface with singular edge point parallel to disc center
    box/cube = 6 rectangles/squares
    cylinder = 2 discs + 1 curved surface with center axis going through discs centers
    
  3. вычислить основные геометрические свойства отдельных объектов (необязательно)

    как BBOX или OBB , поверхность, объем, геом. центр, центр масс, ...

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

  4. передать сетку в функцию подбора возможного типа объекта

    на основе маркеров # 2, # 3 у вас есть представление о том, какой объект может быть, какие формы, поэтому просто подтвердите его с помощью функции подгонки ...

    , чтобы упростить этот процесс, вы можете использовать свойства из # 3 , например, см. Аналогично:

    , чтобы вы могли придумать аналогичные методы для базовых 3D фигур ...

...