Компьютерное зрение - удивительная область, которая позволяет компьютерам видеть и понимать мир через обработку изображений и видео. Одним из наиболее популярных инструментов для работы с компьютерным зрением является библиотека 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)


  1. saipr
    18.06.2023 21:11
    +1

    Однако в целом все распозналось не очень

    Именно поэтому, наверное, мне и пришло предложение в вконтакте отметить себя на фотографии:


    image


    Это предложение, конечно, польстило мне. Но на фотографии всё же не я, хотя меня часто и принимают за Н.С.
    Но автор обнадёживает:


    ничего страшного, в следующих статьях мы исправим это.

    Будем ждать.


  1. wadik69
    18.06.2023 21:11
    +1

    Вот мои статьи на похожие темы - https://habr.com/ru/articles/547218/ и https://habr.com/ru/articles/736190/. Возможно, они Вам помогут в дальнейшем развитии проекта


  1. korvint
    18.06.2023 21:11

    Когда мне потребовалось реализовать реальный проект по поиску объектов на фото, я тоже начал с OpenCV. Но после изучения понял, что он далеко не для всех подобных задач годится. Задействовал нейронные сети - и все пошло как по маслу. Получалось не просто находить объекты, но и определять их четкие координаты с точностью до 2%.

    Так что нейронные сети рулят!


    1. PUMOVETZ Автор
      18.06.2023 21:11

      Да, в это плане нейронные сети гораздо лучше, но в нашем случае когда мы можем четко различать границы обьектов на 2d изображении OpenCV тоже сойдет.


  1. Travisw
    18.06.2023 21:11

    Можно бота сделать для игры в различные карточные игры чтобы он качался пока ты живёшь


    1. PUMOVETZ Автор
      18.06.2023 21:11

      я и думаю попробовать это сделать пока провернув с дураком, думаю нейронку бахну для самой карточной игры, а так все на эмуляторе живет