2014-12-23 1 views
1

Я хочу реализовать функцию автоматического завершения для приложения-графика. Как только объект свободной руки нарисован, я хочу определить тип объекта (круг/прямоугольник/треугольник) и на основании результата захочет построить соответствующий объект.Обнаружить, если рисование пути - это круг/прямоугольник в xcode

Я немного ознакомился с OpenCV, но тогда мне нужно будет преобразовать чертеж пользователя в изображение в реальном времени. Я записываю количество точек, нанесенных/отслеживаемых касанием, а также генерирует UIBeizerPath соответствующего пути. Как я могу найти тип фигуры?

ответ

0

Необходимо сначала сегментировать точки данных. Google по «сегментации штрихов», чтобы найти похожие статьи. Одним простым и быстрым алгоритмом является вычисление наклона вперед и обратного наклона для каждой точки данных, а затем вычисления угла поворота между прямым наклоном и обратным наклоном. Если угол поворота больше определенного порога угла, вы можете предположить, что ваш путь проходит там резким поворотом. Из числа вычисленных резких выводов вы можете сделать вывод, представляют ли точки треугольник (с двумя резкими поворотами), четырехугольник (с тремя резкими поворотами) или что-то еще. Чтобы сделать вывод, что точки данных представляют собой круг или прямоугольник, вам нужно будет выполнить дополнительные вычисления. Например, если вообще нет резких поворотов, установите круг, соответствующий точкам данных, чтобы увидеть, является ли максимальная ошибка для установленного круга меньше определенного допуска. Чтобы вывести прямоугольник, вам нужно будет поместить прямые линии в каждый сегмент точек данных и проверить, являются ли установленные линии более или менее ортогональными друг другу.

+0

Интересно! Я следил за вашим подходом, но, к сожалению, последовательность точек, которые у меня есть, имеет небольшие смещения (т. Е. Они не находятся в прямой линии), и, следовательно, применение формулы дает мне много острых поворотов. Для треугольника я получил 70 острых поворотов, затем уменьшил размер выборки, но все еще получал около 18 острых поворотов. –

+0

При вычислении наклонов назад/вперед используйте несколько точек до и после текущей точки. Например, при вычислении наклона назад/вперед для точки P (i) используйте точку P (i-m) и P (i + m). Выберите значение m в зависимости от плотности точки. Таким образом, вы должны избегать резких поворотов, вызванных незначительными шумами данных. – fang

+0

Да, после публикации комментария, я решил, что должен уменьшить размер выборки и сделать это. Теперь я, кажется, получаю правильные значения, хотя для треугольника я продолжаю получать 3 оборота вместо 2, а я получаю два хода. Полагаю, что порог угла поворота требует больше работы. –

0

Вы можете выполнить итерацию через UIBezierPath баллов с помощью метода CGPathApply(..). Look here например.

Но вы должны определить тип формы как-то - это математическая задача и подход зависит от ваших входных данных.

+0

Я думаю, что он скрыт где-то в моем вопросе, но у меня уже есть точки для пути. Я рассматриваю математику о том, как определять формы. –

 Смежные вопросы

  • Нет связанных вопросов^_^