- Обнаружение и распознавание объектов в Python с помощью OpenCV
- Обнаружение объекта
- С использованием OpenCV
- Каскад Хаара
- Требования для обнаружения объектов с помощью Python OpenCV
- Реализация в Python
- Открытие изображения
- Распознавание или обнаружение объекта на изображении
- Поиск объектов на изображении. Часть 1
- Заключение
Обнаружение и распознавание объектов в Python с помощью OpenCV
OpenCV – это огромная библиотека с открытым исходным кодом для обработки изображений, машинного обучения и компьютерного зрения. Также играет важную роль в процессах реальном времени. С помощью библиотеки OpenCV мы можем легко обрабатывать изображения, а также видео, чтобы идентифицировать объекты, лица или даже почерк человека, присутствующего в файле.
В этом руководстве мы сосредоточимся только на обнаружении и распознавании объектов изображений в Python с помощью OpenCV. Мы узнаем, как мы можем использовать OpenCV для обнаружения объектов по заданному изображению с помощью программы Python.
Обнаружение объекта
По сути, обнаружение объектов – это современная компьютерная технология, которая связана с обработкой изображений, глубоким обучением и компьютерным зрением для обнаружения объектов, присутствующих в файле изображения. Все технологии, используемые в методе обнаружения объектов (как мы упоминали ранее), связаны с обнаружением экземпляров объекта на изображении или видео.
С использованием OpenCV
В этом разделе мы узнаем, как мы можем выполнять обнаружение объектов в изображении или видео с помощью библиотеки OpenCV. Сначала мы импортируем библиотеку OpenCV в программу Python, а затем будем использовать функции для обнаружения объектов в предоставленном нам файле изображения. Но, прежде чем использовать и импортировать библиотечные функции, давайте сначала установим требования для использования техники обнаружения объектов.
В этом уроке мы будем использовать каскадную технику Хаара для обнаружения объектов. Давайте сначала узнаем вкратце о каскадной технике Хаара.
Каскад Хаара
По сути, каскадная техника Хаара – это подход, основанный на машинном обучении, при котором мы используем множество положительных и отрицательных изображений, чтобы научиться классифицировать изображения. Каскадные классификаторы Хаара считаются эффективным способом обнаружения объектов с помощью библиотеки OpenCV. Теперь давайте разберемся с концепцией положительных и отрицательных изображений, которую мы обсуждали ранее:
- Положительные изображения: это изображения, которые содержат объекты, которые мы хотим идентифицировать с помощью классификатора.
- Отрицательные изображения: это изображения, которые не содержат никаких объектов, которые мы хотим обнаружить классификатором, и это могут быть изображения всего остального.
Требования для обнаружения объектов с помощью Python OpenCV
Мы должны сначала установить некоторые важные библиотеки в нашу систему, поскольку это важное требование для выполнения задач обнаружения объектов. Мы должны установить следующие библиотеки в нашу систему в качестве требования для выполнения обнаружения объектов:
Прежде всего, требование для выполнения обнаружения объектов с использованием библиотеки OpenCV состоит в том, что библиотека OpenCV должна присутствовать на нашем устройстве, чтобы мы могли импортировать ее в программу Python и использовать ее функции обнаружения объектов. Если этой библиотеки нет в нашей системе, мы можем использовать следующую команду в нашем терминале командной строки для ее установки:
Когда мы нажимаем клавишу ввода после написания этой команды в терминале, установщик pip в командной строке начнет установку библиотеки OpenCV в нашу систему.
Как мы видим, библиотека OpenCV успешно установлена в нашей системе, и теперь мы можем импортировать ее в программу Python, чтобы использовать ее функции.
Matplotlib очень полезна при открытии, закрытии, чтении изображений в программе Python, и поэтому установка этой библиотеки для обнаружения объектов становится важным требованием. Если библиотека matplotlib отсутствует в нашей системе, мы должны использовать следующую команду в нашем терминале командной строки, чтобы установить ее:
Когда мы нажимаем клавишу ввода после написания этой команды в терминале, установщик pip в командной строке начнет установку его в нашу систему.
Как мы видим, библиотека matplotlib успешно установлена в нашей системе, и теперь мы можем импортировать ее в программу Python, чтобы использовать ее функции для открытия, чтения и т. д. изображений.
Мы установили все необходимые библиотеки для выполнения обнаружения объектов, и теперь мы можем перейти к реализации части этой задачи.
Реализация в Python
В этой части мы напишем программу Python для обнаружения объектов и понимания его реализации. Мы будем использовать следующее изображение в нашей программе Python, чтобы выполнить обнаружение объекта на нем:
Открытие изображения
Сначала мы откроем изображение, приведенное выше, и создадим среду изображения, чтобы показать его на выходе. Давайте сначала рассмотрим пример программы, чтобы понять ее реализацию, а затем рассмотрим пояснительную часть.
Пример 1: Открытие изображения с помощью OpenCV и библиотеки matplotlib в программе Python
# Import OpenCV module import cv2 # Import pyplot from matplotlib as pltd from matplotlib import pyplot as pltd # Opening the image from files imaging = cv2.imread("opencv-od.png") # Altering properties of image with cv2 img_gray = cv2.cvtColor(imaging, cv2.COLOR_BGR2GRAY) imaging_rgb = cv2.cvtColor(imaging, cv2.COLOR_BGR2RGB) # Plotting image with subplot() from plt pltd.subplot(1, 1, 1) # Displaying image in the output pltd.imshow(imaging_rgb) pltd.show()
Во-первых, мы импортировали библиотеки OpenCV(как cv2) и matplotlib(как plt) в программу, чтобы использовать их функции в коде. После этого мы открыли файл изображения с помощью функции imread() cv2.
Затем мы определили свойства изображения, которое мы открыли в программе, с помощью функций cv2. Затем мы строим подзаголовок изображения, используя функцию subplot() plt и задавая в ней параметры. Наконец, мы использовали функции imshow() и show() модуля plt, чтобы показать изображение на выходе.
Как мы видим на выходе, изображение отображается в результате работы программы, а его границы были нанесены на вспомогательные черты.
Распознавание или обнаружение объекта на изображении
Теперь мы будем использовать функцию detectMultiScale() в программе для обнаружения объекта, присутствующего на изображении. Ниже приведен синтаксис использования в коде функции detectMultiScale():
found = xml_data.detectMultiScale(img_gray, minSize =(30, 30))
Мы будем использовать оператор условия с этой функцией в программе, чтобы проверить, обнаружен ли какой-либо объект на изображении или нет, и выделить обнаруженную часть. Давайте разберемся с реализацией обнаружения объектов на изображении на примере программы.
Пример 2: Обнаружение объекта на изображении с помощью метода detectMultiScale()
# Import OpenCV module import cv2 # Import pyplot from matplotlib as plt from matplotlib import pyplot as pltd # Opening the image from files imaging = cv2.imread("opencv-od.png") # Altering properties of image with cv2 imaging_gray = cv2.cvtColor(imaging, cv2.COLOR_BGR2GRAY) imaging_rgb = cv2.cvtColor(imaging, cv2.COLOR_BGR2RGB) # Importing Haar cascade classifier xml data xml_data = cv2.CascadeClassifier('XML-data.xml') # Detecting object in the image with Haar cascade classifier detecting = xml_data.detectMultiScale(imaging_gray, minSize =(30, 30)) # Amount of object detected amountDetecting = len(detecting) # Using if condition to highlight the object detected if amountDetecting != 0: for(a, b, width, height) in detecting: cv2.rectangle(imaging_rgb,(a, b), # Highlighting detected object with rectangle (a + height, b + width), (0, 275, 0), 9) # Plotting image with subplot() from plt pltd.subplot(1, 1, 1) # Displaying image in the output pltd.imshow(imaging_rgb) pltd.show()
После открытия изображения мы импортировали в программу XML-файл каскадного классификатора. Затем мы использовали функцию detectMultiScale() с импортированным каскадным файлом, чтобы определить, присутствует ли объект на изображении или нет.
Мы использовали условие if в программе, чтобы проверить, обнаружен ли объект или нет, и если объект обнаружен, мы выделили часть обнаруженного объекта, используя цикл for с функциями cv2. Выделив на изображении часть обнаруженного объекта, мы отобразили обработанное изображение с помощью функций plt show() и imshow().
Как мы видим в выводе, изображение с выделенной частью обнаруженного объекта показывается нам, когда мы запускаем программу.
Поиск объектов на изображении. Часть 1
Компьютерное зрение — удивительная область, которая позволяет компьютерам видеть и понимать мир через обработку изображений и видео. Одним из наиболее популярных инструментов для работы с компьютерным зрением является библиотека OpenCV. В этой статье мы рассмотрим, как использовать OpenCV для распознавания обьектов на изображении.
Допустим мы хотим найти карты из игры Дурак онлайн. Вот такое изображение мы будем обрабатывать.
Шаг 1: Установка и настройка OpenCV
Первым шагом будет установка и настройка OpenCV. Вы можете установить OpenCV с помощью pip, выполнив следующую команду:
Шаг 2: Загрузка и предобработка изображения
Прежде чем начать распознавание карт, нам нужно загрузить изображение стола с картами. Мы используем функцию cv2.imread , чтобы загрузить изображение в переменную image :
image = cv2.imread('table_image.jpg')
Затем мы можем преобразовать изображение в оттенки серого и применить размытие для удаления шума:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0)
Шаг 3: Пороговая обработка
Для обнаружения контуров карт на изображении мы используем пороговую обработку. Пороговая обработка преобразует изображение в бинарное изображение, где каждый пиксель считается либо черным, либо белым. Мы можем использовать функцию cv2.threshold для этого:
thresholded = cv2.threshold(blurred, 100, 255, cv2.THRESH_BINARY)[1]
Шаг 4: Поиск контуров
Теперь мы можем использовать функцию cv2.findContours , чтобы найти контуры на изображении:
contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Функция cv2.findContours возвращает список контуров на изображении.
Шаг 5: Обводка найденных карт на экране
Чтобы обвести найденные карты на экране, мы используем функцию cv2.drawContours . Например, чтобы обвести контуры зеленым цветом, мы можем использовать следующий код:
cv2.draw Contours(image, contours, -1, (0, 255, 0), 2)
Этот код обведет все найденные контуры зеленым цветом толщиной 2 пикселя.
Шаг 6: Отображение изображения с обведенными картами
Наконец, мы можем отобразить изображение с обведенными картами на экране с помощью функции cv2.imshow :
cv2.imshow('Detected Cards', image) cv2.waitKey(0) cv2.destroyAllWindows()
Этот код откроет окно с изображением, на котором будут обведены найденные карты. Ожидание нажатия клавиши cv2.waitKey(0) позволяет пользователю просмотреть изображение до его закрытия.
import cv2 # Загрузка изображения image = cv2.imread('test_card.jpg') # Предобработка изображения gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) thresholded = cv2.threshold(blurred, 100, 255, cv2.THRESH_BINARY)[1] # Поиск контуров на изображении contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Отображение контуров на изображении cv2.drawContours(image, contours, -1, (0, 255, 0), 2) # Отображение изображения с контурами cv2.imshow('Detected Cards', image) cv2.waitKey(0) cv2.destroyAllWindows()
Как мы видим программа успешно справилась с поиском карт на переднем и боковых планах, однако в центре все сработало не очень.
Заключение
В этой статье мы рассмотрели, как использовать библиотеку OpenCV для распознавания карт на столе и обводки их на экране. Мы рассмотрели шаги от загрузки и предобработки изображения до поиска контуров и обводки найденных карт. OpenCV предоставляет мощные инструменты для обработки изображений и компьютерного зрения, и вы можете использовать эти техники для создания различных проектов, связанных с распознаванием и обработкой изображений. Однако в целом все распозналось не очень, ничего страшного, в следующих статьях мы исправим это.