Обработка изображений: улучшение алгоритма распознавания банки Coca-ColaC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Обработка изображений: улучшение алгоритма распознавания банки Coca-Cola

Сообщение Anonymous »

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

Изображение


Некоторые ограничения проекта:
  • Фон ​​может быть очень шумным.
  • can может иметь любой масштаб или поворот или даже ориентацию (в разумных пределах).
  • Изображение может иметь некоторую степень размытости (контуры могут быть не совсем прямыми).
  • На изображении могут быть бутылки Coca-Cola, и алгоритм должен обнаруживать только банку!
  • Яркость изображения может сильно различаться (поэтому вы не можете слишком сильно полагаться на определение цвета).
  • can может быть частично скрыт по бокам или в середине и, возможно, частично скрыто за бутылкой.
  • На изображении вообще не могло быть can, и в этом случае нужно было ничего не найти и написать сообщение Итак.
Таким образом, вы можете столкнуться с такими сложными вещами (что в данном случае привело к полному сбою моего алгоритма):

Изображение


Некоторое время назад я работал над этим проектом, получил от него массу удовольствия и получил достойную реализацию. Вот некоторые подробности моей реализации:

Язык: выполнено на C++ с использованием библиотеки OpenCV.

Предварительная обработка. Для предварительной обработки изображения, то есть преобразования изображения в более необработанную форму для передачи алгоритму, я использовал 2 метода:
  • Изменение цветовой области с RGB на HSV и фильтрация на основе «красного» оттенка, насыщенность выше определенного порога, чтобы избежать оранжевых цветов, и фильтрация низкого значения, чтобы избежать темноты тона. Конечным результатом было двоичное черно-белое изображение, где все белые пиксели представляли собой пиксели, соответствующие этому порогу. Очевидно, что в изображении по-прежнему много мусора, но это уменьшает количество измерений, с которыми вам приходится работать.
    Изображение
  • Фильтрация шума с использованием медианной фильтрации (взятие медианного значения пикселя всех соседей и замена пикселя этим значением) для уменьшения шума.
  • Использование фильтра Canny Edge Detection Filter для получения контуров всех элементов после двух предшествующих шагов.
    Изображение
Алгоритм: Сам алгоритм, который я выбрал для этой задачи, был взят из этой замечательной книги о функциях. извлечение и называется обобщенным преобразованием Хафа (сильно отличается от обычного преобразования Хафа). По сути, там говорится о нескольких вещах:
  • Вы можете описать объект в пространстве, не зная его аналитического уравнения (как в данном случае).< /li>
    Он устойчив к деформациям изображения, таким как масштабирование и поворот, поскольку он проверяет ваше изображение на предмет каждой комбинации коэффициента масштабирования и коэффициента поворота.
  • Он использует базовую модель (шаблон), которую алгоритм «обучит».
  • Каждый пиксель, оставшийся в контурном изображении, будет голосовать за другой пиксель, который предположительно будет центром (с точки зрения гравитация) вашего объекта на основе того, что он узнал из модели.
В конце концов вы получите тепловую карту голоса, например здесь все пиксели контура банки будут голосовать за ее гравитационный центр, поэтому у вас будет много голосов в одном пикселе, соответствующем центру, и вы увидите пик на тепловой карте как ниже:

Изображение


Как только вы это сделаете, простая эвристика на основе пороговых значений может дать вам местоположение центрального пикселя, из которого вы можете получить масштаб и поворот, а затем построить вокруг него маленький прямоугольник (окончательный масштаб и коэффициент вращения, очевидно, будет относиться к исходному шаблону). По крайней мере теоретически...

Результаты: Хотя этот подход работал в основных случаях, в некоторых областях его явно не хватало:
  • Это очень медленно! Я недостаточно подчеркиваю это. На обработку 30 тестовых изображений понадобился почти целый день, очевидно потому, что у меня был очень высокий коэффициент масштабирования для вращения и перемещения, так как некоторые банки были очень маленькими.
  • Это было вполне терялись, когда на изображении были бутылки, и по какой-то причине почти всегда находили бутылку вместо банки (возможно, потому, что бутылки были больше, следовательно, имели больше пикселей, а значит, больше голосов)
  • Нечеткие изображения тоже были бесполезны, поскольку голоса попадали в пиксели в случайных местах вокруг центра, что заканчивалось очень зашумленной тепловой картой.
  • Инвариантность в перемещении и вращении была достигнута, но не в ориентации, то есть банка, которая не была направлена ​​прямо в объектив камеры, не была распознана.
Можете ли вы помочь мне улучшить мои навыки? конкретный алгоритм, использующий исключительно функции OpenCV, для решения четырех конкретных упомянутых проблем?

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

Подробнее здесь: https://stackoverflow.com/questions/101 ... ecognition
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обработка изображений: улучшение алгоритма распознавания банки Coca-Cola
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Стратегии для добавления банки в обстановку класса банки Springboot после
    Anonymous » » в форуме JAVA
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Последняя версия cola.js и d3
    Anonymous » » в форуме Javascript
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Предварительная обработка изображений для оптического распознавания символов (pytesseract)
    Anonymous » » в форуме Python
    0 Ответы
    119 Просмотры
    Последнее сообщение Anonymous
  • Предварительная обработка изображений в Python для оптического распознавания символов
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»