У меня есть точки в 3D, которые составляют 2 или 3 стороны прямоугольника. Как я могу рассчитать координаты углов куба? Является ли это возможным?
Обновлено: https://github.com/CPIGroup/3d-Camera-scanDimensions
Это всего лишь идея, а не проверенный метод.
Сначала найдите самолеты. Случайно выберите 3 точки, найдите плоскость, которая проходит через них, нормализуйте 4 параметра. Повторите 1000 или около того раз. Вы получите 1000 4-х чисел. Используйте один из кластерный анализ методы, чтобы найти 2 или 3 группы из 4 кортежей, которые очень близко друг к другу. Средняя каждая из групп. Это будут, примерно, плоскости боковых сторон вашей коробки.
Теперь сделайте их более точными. Для каждой плоскости найдите все точки, которые находятся близко к ней, но не близко к другим плоскостям (для некоторого значения «близко», возможно, также можно найти, используя метод кластеризации). Для каждой такой группы точек найдите плоскость наилучшего соответствия, используя наименьших квадратов.
Если у вас есть три плана, отлично; пересекайте их, и у вас есть вершина и три ребра. Для двух самолетов у вас есть только один край. В любом случае, теперь вы можете попытаться найти другие края. Для простоты рассмотрим плоскость XY, а известное ребро — ось X. Теперь вам нужно найти крайнюю левую (самую правую) вертикальную линию, чтобы большинство точек находились слева (или справа) от нее. Спроецируйте все точки на ось X. Теперь у вас есть одномерный случай вашей исходной задачи: на некотором интервале много случайных точек, найдите интервал. Используйте метод кластеризации снова.
Я не очень опытный с этим, но, возможно, вы могли бы использовать RANSAC?
Кажется, на обнаружение самолета из облаков точек с помощью RANSAC
Также вы можете захотеть взглянуть на библиотеку Point Clouds Library (PCL). Это довольно впечатляющий проект с множеством полезных функций, включая плоская сегментация
Как только плоскости обнаружены, нужно найти края / углы, что должно быть намного проще.