Обнаружение углов в двумерных векторных данных

Я пытаюсь обнаружить углы (координаты 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.

Любая помощь приветствуется!




Ответы (2)


Я бы подошел к этому как к проблеме поиска экстремумов кривизны, которые стабильны в нескольких масштабах, и метод разделения и слияния, который вы пробовали с линиями, намекает на это.

person Francesco Callari    schedule 02.12.2013
comment
Есть ли у вас какие-либо рекомендации по алгоритму или подходы, на которые мне следует обратить внимание? (Разделение и слияние не было копией учебника, а просто тем, что я написал после того, как разочаровался, прочитав все эти технические документы, которые дают только плохой псевдокод.) - person athypes; 03.12.2013
comment
Большая часть недавней работы была сосредоточена на поверхностях. Старый, но хороший метод в 2D — согласованность кривизны Андре Лежена. Более поздним является CSS Леонтьева: 00735812.pdf" rel="nofollow noreferrer">cs.bgu.ac.il/~icbv061/StudentProjects/ICBV061/ - person Francesco Callari; 03.12.2013

Вы можете использовать угловой детектор Харриса для обнаружения углов.

person Bharat    schedule 02.12.2013
comment
Харрис за приведенный выше разрозненный набор данных? Или для обработки всей глубины кадра? Все реализации Харриса, которые я нашел, принимают только полнокадровые изображения в оттенках серого или черно-белые. - person athypes; 02.12.2013
comment
Вы можете масштабировать свои данные (диапазон x и y) в пределах определенного диапазона, чтобы точки стали непрерывными, можно выполнить небольшое расширение, создать изображение (из этих данных) и выполнить Харрис. Харрис также будет работать с бинарными изображениями, он просто вычисляет собственные значения матрицы, которая содержит величины градиента в ортогональных направлениях в пределах окна. В большинстве случаев это можно сделать быстрее с помощью динамического программирования (известного как интегральные изображения), а сложность зависит от диапазона (xmax, ymax) ваших данных. - person Bharat; 02.12.2013
comment
Ерунда, как правильно указывает ОП, его данные не являются изображениями. - person Francesco Callari; 02.12.2013
comment
Если интенсивность отсутствует, это не означает, что ее нельзя представить в виде изображения, данные представляют собой набор точек, и вы можете представить эти точки как 1, а остальные как 0 и создать двоичное изображение. - person Bharat; 02.12.2013
comment
Харрис также даст вам обнаружение углов (немного неточное из-за масштабирования) для линий, а также для волнистых линий, присутствующих на изображении, для этого вам нужно будет выполнить HOG над блоками изображения и посмотреть, присутствуют ли данные только в 2 бинах, размер блока должен быть достаточно большим и зависеть от приложения. vlFeat можно использовать для HOG. код: данные(:, 1) = данные(:, 1) + 1127; данные = данные/4; данные = ceil (данные + 1); изображение = нули (557, 902); для я = 1:620 img (данные (я, 1), данные (я, 2)) = 1; конец imgs = imresize (img, 0,05); C = угол (изображения); им-шоу (изображения); подожди; график (C (:, 1), C (:, 2), 'r *'); - person Bharat; 02.12.2013
comment
Было бы ок, если бы закорючки были обнаружены ориентирами IFF, они последовательно (в пределах разумного) обнаруживаются под разными углами. Лазерный сканер плохо шумит на больших расстояниях, и трудно отличить шум от кривизны объекта на расстоянии более 3 метров. - person athypes; 03.12.2013
comment
Используя ваше предложение, я пришел к [this], что нормально, но все еще сильно страдает от ложных срабатываний. Что такое ХОГ? У меня установлен vl_feat, когда я изначально искал решение. Кажется, что Харриса будет сложно настроить для этого приложения, или я ошибаюсь? Должен ли я рисовать линии между каждым пикселем, чтобы получить более гладкие/лучшие результаты? - person athypes; 03.12.2013
comment
о да, если бы вы могли рисовать линии между пикселями, которые находятся рядом, это должно решить проблему - person Bharat; 03.12.2013