Започнахме с изучаването на основите на OpenCV и след това направихме някои основни обработки на изображения и манипулации върху изображения, последвани от сегментиране на изображения и много други операции, използвайки OpenCV и езика python. Тук, в този раздел, ще изпълним някои прости техники за откриване на обекти, използвайки съвпадение на шаблони. Ще намерим обект в изображение и след това ще опишем неговите характеристики. Характеристиките са често срещаните атрибути на изображението като ъгли, ръбове и т.н. Ще разгледаме и някои често срещани и популярни алгоритми за откриване на обекти като SIFT, SURF, FAST, BREIF & ORB.
Както беше казано в предишните уроци, OpenCV е библиотека с отворен код Commuter Vision, която има интерфейси C ++, Python и Java и поддържа Windows, Linux, Mac OS, iOS и Android. Така че може лесно да се инсталира в Raspberry Pi с Python и Linux среда. А Raspberry Pi с OpenCV и свързана камера може да се използва за създаване на много приложения за обработка на изображения в реално време, като разпознаване на лица, заключване на лица, проследяване на обекти, откриване на регистрационния номер на автомобила, система за домашна сигурност и т.н.
Откриването и разпознаването на обекти са най-важният случай за използване на компютърно зрение, те се използват за извършване на мощни неща като
- Етикетиране на сцени
- Навигация на роботи
- Самоуправляващи се коли
- Разпознаване на тялото (Microsoft Kinect)
- Откриване на заболявания и рак
- Разпознаване на лицето
- Разпознаване на почерк
- Идентифициране на обекти в сателитни изображения
Разпознаване на обекти срещу разпознаване
Разпознаването на обекти е второто ниво на откриване на обект, при което компютърът е в състояние да разпознае обект от множество обекти в изображение и може да бъде в състояние да го идентифицира.
Сега ще изпълним някои функции за обработка на изображения, за да намерим обект от изображение.
Намиране на обект от изображение
Тук ще използваме съвпадение на шаблони за намиране на характер / обект в изображение, използвайте функцията cv2.matchTemplate () на OpenCV за намиране на този обект
import cv2 import numpy като np
Заредете входното изображение и го преобразувайте в сиво
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('хора', изображение) cv2.waitKey (0) сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Заредете изображението на шаблона
template = cv2.imread ('waldo.jpg', 0) #result of template match of object over a image result = 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 ('object found', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
В cv2.matchTemplate (сиво, шаблон, cv2.TM_CCOEFF) въведете изображението в сиво, за да намерите обекта и шаблона. След това приложете метода за съвпадение на шаблона за намиране на обектите от изображението, тук се използва cv2.TM_CCOEFF .
Цялата функция връща масив, който се въвежда в резултат, който е резултат от процедурата за съвпадение на шаблона.
И тогава използваме cv2.minMaxLoc (резултат) , който дава координатите или ограничителното поле, където обектът е намерен в изображение, и когато получим тези координати, нарисувайте правоъгълник върху него и разтегнете малки размери на полето, така че обект може лесно да се побере в правоъгълника.
Съществуват разнообразни методи за извършване на съвпадение на шаблони и в този случай използваме cv2.TM_CCOEFF, което означава коефициент на корелация.
Тук ключовите точки са (X, Y) координати, извлечени с помощта на детектор за пресяване и изчертани върху изображението с помощта на функцията cv2 draw keypoint.
СЪРФ
импортиране на cv2 импортиране на numpy като np image = cv2.imread ('paris.jpg') сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Създайте обект SURF Feature Detector, тук задаваме hessian праг на 500
surf = cv2.xfeatures2d.SURF_create (500) ключови точки, дескриптори = surf.detectAndCompute (сиво, няма) print ("Брой открити ключови точки:", len (ключови точки))
Начертайте богати ключови точки на входното изображение
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Метод на функцията - SURF', изображение) cv2.waitKey () cv2.destroyAllWindows ()
Конзолен изход:
БЪРЗ
импортиране на cv2 импортиране на numpy като np image = cv2.imread ('paris.jpg') сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Създайте обект FAST Detector
fast = cv2.FastFeatureDetector_create () # Получаване на ключови точки, по подразбиране потискането на max не е Включено #, за да изключите set fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (сиво, Няма) print ("Брой ключови точки Открито: ", len (ключови точки))
Начертайте богати ключови точки върху входното изображение
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - FAST', image) cv2.waitKey () cv2.destroyAllWindows ()
Конзолен изход:
КРАТКО
импортиране на cv2 импортиране на numpy като np image = cv2.imread ('paris.jpg') сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Създайте FAST детектор обект
кратко = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Създайте КРАТКО извличащ обект
#brief = cv2.DescriptorExtractor_create ("КРАТКО") # Определяне на ключови точки keypoints = fast.detect (сиво, няма)
Получавайте дескриптори и нови крайни ключови точки с помощта на BRIEF
ключови точки, дескриптори = кратко.compute (сиво, ключови точки) print ("Брой открити ключови точки:", len (ключови точки))
Начертайте богати ключови точки върху входното изображение
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Метод на функцията - КРАТКО', изображение) cv2.waitKey () cv2.destroyAllWindows ()
Конзолен изход:
ORB
импортиране на cv2 импортиране на numpy като np image = cv2.imread ('paris.jpg') сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY)
Създайте ORB обект, ние можем да посочим броя на ключовите точки, които желаем
orb = cv2.ORB_create () # Определяне на ключови точки keypoints = orb.detect (сиво, няма)
Вземете дескрипторите
keypoints, descriptors = orb.compute (сиво, ключови точки) print ("Брой открити ключови точки:", len (keypoints))
Начертайте богати ключови точки върху входното изображение
image = cv2.drawKeypoints (image, keypoints, None, flags = 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, създаден от Rajeev Ratan, абонирайте се, за да научите повече за Computer Vision и Python.