Пишем скрипт для поиска книг на изображениях с помощью Python и OpenCV
Прочитав эту статью, вы узнаете, как подсчитать количество книг (да и любых других объектов) на изображении с помощью Python и библиотеки OpenCV.
40К открытий40К показов
Из этой статьи вы узнаете, как создать Python-скрипт для подсчёта количества книг на изображении с помощью OpenCV.
Прим. перев. Также советуем обратить внимание на наше руководство по созданию бота для мессенджера на Python и посмотреть видеокурс, в котором рассказывается о написании автопилота для GTA V — там тоже используется OpenCV.
Что мы будем делать?
Взглянем на изображение, на котором будем искать книги:
Мы видим, что на изображении находятся четыре книги, а также отвлекающие вещи, такие как кружка кофе, чашка Starbucks, несколько магнитов и конфета.
Наша цель заключается в том, чтобы найти четыре книги на изображении, при этом не определив никакой другой предмет как книгу.
Какие библиотеки нам понадобятся?
Чтобы написать систему для поиска и обнаружения книг на изображениях, мы будем использовать OpenCV для работы с компьютерным зрением и обработки изображений. Нам также необходимо установить NumPy для корректной работы OpenCV.
Команды для установки:
Поиск книг на изображениях с помощью Python и OpenCV
Прим. перев. Вы можете заметить, что исходный код в нашей статье отличается от кода в оригинале. Автор, вероятно, использовал установку необходимых библиотек через репозитории. Мы предлагаем использовать pip, что гораздо проще. Во избежание появления ошибок рекомендуем использовать версию кода, приведенную в нашей статье.
Откройте свой любимый редактор кода, создайте новый файл с именем find_books.py
и начнем:
Начнем с импорта библиотеки OpenCV. Загрузка изображения с диска обрабатывается функцией cv2.imread
. Здесь мы просто загружаем его с диска, а затем преобразуем цветовую гамму из RGB в оттенки серого.
Мы также немного размываем изображение, чтобы уменьшить высокочастотные шумы и повысить точность нашего приложения. После выполнения кода изображение должно выглядеть так:
Мы загрузили изображение с диска, преобразовали его в оттенки серого и немного размыли.
Теперь давайте определим края (т.е. контуры) объектов на изображении:
Теперь наше изображение выглядит следующим образом:
Мы нашли контуры объектов на изображениях. Однако, как вы видите, некоторые из контуров не закрыты — между контурами существуют промежутки. Чтобы убрать промежутки между белыми пикселями изображения, мы применим операцию «закрытия»:
Теперь пробелы в контурах закрыты:
Следующим шагом является фактическое обнаружение контуров объектов на изображении. Для этого мы будем использовать функцию cv2.findContours
:
Рассмотрим геометрию книги.
Книга представляет собой прямоугольник. У прямоугольника четыре вершины. Поэтому, если мы рассмотрим контур и обнаружим, что он имеет четыре вершины, то мы можем предположить, что это книга, а не другой предмет на изображении.
Чтобы проверить, является ли контур книгой или нет, нам нужно выполнить цикл по каждому контуру:
Для каждого из контуров мы вычисляем периметр, используя cv2.arcLength
, а затем аппроксимируем (сглаживаем) контур, используя cv2.approxPolyDP
.
Причина, по которой мы аппроксимируем контур, заключается в том, что он может не быть идеальным прямоугольником. Из-за зашумления и теней на фото вероятность того, что у книги будет ровно 4 вершины, невелика. Аппроксимируя контур, мы решаем эту проблему.
Наконец, мы проверяем, что у аппроксимируемого контура действительно четыре вершины. Если это так, то мы рисуем контур вокруг книги, а затем увеличиваем счётчик общего количества книг.
Завершим этот пример, показывая полученное изображение и количество найденных книг:
На данном этапе наше изображение будет выглядеть так:
Терминал показывает, что мы успешно нашли четыре книги на изображении, игнорируя другие предметы:
Подведем итоги
В этой статье вы научились находить книги на изображениях, используя простые методы обработки изображений и компьютерного зрения с помощью Python и OpenCV.
Наш подход состоял в том, чтобы:
- Загрузить изображение с диска и преобразовать его в оттенки серого.
- Немного размыть изображение.
- Применить детектор контуров Canny для обнаружения объектов на изображении.
- Закрыть любые промежутки в контурах.
- Найти контуры объектов на изображении.
- Применить контурную аппроксимацию, чтобы определить, был ли контур прямоугольником и, следовательно, книгой.
Вы можете скачать исходный код скрипта и изображение, которое используется в этой статье.
40К открытий40К показов