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

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

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

Подробнее здесь: https://stackoverflow.com/questions/101 ... ecognition