opencv: использование контуров и преобразование Хафа при обнаружении прямоугольника

Я пытаюсь обнаружить белые прямоугольники на изображении в градациях серого, используя разные подходы: обнаружение контуров и преобразование Хафа. К сожалению, есть некоторые ограничения изображения, которое я обрабатываю, т.е.

  1. На изображении много функций, и прямоугольник — не единственные
  2. Прямоугольник может быть объединен с другими объектами (например, один из краев прямоугольника может перекрываться длинной прямой линией)
  3. Прямоугольник может содержать некоторые другие элементы (например, букву, цифры или логотип внутри прямоугольника)
  4. Некоторые элементы выглядят как прямоугольник (например, символ «D» выглядит как прямоугольник с маленькой дугой в верхнем правом и нижнем правом углу; другой пример — трапецоид вместо параллелограмма)
  5. Прямоугольник можно поворачивать от 0 до 15 градусов по часовой стрелке и против часовой стрелки
  6. Возможно, что линии разбиты на несколько строк в разных условиях освещения (например, 1 пиксельный промежуток), поэтому минимальная длина линии для фильтрации линий должна быть небольшой (например, в преобразовании Хафа)
  7. Когда минимальная длина строки установлена ​​на маленькое значение, чаще встречаются повторяющиеся линии для одной и той же линии в разных ориентациях (то есть необходимо объединить несколько линий)

Для подхода контуров контуры некоторых изображений нарушены. Кроме того, изображение может содержать такие элементы, как прямоугольник (например, символ «D»). Я не уверен, что это хороший подход.

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

Преобразование Хафа против обнаружения контуров для распознавания прямоугольников с перспективной проекцией

Любые предложения приветствуются!

РЕДАКТИРОВАТЬ: Добавить несколько фотографий

Персонаж D

Персонаж D

Прямоугольный край слит с длинной прямой

Прямоугольник с логотипом и края слиты с длинной прямой линией

введите описание изображения здесь

Трапеция (с тенью наверху, образующая трапецию внизу)

5

Решение

Я хотел бы предложить вам попробовать двоичный порог (адаптивное или иное) на каждом изображении, это даст четкие линии для определения контура. Вы также можете разъедать / расширяются изображения для удаления шума (например, тонкие линии на вашем втором изображении)

Затем используйте обнаружение контуров и подсчитайте контуры, найдя самый большой объект на изображении с четырех сторон (это, вероятно, будет ваш объект).

Сделайте копию изображения, прежде чем использовать двоичный файл / эрозию, чтобы после того, как у вас появилась область интереса от обнаружения контура, вы можете обрезать копию изображения в этой области.

Извините, ссылки на примеры написаны на python, но я уверен, что как только вы поймете идею, перенести ее на C ++ будет легко.

Надеюсь это поможет.

РЕДАКТИРОВАТЬ

Просто попробовал описанный выше метод сам, установив порог каждого изображения, обнаружение контуров, а затем нарисовав ограничивающий прямоугольник вокруг наибольшего набора контуров.

Ниже смотрите результаты:

введите описание изображения здесь

Ограничительная рамка вокруг наибольшего набора контуров

введите описание изображения здесь

То же самое, нарисовано поверх оригинальных изображений

введите описание изображения здесь

1

Другие решения


По вопросам рекламы [email protected]