Я пытаюсь обнаружить углы (координаты x/y) в двумерных векторах рассеяния данных.
Данные взяты с лазерного дальномера, и наша текущая платформа использует Matlab (хотя автономные программы/библиотеки являются опцией, но код Nav/Control находится в Matlab, поэтому он должен иметь интерфейс).
Обнаружение углов является частью алгоритма SLAM, и углы будут служить ориентирами.
Я также стремлюсь достичь чего-то близкого к 100 Гц с точки зрения скорости, если это возможно (я знаю его Matlab, но мой набор данных довольно мал).
Образец данных:
[Синий — необработанные данные, красный — то, что мне нужно обнаружить. (Этот вид фактически сверху вниз.)]
[Фактические векторные данные из снимков выше]
До сих пор я пробовал много разных подходов, некоторые из них были более успешными, чем другие. Я никогда официально не изучал машинное зрение.
Моим первым подходом был самодельный сборщик линий методом наименьших квадратов, который разделял линии пополам повторно, пока они не встречали какое-то значение r ^ 2, а затем пытался объединить линии с одинаковым наклоном / пересечениями. Затем он будет вычислять пересечения этих линий. Это было не очень хорошо, но работало примерно в 70% случаев с приличной точностью, хотя у него были некоторые проблемы с полным отсутствием определенных функций.
Мой текущий подход использует функцию clusterdata
для сегментации моих данных на основе расстояния Махаланобиса, а затем делает в основном то же самое (подгонка/слияние линий наименьших квадратов). Это работает нормально, но я предполагаю, что есть лучшие методы.
[Исходный код для текущего метода] [cnrs, dat, ~, ~] = CornerDetect(data, 4, 1)
использование приведенных выше данных позволит получить местоположения, которые я получаю.
Мне не нужно писать это с нуля, просто мне показалось, что большинство методов более высокого класса предназначены для 2D-изображений или 3D-облаков точек, а не для 2D-разброса данных. Я много читал о преобразованиях Хафа и всевозможных методах кластеризации данных (k-Means и т. д.). Я также попробовал несколько стандартных линейных детекторов, но без особого успеха. Я попытался поиграть с детектором сегментов линии, но ему нужны оттенки серого. изображение в качестве входных данных, и я подумал, что было бы слишком медленно преобразовывать мой вектор в полное 2D-изображение, чтобы передать его во что-то вроде LSD.
Любая помощь приветствуется!