Пишемо скрипт для пошуку книг на зображеннях за допомогою Python і OpenCV


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Із цієї статті Ви дізнаєтесь, як створити Python-скрипт для підрахунку кількості книг на зображенні за допомогою OpenCV.

Прим. перекл. Також радимо звернути увагу на наше керівництво по створенню бота для месенджера на Python і подивитися відеокурс, у якому розповідається про написання автопілота для GTA V – там також використовується OpenCV.

Що ми робитимемо?

Подивіться на зображення, на якому шукатимемо книги:

На зображенні знаходяться чотири книги, а також відволікаючі речі, такі як стаканчик кави, чашка Starbucks, декілька магнітів і цукерка.

Наша мета полягає в тому, щоб знайти чотири книги на зображенні, при цьому не визначивши жодного іншого предмета як книги.

Які бібліотеки нам знадобляться?

Щоб написати систему для пошуку і виявлення книг на зображеннях, ми використовуватимемо OpenCV для роботи з комп’ютерним зором і обробки зображень. Нам також необхідно встановити NumPy для коректної роботи OpenCV. Переконайтеся, що у Вас встановлені ці бібліотеки!

Пошук книг на зображеннях за допомогою Python і OpenCV

Прим. перекл. Ви можете помітити, що вихідний код в нашій статті відрізняється від коду в оригіналі. Автор, ймовірно, використав установку необхідних бібліотек через репозиторії. Ми пропонуємо використати pip, що набагато простіше. Щоб уникнути появи помилок рекомендуємо використати версію коду, наведену в нашій статті.

Відкрийте свій улюблений редактор коду, створіть новий файл з ім’ям find_books.py і почнемо:

# -* - coding: utf - 8 -* -# імпортуйте необхідні пакетыimport numpy as npimport cv2# завантажите зображення, зміните колір на відтінки сірого і зменшите резкостьimage = cv2.imread ("example.jpg") gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur (gray, (3, 3), 0)
cv2.imwrite ("gray.jpg", gray)

Розпочнемо з імпорту бібліотеки OpenCV. Завантаження зображення з диска обробляється функцією cv2.imread. Тут ми просто завантажуємо його з диска, а потім перетворимо колірну гаму з RGB у відтінки сірого.

Ми також трохи розмиваємо зображення, щоб зменшити високочастотні шуми і підвищити точність нашого додатка. Після виконання коду зображення повинне виглядати так:

Ми завантажили зображення з диска, перетворили його у відтінки сірого і трохи розмили.

Тепер давайте визначимо краї (тобто контури) об’єктів на зображенні:

# розпізнавання контуровedged = cv2.Canny (gray, 10, 250) cv2.imwrite ("edged.jpg", edged)

Тепер наше зображення виглядає таким чином:

Ми знайшли контури об’єктів на зображеннях. Проте, як Ви бачите, деякі з контурів не закриті – між контурами є проміжки. Щоб усунути проміжки між білими пікселями зображення, ми застосуємо операцію “закриття”:

# створіть і застосуйте закрытиеkernel = cv2.getStructuringElement (cv2.MORPH_RECT (7, 7)) closed = cv2.morphologyEx (edged, cv2.MORPH_CLOSE, kernel) cv2.imwrite ("closed.jpg", closed)

Тепер пропуски в контурах закриті:

Наступним кроком є фактичне виявлення контурів об’єктів на зображенні. Для цього ми використовуватимемо функцію cv2.findContours:

# знайдіть контури в зображенні і підрахуйте кількість книгcnts = cv2.findContours (closed.copy (), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]total = 0

Розглянемо геометрію книги.

Книга є прямокутником. У прямокутника чотири вершини. Тому, якщо ми розглянемо контур і виявимо, що він має чотири вершини, то ми можемо припустити, що це книга, а не інший предмет на зображенні.

Щоб перевірити, чи є контур книгою або ні, нам треба виконати цикл за кожним контуром:

# цикл по контурамfor c in cnts: # апроксимуємо (згладжуємо) контур
peri = cv2.arcLength (c, True) approx = cv2.approxPolyDP (c, 0.02 * peri, True)  # якщо у контура 4 вершини, припускаємо, що це книга if len (approx)  == 4: cv2.drawContours (image, [approx], - 1, (0, 255, 0), 4) total += 1

Для кожного з контурів ми обчислюємо периметр, використовуючи cv2.arcLength, а потім апроксимуємо (згладжуємо) контур, використовуючи cv2.approxPolyDP.

Причина, через яку ми апроксимуємо контур, полягає в тому, що він може не бути ідеальним прямокутником. Унаслідок зашумления і тіней на фото вірогідність того, що у книги буде рівно 4 вершини, невелика. Апроксимуючи контур, ми розв’язуємо цю проблему.

Нарешті, ми перевіряємо, що в апроксимованого контура, дійсно чотири вершини. Якщо це так, то ми малюємо контур навколо книги, а потім збільшуємо лічильник загальної кількості книг.

Завершимо цей приклад, показуючи отримане зображення і кількість знайдених книг:

# показуємо результуюче изображениеprint ("Я знайшов {0} книг на цій картинці".format (total) cv2.imwrite ("output.jpg", image))

На цьому етапі наше зображення виглядатиме так:

Термінал показує, що ми успішно знайшли чотири книги на зображенні, ігноруючи інші предмети:

Підсумуємо викладене

У цій статті Ви навчилися знаходити книги на зображеннях, використовуючи прості методи обробки зображень і комп’ютерного зору за допомогою Python і OpenCV.

Наш підхід полягав у тому, щоб:

  1. Завантажити зображення з диска і перетворити його у відтінки сірого.
  2. Трохи розмити зображення.
  3. Застосувати детектор контурів Canny для виявлення об’єктів на зображенні.
  4. Закрити будь-які проміжки в контурах.
  5. Знайти контури об’єктів на зображенні.
  6. Застосувати контурну апроксимацію, щоб визначити, чи був контур прямокутником і, отже, книгою.

Ви можете скачати вихідний код скрипта і зображення, яке використовується в цій статті.

Переклад статті “A guide to finding books in images using Python and OpenCV”

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *