
Дізнайтесь більше про нові кар'єрні можливості в 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.
Наш підхід полягав у тому, щоб:
- Завантажити зображення з диска і перетворити його у відтінки сірого.
- Трохи розмити зображення.
- Застосувати детектор контурів Canny для виявлення об’єктів на зображенні.
- Закрити будь-які проміжки в контурах.
- Знайти контури об’єктів на зображенні.
- Застосувати контурну апроксимацію, щоб визначити, чи був контур прямокутником і, отже, книгою.
Ви можете скачати вихідний код скрипта і зображення, яке використовується в цій статті.
Переклад статті “A guide to finding books in images using Python and OpenCV”
Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?