Компьютерное зрение - удивительная область, которая позволяет компьютерам видеть и понимать мир через обработку изображений и видео. Одним из наиболее популярных инструментов для работы с компьютерным зрением является библиотека OpenCV. В этой статье мы рассмотрим, как использовать OpenCV для распознавания обьектов на изображении.
Допустим мы хотим найти карты из игры Дурак онлайн. Вот такое изображение мы будем обрабатывать.
Шаг 1: Установка и настройка OpenCV
Первым шагом будет установка и настройка OpenCV. Вы можете установить OpenCV с помощью pip, выполнив следующую команду:
pip install opencv-python
Шаг 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 предоставляет мощные инструменты для обработки изображений и компьютерного зрения, и вы можете использовать эти техники для создания различных проектов, связанных с распознаванием и обработкой изображений. Однако в целом все распозналось не очень, ничего страшного, в следующих статьях мы исправим это.
Комментарии (6)
wadik69
18.06.2023 21:11+1Вот мои статьи на похожие темы - https://habr.com/ru/articles/547218/ и https://habr.com/ru/articles/736190/. Возможно, они Вам помогут в дальнейшем развитии проекта
korvint
18.06.2023 21:11Когда мне потребовалось реализовать реальный проект по поиску объектов на фото, я тоже начал с OpenCV. Но после изучения понял, что он далеко не для всех подобных задач годится. Задействовал нейронные сети - и все пошло как по маслу. Получалось не просто находить объекты, но и определять их четкие координаты с точностью до 2%.
Так что нейронные сети рулят!
PUMOVETZ Автор
18.06.2023 21:11Да, в это плане нейронные сети гораздо лучше, но в нашем случае когда мы можем четко различать границы обьектов на 2d изображении OpenCV тоже сойдет.
saipr
Именно поэтому, наверное, мне и пришло предложение в вконтакте отметить себя на фотографии:
Это предложение, конечно, польстило мне. Но на фотографии всё же не я, хотя меня часто и принимают за Н.С.
Но автор обнадёживает:
Будем ждать.