Если данные о точном облаке поступают с датчика глубины, то у вас есть относительно плотная выборка ваших стен. Одна вещь, которую я обнаружил, что хорошо работает с датчиками глубины (например, Kinect или DepthSense), является надежной версией процедуры RANSAC, предложенной @MartinBeckett. Вместо того, чтобы выбирать 3 пункта в случайном порядке, выберите одну точку в случайном порядке и получите соседние точки в облаке. Это можно сделать двумя способами:
- Правильный способ: использовать структуру данных запроса ближайшего ближайшего соседа, такую как KD-дерево, чтобы получить все точки на некотором небольшом расстоянии от точки запроса.
- Неаккуратный, но более быстрый способ: используйте район сетки пикселей вашего случайно выбранного пикселя. Это может включать в себя точки, которые далеки от этого в 3D, потому что они находятся на другой плоскости/объекте, но это нормально, поскольку этот пиксель не получит большой поддержки от данных.
Следующий шаг - создать уравнение плоскости из этой группы трехмерных точек. Вы можете использовать PCA в своих трехмерных координатах, чтобы получить два самых значимых собственных вектора, которые определяют плоскую поверхность (последний собственный вектор должен быть нормальным).
Оттуда алгоритм RANSAC выполняется как обычно: проверьте, сколько других точек в данных близко к этой плоскости, и найдите плоскость (ы) с максимальной поддержкой. Мне было лучше найти самую большую опорную плоскость, удалить поддерживающие 3D-точки и снова запустить алгоритм, чтобы найти другие «более мелкие» плоскости. Таким образом, вы сможете получить все стены в своей комнате.
РЕДАКТИРОВАТЬ:
Для пояснения выше: поддержка гипотетической плоскости является множество всех 3D точек, расстояние от этой плоскости не более чем некоторый порог (например, 10 см, должен зависеть от глубины модель измерения погрешности датчика). После каждого запуска алгоритма RANSAC выбрана плоскость с наибольшей поддержкой. Все точки, поддерживающие эту плоскость можно использовать для более точного уравнения плоскости (это является более надежной, чем просто с использованием соседних точек) путем выполнения РСА/линейной регрессии на множестве поддержки.
Для продолжения и поиска других плоскостей, поддержка предыдущей итерации должна быть удалена из набора 3D-точек, так что оставшиеся точки лежат на других плоскостях. Это может повторяться до тех пор, пока имеется достаточное количество точек, и лучшая ошибка при установке плоскости не слишком велика. В вашем случае (ищите уголок) вам нужно как минимум 3 перпендикулярных плоскости. Если вы найдете две плоскости с большой опорой, которые примерно параллельны, то это могут быть пол и какой-то счетчик, или две параллельные стены. Либо в комнате нет видимого угла, либо вам нужно искать перпендикулярную плоскость с меньшей поддержкой.
как густая это ваша точка помутнения? он исходит от датчика глубины? – killogre
@killogre да это –