Очевидная вещь, которую нужно сделать сначала, это отбросить любые ребра, которые не принадлежат прямоугольнику. В лучшем случае все ваши прямоугольники ориентированы в одном направлении с камерой. В этом случае отбросьте любой край, который не является Север-Юг или Восток-Запад. Если все прямоугольники имеют одинаковую ориентацию, а камера - нет, найдите модуль доминирующего направления 90 градусов и отбросьте любые отклоняющиеся края. Худший случай - когда все прямоугольники имеют разную ориентацию. В этом случае вы все еще ожидаете, что направления ребер будут кластеризоваться: для каждого ребра должно быть как минимум одно параллельное и два ортогональных ребра. Откажитесь от любого непревзойденного края. ( Предполагается, что вы найдете ребра длиной более нескольких пикселей; трудно определить угол более коротких ребер. )
После того, как вы удалили паразитные края по направлению, следующий шаг - посмотреть, сможете ли вы их соединить. Вы все еще должны сгруппировать их по углу из предыдущего шага. Теперь предположим, что ребра, которые выровнены, принадлежат одному и тому же прямоугольнику, и замените их одним длинным ребром. Это может вызвать поддельные края между выровненными прямоугольниками. Вероятно, это не главная проблема, но если это так, исправьте ее с шагом проверки в конце.
Вероятно, ваш искатель кромок не будет хорошо работать вблизи углов, потому что реальная кромка там резко меняет направление. Следовательно, вы должны расширить края, которые вы нашли, на несколько пикселей.
Расширенные края теперь будут создавать целую кучу пересечений. Опять же, воспользуйтесь тем, что вы упорядочили свои края по направлению. Просто проверьте на пересечения почти ортогональных ребер. Если вы найдете их, создайте «пересекающийся» объект и свяжите его с двумя ребрами. Это предварительные углы.
Как только вы это сделаете, поищите ребра, которые имеют как минимум 2 пересечения, и посмотрите, сможете ли вы их сопоставить. В зависимости от качества ваших данных, вы можете решить, что нашли прямоугольник, когда у вас есть 3 или 4 угла. Если вы обнаружите слишком много пересечений на одном ребре, возможно, вы соединили ребра двух выровненных прямоугольников. Это может быть особенно сложно, если у вас есть прямоугольники, которые выровнены с обеих сторон:
_ _
|_|_|