This application counts objects in a photo using OpenCV (opensource Computer Vision library for Python)
Пояснительная записка к проекту Computer Vision Object Detection.
Была поставлена задача написания программы, которая с помощью камеры смогла бы подсчитывать количество объектов - деталей, заготовок, собранных изделий и т.д. Для этого было решено применить подход контурного анализа объекта с помощью математических алгоритмов. Все использованные математические алгоритмы поставляются вместе с библиотекой для python – opencv-contrib.
В проекте я использовал:
- алгоритм Гауссового размытия для того, чтобы повысить качество распознавания границ: для того чтобы убрать шумы на фотографии, поэтому, так же, этот алгоритм иногда называют фильтр Гаусса. Основан на функции Гаусса плотности нормального распределения,
- алгоритм Canny непосредственно для распознавания границ объектов: алгоритм состоит из нескольких этапов:
- сглаживание,
- поиск градиентов,
- подавление не-максимумов,
- двойная пороговая фильтрация,
- трассировка области неоднозначности.
Перед применением детектора Canny, преобразуем изображение в оттенки серого. Пикселями границы объявляются те, в которых достигается локальный максимум градиента в направлении вектора градиента), но после этого алгоритма, получаются лишь границы, а не контуры, потому что они не замкнуты (не закрыты).
Алгоритм морфологического закрытия границ нужен для того, чтобы получить закрытые контуры из границ, полученных на этапе применения алгоритма Canny. Комбинация базовых операций математической морфологии: замыкание, эрозия, наращивание, производит закрытие пробелов между границами с помощью данных базовых графических примитивов. Тем самым мы получили контуры изображения.
Если объекты плотно прижаты друг к другу, то алгоритм посчитает их за один, следовательно, они будут выделены одним контуром, то есть анализ количества объектов на основе анализа количества внешних контуров не имеет смысла из-за того, что в реальном мире, зачастую, объекты и будут прижаты друг к другу. Поэтому было принято решение проводить анализ на основе площадей.
Контур – замкнутая фигура, поэтому мы можем посчитать ее площадь, как и площадь одного объекта (сфотографировав его одного на таком же расстоянии от объектива камеры, на котором собираемся подсчитывать их количество). Затем площадь контура делим на площадь объекта и получаем их количество в кадре.
Теперь объекты могут прилегать вплотную друг к другу, но не должно быть перекрытий, иначе площадь контура будет меньше, чем площадь их площадь в отдельности, и, следовательно, появится погрешность и, потенциально, неточность в подсчете. Так же, изменять положение камеры во время работы программы нельзя, так как подсчет площади зависит от расстояния до объекта, следовательно, при перемещении камеры, нужно будет заново запускать программу для одной детали с целью подсчета ее площади.