Я пытаюсь определить углы (координаты x/y) в 2D векторах рассеяния данных.Угловое обнаружение в двумерных векторных данных
Данные получены от лазерного дальномера, и наша текущая платформа использует Matlab (хотя автономные программы/библиотеки являются опцией, но код Nav/Control находится на Matlab, поэтому он должен иметь интерфейс).
Угловое обнаружение является частью алгоритма SLAM, а углы служат ориентирами.
Я также с нетерпением, чтобы достичь чего-то близко к 100Hz с точки зрения скорости, если это возможно (я знаю его Matlab, но мой набор данных довольно мал.)
Образец данных:
[Синий - это сырые данные, красный - это то, что мне нужно обнаружить. (Эта точка зрения фактически сверху вниз.)]
[Actual vector data from above shots]
До сих пор я пытался много различных подходов, некоторые более успешны, чем другие. Я никогда официально не изучал машинное зрение любого вида.
Моим первым подходом был первоклассный строгальный инструмент для мини-квадратов, который разделил бы строки наполовину resurivly, пока они не встретили какое-то значение r^2, а затем попытаются объединить те, у кого похожий наклон/перехваты. Затем он вычислил пересечения этих линий. Это было не очень хорошо, но работало около 70% времени с приличной точностью, хотя у него были некоторые плохие проблемы с отсутствием некоторых функций полностью.
В моем текущем подходе используется функция clusterdata
для сегментации моих данных на основе расстояния махаланобиса, а затем выполняется в основном то же самое (выравнивание/слияние линий наименьших квадратов). Он работает нормально, но я предполагаю, что есть лучшие методы.
[Source Code to Current Method] [cnrs, dat, ~, ~] = CornerDetect(data, 4, 1)
Используя приведенные выше данные, мы создадим местоположения, которые я получаю.
Мне не нужно писать это с нуля, просто казалось, что большинство методов более высокого класса предназначено для 2D-изображений или 3D-облаков точек, а не 2D-данных рассеяния. Я много читал о преобразованиях Hough и всех методах кластеризации данных (k-Means и т. Д.). Я также попробовал несколько консервированных линейных детекторов без особого успеха. Я попытался поиграть с Line Segment Detector, но ему нужно изображение с оттенками серого в качестве входного сигнала, и я решил, что было бы нецелесообразно медленно конвертировать мой вектор в полное 2D-изображение, чтобы передать его во что-то вроде ЛСД.
Любая помощь очень ценится!
Есть ли у вас какие-либо рекомендации или подходы к алгоритму, над которыми я должен смотреть? (Разделение и слияние были не копией учебника, а просто тем, что я написал после того, как разочаровались, прочитав все эти документы, которые дают только плохой psuedocode.) – athypes
Большая часть последних работ была сосредоточена на поверхностях. Старый, но хороший в 2D - это «согласованность кривизны» Андре Лежен. Более поздним из них является пособие Леонтьева: http://www.cs.bgu.ac.il/~icbv061/StudentProjects/ICBV061/ICBV-2006-1-Leonid-Leontiev-Anna-Bakshi/Literature/00735812.pdf –