Мы начали с изучения основ 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)
- Выявление заболеваний и рака
- Распознавание лиц
- Распознавание почерка
- Идентификация объектов на спутниковых снимках
Обнаружение объектов VS Распознавание
Распознавание объекта - это второй уровень обнаружения объекта, при котором компьютер может распознавать объект из множества объектов на изображении и может идентифицировать его.
Теперь мы выполним некоторые функции обработки изображений, чтобы найти объект на изображении.
Поиск объекта по изображению
Здесь мы будем использовать сопоставление шаблонов для поиска символа / объекта в изображении, используйте функцию OpenCV cv2.matchTemplate () для поиска этого объекта.
импортировать cv2 импортировать numpy как np
Загрузить исходное изображение и преобразовать его в серый
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('люди', изображение) cv2.waitKey (0) gray = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)
Загрузите изображение шаблона
template = cv2.imread ('waldo.jpg', 0) # результат сопоставления шаблона объекта поверх изображения 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 (result) , который дает координаты или ограничивающую рамку, в которой объект был найден на изображении, и когда мы получим эти координаты, нарисуем прямоугольник над ним и немного растянем размеры рамки, чтобы объект легко помещается внутри прямоугольника.
Существует множество методов сопоставления шаблонов, и в этом случае мы используем cv2.TM_CCOEFF, что означает коэффициент корреляции.
Здесь ключевыми точками являются координаты (X, Y), извлеченные с помощью детектора просеивания и нанесенные на изображение с помощью функции cv2 draw keypoint.
СЕРФ
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Создайте объект SURF Feature Detector, здесь мы устанавливаем порог гессиана на 500
surf = cv2.xfeatures2d.SURF_create (500) keypoints, descriptors = surf.detectAndCompute (серый, None) print ("Количество обнаруженных ключевых точек:", len (ключевые точки))
Нарисуйте насыщенные ключевые точки на входном изображении
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', image) cv2.waitKey () cv2.destroyAllWindows ()
Консольный вывод:
БЫСТРЫЙ
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Создать объект FAST Detector
быстро = cv2.FastFeatureDetector_create () # Получить ключевые моменты, по умолчанию, не максимальное подавление Вкл # отключить набор fast.setBool («nonmaxSuppression», False) ключевых точек = fast.detect (серый, None) печать ("Количество ключевых точек Обнаружено: ", 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 ()
Консольный вывод:
КРАТКОЕ
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Создать объект детектора FAST
short = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Создать объект экстрактора BRIEF
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Определить ключевые точки keypoints = fast.detect (серый, Нет)
Получите дескрипторы и новые конечные ключевые точки с помощью BRIEF
ключевые точки, дескрипторы = short.compute (серый, ключевые точки) print ("Количество обнаруженных ключевых точек:", len (ключевые точки))
Нарисуйте насыщенные ключевые точки на входном изображении
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', image) cv2.waitKey () cv2.destroyAllWindows ()
Консольный вывод:
ORB
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Создайте объект ORB, мы можем указать количество желаемых ключевых точек
orb = cv2.ORB_create () # Определить ключевые точки keypoints = orb.detect (серый, Нет)
Получить дескрипторы
ключевые точки, дескрипторы = orb.compute (серый, ключевые точки) print ("Количество обнаруженных ключевых точек:", len (ключевые точки))
Нарисуйте насыщенные ключевые точки на входном изображении
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - ORB', image) cv2.waitKey () cv2.destroyAllWindows ()
Консольный вывод:
Мы можем указать количество ключевых точек с максимальным пределом 5000, однако значение по умолчанию - 500, то есть ORB автоматически обнаружит 500 лучших ключевых точек, если не указано для какого-либо значения ключевых точек.
Таким образом, обнаружение объектов происходит в OpenCV, те же программы можно запускать в OpenCV с установленной Raspberry Pi и использовать их в качестве портативных устройств, таких как смартфоны с Google Lens.
Эта статья ссылается на курс Master Computer Vision ™ OpenCV4 в Python с курсом глубокого обучения по Udemy, созданный Радживом Ратаном, подпишитесь на него, чтобы узнать больше о компьютерном зрении и Python.