Ми почали з вивчення основ OpenCV, а потім виконали декілька основних процесів обробки зображень та маніпуляцій із ними, а потім - сегментації зображень та багатьох інших операцій з використанням мови OpenCV та python. Тут, у цьому розділі, ми виконаємо кілька простих методів виявлення об’єктів із використанням відповідності шаблонів. Ми знайдемо предмет на зображенні, а потім опишемо його особливості. Особливості - це загальні атрибути зображення, такі як кути, краї тощо. Ми також розглянемо деякі загальні та популярні алгоритми виявлення об’єктів, такі як SIFT, SURF, FAST, BREIF & ORB.
Як було сказано в попередніх навчальних посібниках, OpenCV - це бібліотека з відкритим кодом, що має інтерфейси C ++, Python та Java та підтримує Windows, Linux, Mac OS, iOS та Android. Тож його можна легко встановити в Raspberry Pi за допомогою середовища Python та Linux. А Raspberry Pi з OpenCV та підключеною камерою можна використовувати для створення багатьох програм обробки зображень у режимі реального часу, таких як виявлення обличчя, блокування обличчя, відстеження об’єктів, виявлення номерного знака автомобіля, система домашньої безпеки тощо.
Виявлення та розпізнавання об'єктів є найважливішим варіантом використання комп'ютерного зору, вони використовуються для здійснення таких потужних речей, як
- Позначення сцен
- Навігація роботів
- Самохідні машини
- Розпізнавання тіла (Microsoft Kinect)
- Виявлення захворювань та раку
- Розпізнавання обличчя
- Розпізнавання почерку
- Ідентифікація об’єктів на супутникових знімках
Розпізнавання об’єктів проти розпізнавання
Розпізнавання об’єктів - це другий рівень виявлення об’єктів, при якому комп’ютер може розпізнати об’єкт із кількох об’єктів на зображенні і, можливо, ідентифікувати його.
Тепер ми виконаємо деякі функції обробки зображень, щоб знайти об’єкт із зображення.
Пошук об’єкта із зображення
Тут ми будемо використовувати відповідність шаблону для пошуку символу / об'єкта в зображенні, використовуйте функцію cv2.matchTemplate () OpenCV для пошуку цього об'єкта
імпорт cv2 імпорт numpy як np
Завантажте вхідне зображення та перетворіть його у сірий
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('people', image) cv2.waitKey (0) grey = cv2.cvtColor (image, cv2.COLOR_BGR2GREY)
Завантажте зображення шаблону
template = cv2.imread ('waldo.jpg', 0) # результат збігу шаблону об'єкта над результатом зображення = cv2.matchTemplate (сірий, шаблон, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (результат)
Створіть обмежувальну рамку
top_left = max_loc # збільшення розміру обмежувального прямокутника на 50 пікселів bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (image, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('об'єкт знайдений', зображення) cv2.waitKey (0) cv2.destroyAllWindows ()
У cv2.matchTemplate (сірий, шаблон, cv2.TM_CCOEFF) введіть зображення масштабу сірого, щоб знайти об’єкт і шаблон. Потім застосуйте метод відповідності шаблону для пошуку об’єктів із зображення, тут використовується cv2.TM_CCOEFF .
Вся функція повертає масив, який вводиться в результат, який є результатом процедури зіставлення шаблону.
А потім ми використовуємо cv2.minMaxLoc (результат) , який дає координати або обмежувальне поле, де об’єкт був знайдений на зображенні, і коли ми отримуємо ці координати, малюємо прямокутник над ним і розтягуємо невеликі розміри вікна, щоб об'єкт може легко поміститися всередині прямокутника.
Існує безліч методів для зіставлення шаблонів, і в цьому випадку ми використовуємо cv2.TM_CCOEFF, що означає коефіцієнт кореляції.
Тут ключовими точками є координати (X, Y), витягнуті за допомогою детектора просіювання та намальовані над зображенням за допомогою функції ключової точки малювання cv2.
СЕРФ
import cv2 import numpy as np image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GREY)
Створіть об'єкт SURF Feature Detector, тут ми встановили поріг гесса на 500
surf = cv2.xfeatures2d.SURF_create (500) ключові точки, дескриптори = surf.detectAndCompute (сірий, немає) print ("Кількість виявлених точок:", len (ключові точки))
Намалюйте багаті ключові точки на вхідному зображенні
image = cv2.drawKeypoints (зображення, ключові точки, немає, прапори = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Метод функції - SURF', зображення) cv2.waitKey () cv2.destroyAllWindows ()
Вихід консолі:
ШВИДКО
import cv2 import numpy as np image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GREY)
Створіть об'єкт FAST Detector
fast = cv2.FastFeatureDetector_create () # Отримати ключові точки, за замовчуванням пригнічення не максимальне значення Увімкнено # для вимкнення встановити fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (сірий, Немає) print ("Кількість ключових точок Виявлено: ", len (ключові точки))
Намалюйте багаті ключові точки на вхідному зображенні
image = cv2.drawKeypoints (зображення, ключові точки, немає, прапори = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Метод функції - ШВИДКО', зображення) cv2.waitKey () cv2.destroyAllWindows ()
Вихід консолі:
КОРОТКИЙ
import cv2 import numpy as np image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GREY)
Створіть об'єкт FAST-детектора
короткий = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Створіть КОРОТКИЙ об'єкт-екстрактор
#brief = cv2.DescriptorExtractor_create ("КОРОТКО") # Визначити ключові точки keypoints = fast.detect (сірий, немає)
Отримати дескриптори та нові кінцеві ключові точки за допомогою КОРОТКОЇ інформації
keypoints, descriptors = short.compute (сірий, ключові точки) print ("Кількість виявлених точок:", len (ключові точки))
Намалюйте багаті ключові точки на вхідному зображенні
image = cv2.drawKeypoints (зображення, ключові точки, немає, прапори = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Метод функції - КОРОТКИЙ, зображення) cv2.waitKey () cv2.destroyAllWindows ()
Вихід консолі:
ORB
import cv2 import numpy as np image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GREY)
Створивши об'єкт ORB, ми можемо вказати кількість ключових точок, які ми бажаємо
orb = cv2.ORB_create () # Визначити ключові точки keypoints = orb.detect (сірий, немає)
Отримати дескриптори
keypoints, descriptors = orb.compute (сірий, ключові точки) print ("Кількість виявлених точок:", len (ключові точки))
Намалюйте багаті ключові точки на вхідному зображенні
image = cv2.drawKeypoints (зображення, ключові точки, немає, прапори = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Метод функції - ORB', зображення) cv2.waitKey () cv2.destroyAllWindows ()
Вихід консолі:
Ми можемо вказати кількість ключових точок, що має максимальне обмеження 5000, однак значення за замовчуванням становить 500, тобто ORB автоматично визначає найкращі 500 ключових точок, якщо не вказано для будь-якого значення ключових точок.
Отже, таким чином відбувається виявлення об’єктів у OpenCV, ті самі програми також можна запускати у встановленому OpenCV Raspberry Pi і можна використовувати як портативний пристрій, такий як смартфони, що мають Google Lens.
Ця стаття посилається на Master Computer Vision ™ OpenCV4 на Python з курсом глибокого навчання на Udemy, створений Раджеєвим Ратаном. Підпишіться, щоб дізнатись більше про Computer Vision та Python.