Сглаживание полигонов по условию - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть многоугольник, заданный последовательностью точек Мне нужно применять следующие правила:

  • углы должны составлять 180,90,45 градуса;
  • если линии параллельны, то расстояние между линиями больше minValue;
  • ориентация многоугольника горизонтальная и вертикальная.

(Если ближе всего к конкретной проблеме, то я нахожу контуры объектов в OpenCV, то их должно быть приятно рисовать)

Мне нужно сделать что-то вроде этого: Example

Ответы [ 2 ]

2 голосов
/ 27 февраля 2015

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

Классическая операция DP требует массиваиз точек, которые образуют ломаную линию и удаляют любые точки, которые не повредят форму за пределами определенного фактора.Этот фактор является единицей измерения, основанной на ваших данных, поэтому в вашем случае он, вероятно, будет в пикселях.Как вы можете себе представить, выбор фактора является наиболее сложной частью использования DP, если только вы не хотите просто удалять точки из многоугольника, которые вы можете легко измерить, не важны.времени, вы хотите удалить точку, которая меньше всего влияет на форму многоугольника.Вы должны быть в состоянии взять типичные рекурсивные примеры DP и заставить его сломаться после первой итерации по точкам, чтобы он удалял одну точку за раз.Затем вы оцените свою форму, чтобы увидеть, соответствует ли она вашим требованиям.Если результат не является идеальным, вы убираете еще одно очко и переоцениваете его до тех пор, пока у вас не останется три очка.Если нет идеального результата, вы можете принять форму с лучшим результатом и, возможно, использовать второй алгоритм, который заставляет его соответствовать требованиям.

http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm

0 голосов
/ 17 февраля 2012

То, что вы спрашиваете, кажется нетривиальным и не очень хорошо определенным. Требуется больше контекста.

Я бы попробовал два подхода:

  • наложите квадратную сетку на многоугольник и оставьте достаточно заполненные квадраты.

  • скелетонизируйте форму (http://en.wikipedia.org/wiki/Topological_skeleton), очистка и разбейте скелет в основном на горизонтальные / вертикальные сегменты; затем замените эти сегменты действительно горизонтальными / вертикальными штрихами.

...