Как я могу обнаружить четырехугольную вывеску по изображению, снятому с помощью мобильного телефона? Как я могу обнаружить формы, такие как прямоугольник? скругленный прямоугольник (закругленные углы вместо углов формы)?
Я использую opencv.wrapper, но я новичок в этом.
Благодарю.
Вот пример: альтернативный текст http://www.freeimagehosting.net/uploads/b03442fd36.png
альтернативный текст http://www.freeimagehosting.net/uploads/e6b36040e8.png
Из-за шума и множества линий я не могу определить, какая граница является вывеской. Иногда я могу найти границу линий после грубого преобразования. Я в ловушке .... в таком сценарии ...
Это 2 сырые фотографии, сделанные с камеры мобильного телефона
альтернативный текст http://www.freeimagehosting.net/uploads/6dbd613edf.jpg альтернативный текст http://www.freeimagehosting.net/uploads/720da20080.jpg
Мне нужен совет, чтобы увидеть, как я могу обработать изображение, чтобы вывесить вывеску?
большое спасибо
Ответы:
Оба ваших изображения содержат много строк, которые не имеют ничего общего со знаком, который вы ищете. И некоторые из этих линий длиннее / имеют более высокую контрастность, чем линии, которые вы на самом деле хотите, поэтому я думаю, что обнаружение краевых линий (например, с помощью грубого преобразования или суммирования контрастов по горизонтали / вертикали) не будет работать.
Но: у знака, который вы ищете, есть другие характеристики, которые должно быть легче обнаружить:
Итак, вы ищете большую соединенную область с низким контрастом. Я взломал алгоритм проверки концепции в Mathematica. (Я не эксперт по OpenCV, но я упомяну соответствующую функцию OpenCV, когда узнаю их.)
Во-первых, я использую фильтры гауссовых производных для определения величины градиента в каждом пикселе. Производный фильтр Гаусса имеет широкую апертуру (в данном случае 11x11 пикселей), поэтому он очень нечувствителен к шуму. Затем я нормализую градиентное изображение до значения = 1, поэтому я могу использовать одинаковые пороговые значения для обоих образцов.
Реализация OpenCV: вы можете использовать
sepFilter2D
для фактической фильтрации, но, очевидно, вам придется самостоятельно вычислять значения ядра фильтра .Результат выглядит так:
На этом изображении фон знака темный, а границы знака яркие. Таким образом, я могу преобразовать изображение в двоичную форму и искать темные компоненты
Реализация OpenCV: пороговое значение должно быть простым, но я думаю, что OpenCV не содержит анализа подключенных компонентов - вы можете использовать для этого заливку или cvBlobsLib .
Теперь просто найдите самый большой шарик рядом с центром изображения и найдите выпуклый корпус (я просто использовал самый большой шарик, который не связан с фоном, но этого может быть недостаточно для каждого изображения).
Результаты:
источник
Другой подход, который вы можете использовать, который является более устойчивым к шумам в этой ситуации, заключается в создании кривой среднего уровня серого изображения по оси x и вдоль оси y. То есть вычислите средний уровень серого для каждой строки / столбца на изображении.
Если, например, вывеска (или ее границы) светлее, чем ее окружение (что имеет место для всех примеров, показанных в вопросе), у вас будет два пика на кривой оси X (для левой и правой сторон и границ ) и два пика в вашей кривой оси Y (для верхней и нижней границ). Используя метод обнаружения границ для одномерного сигнала (возможно, фильтра верхних частот), вы можете определить координаты углов вывески.
Я видел, как этот подход используется для обнаружения номерных знаков, а также для распознавания лиц (нос, как правило, является более яркой частью лица, поэтому он генерирует пик на кривых оси X и оси Y).
источник
Это может быть немного перевернутой идеей, но, возможно, стоит попробовать. Вместо того, чтобы пытаться обнаружить прямоугольник и думать о тексте как о шуме , возможно, вы можете рассматривать текст как информацию и использовать его для более простого обнаружения прямоугольника.
Вот схема идеи:
Объяснения и преимущества:
источник