Я пытаюсь подогнать известные четко определенные формы (например, ящики, цилиндры; с настраиваемыми положениями, поворотами и размерами) к набору точек с нормалями, сгенерированными из выборки трехмерной сетки. Мой текущий метод состоит в том, чтобы определить пользовательскую функцию подгонки для каждой фигуры и передать ее сторонней функции оптимизации:
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), для этих точек (с нормалями) мне бы хотелось получить следующий результат:
Обратите внимание, что возвращено несколько фигур, а выбросы игнорируются. В общем случае во входных данных может быть много, одна или ноль фигур. Постобработка может удалить недействительные (например, слишком маленькие) результаты.
Примечание: моя настоящая проблема в 3D. У меня есть сегменты трехмерного сетчатого представления объектов реального мира, что означает, что у меня есть больше информации, чем просто точки / нормали (такие как области лица и связность), которые есть в примере выше.
Дальнейшее чтение:
PS: я не уверен, является ли StackOverflow лучшим сайтом StackExchange для этого вопроса