Обнаружение объектов без использования машинного обучения
Сегодня мы разберём как найти объекты на изображениях с камер видеонаблюдения, не прибегая к использованию больших вычислительных мощностей.
3.1K открытий
Наша основная задача — найти на изображениях с камер видеонаблюдения световые оповещатели — таблички с надписью «выход», расположенные над дверями в зданиях в любых местах, чтобы провести анализ нарушений светится табличка или нет, не прибегая к использованию больших вычислительных мощностей. Поэтому мы не будем использовать машинное обучение. Мы разберем один из вариантов, как решить данную задачу. Для этого будем использовать библиотеку Opencv-python. Она содержит методы обработки изображения и алгоритмы компьютерного зрения. Перейдем к краткому описанию подготовки данных и работе алгоритма, а также установке необходимых библиотек.
У нас есть папка с изображениями, где мы будем искать объекты. Во второй папке у нас есть изображения объектов — табличек с надписью «выход». Чтобы сделать алгоритм более универсальным, с помощью геометрических изменений мы подготовим объекты и поместим их также во вторую папку. Эти две папки передаются на вход. Далее берется одно изображение и с помощью цикла происходит сопоставление шаблонов со всеми объектами. Сопоставление шаблонов – метод поиска области изображения похожих на шаблон. Суть данного метода в том, чтобы найти идентичную область изображения, которая соответствует шаблону. В результате мы получим на каких изображениях были найдены таблички «выход» и папку с изображениями, на которых нужные объекты выделены рамкой.
Библиотеки, которые будут использоваться:
Numpy — библиотека для числовых операций.
Os для работы с операционной системой.
Opencv-python – библиотека компьютерного зрения
Перед использованием каждой библиотеки проверьте, что она установлена:
pip install opency-python numpy os
Главное соблюдать ограничения по работе, без них алгоритм может выполняться с ошибкой. Рассмотрим основные ограничения.
Основные ограничения по работе с исходным кодом в примерах:
· Фиксированная структура папок.
· Для корректной работы все блоки надо запускать последовательно.
· Прописывать пути к файлам и папкам, не трогать переменные, которые не заключены в кавычки.
Теперь можем приступить к работе с входными данными.
Описание подготовки входных данных
import numpy as np import os import cv2
Перейдем к подготовке объектов для поиска.
Подготовим объекты с помощью геометрических изменений. Если наш объект лежит под другим углом в отличии от объекта, расположенного на изображении поиска, то алгоритм его распознает. Для этого будем отображать объект по осям XYZ и использовать зеркальное отображение. Преобразованные объекты помещаем в одну папку с исходными табличками «Выход». Для этого в строке сохранения укажем путь к папке с объектами поиска.
xz=0 #Переменная нужна для создания уникальных файлов. def sim_xyz(c,x, img): #Аргумент с-определение угла по ХZ в системе координат XYZ. # Аргумент х- определение угла по YZ в системе координат XYZ. global xz hieght,width = img.shape[:2] #Высота и ширина изображения. for i in range(100): #Цикл для прогона скрипта. xz+=1 # Отражение по оси XYZ. M = np.float32([[1,c,0],[x,1,0],[0,0,1]]) #Преобразование углов. res = cv2.warpPerspective(img, M,(int(hieght*2.3), int(width*2))) #Объект подставляем в преобразованные углы. cv2.imwrite(r’C:\Users\Desktop\data_train2\\’+str(xz)+’_sim.png’, res) #Сохраняем измененное изображение. xz+=1 # Зеркальное отражение. flip_img = cv2.flip(res,1) #Отображаем зеркально. cv2.imwrite(r’C:\Users\Desktop\data_train2\\’+str(xz)+’_sim.png’, flip_img) #Сохраняем объект. xz+=1 # Отображение по углам от -180 до 180 оси XY. center = (width/2, hieght/2) #Высчитываем центр. for i in range(0, 45, 10): #Для каждго объекта будет применен угол от 0 до 45 по оси XY. xz+=1 m = cv2.getRotationMatrix2D(center, i, 1.0)#Вращение относительно центра на заданный угол. rotated = cv2.warpAffine(res, m, (int(width*2.3),int(hieght*2))) #Подставляем объект в заданные параметры. flip_img_rot = cv2.flip(rotated,1) #Зеркальное отображение для каждого шага. cv2.imwrite(r’C:\Users\Desktop\data_train2\\’+str(xz)+’_sim.png’, rotated) #Сохраняем. xz+=1 cv2.imwrite(r’C:\Users\Desktop\data_train2\\’+str(xz)+’_sim.png’, flip_img_rot) #Сохраняем зеркальное отображение. if c != 0:#Условие для изменения углов В оси XYZ. c+=0.06 if x != 0: x+=0.06 if c >0.5 or x>0.5: # Если угол больше 0.5 выполнение цикла останавливается. break directory = os.listdir(r’C:\Users\Desktop\data_train’)#Находим список необходимых файлов для поиска. for file in directory: #Берем каждый файл из списка по отдельности. image = cv2.imread(r’C:\Users\Desktop\data_train\\’+file) sim_xyz(c=0.02, x=0,img=image) sim_xyz(c=0, x=0.02,img=image) sim_xyz(c=0.02, x=0.02,img=image)
На выходе получим папку с преобразованными объектами.
Теперь у нас готова вторая папка, где хранятся объекты. Мы закончили подготовку входных данных. Можем переходить к основной части алгоритма. Распознавание объектов.
Работа с алгоритмом распознавания объектов
Основная логика алгоритма строится на библиотеке оpencv-python. Используем метод matchTemplate для сопоставления шаблонов. Сначала прописываем пути к преобразованным изображениям. Далее читаем каждое изображение для работы. В алгоритме также используется пороговое значение, необходимое для точности определения области изображения.
xz = 0 data_exit = os.listdir(‘Desktop/data_train2’) #Папка с файлами, которые ищем. data = os.listdir(‘Desktop/data/open’) #Пака с файлами где ищем. for dir in data: data_1 = os.listdir(‘Desktop/data/open//’+dir+’//word/media’) #Переходим в одну из папок. for screen in data_1: #Берем каждое по отдельности изображение в папке src = cv2.imread(r’C:\Users\Desktop\data\open\\’+dir+’\\word\media\\’+screen) #Читаем файл try: #Обработка ошибок. src.shape except AttributeError: continue gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) #Переводим изображение в оттенки серого. i = 0 #переменная счетчик для количества проходов. print(f’Проверка
Пример изображения с найденным объектом
На выходе мы получаем папку с изображениями, где были найдены необходимые объекты.
После всех преобразований мы получили изображения с найденными объектами и можем провести анализ нарушений светится табличка «Выход» или нет. В итоге у нас получился готовый алгоритм для распознавания объектов без применения машинного обучения. Алгоритм универсален, его можно использовать для поиска любых простых геометрических объектов и не требуется обучать модель машинного обучения, но при этом мы уступаем в скорости выполнения распознавания объектов. Данный алгоритм вы можете использовать, если не хотите тратить время на написание и обучение моделей машинного обучения, или если нет необходимых вычислительных мощностей.
Поиск объектов на фото с помощью Python
В данной статье хочу рассказать про поиск объектов на изображении с помощью Python и OpenCV. В качестве изображения может быть использована как Captcha, так и любое другое изображение.
Полный код и все исходники можно найти на моем Github.
Для того, чтобы написать легковесное приложение для обнаружения объектов на изображении, установим необходимые библиотеки:
pip install opencv-python pip install numpy
Также для красивого вывода текста в консоль я добавил следующую библиотеку:
pip install art
Теперь можем перейти к написанию самого приложения, которое будет находить объекты на изображении при помощи YOLO и отмечать их.
Скачаем с моего Github исходники и поместим в директорию Resources в проекте. Посмотрим, какие объекты сможет определять наша будущая программа:
'person', 'bicycle', 'car', 'motorbike', 'aeroplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'sofa', 'pottedplant', 'bed', 'diningtable', 'toilet', 'tvmonitor', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
Первым делом импортируем необходимые библиотеки:
import cv2 import numpy as np from art import tprint
Напишем функции для применения YOLO. С ее помощью определяются самые вероятные классы объектов на изображении, а также координаты их границ, которые в дальнейшем будут использованы для отрисовки.
def apply_yolo_object_detection(image_to_process): """ Recognition and determination of the coordinates of objects on the image :param image_to_process: original image :return: image with marked objects and captions to them """ height, width, _ = image_to_process.shape blob = cv2.dnn.blobFromImage(image_to_process, 1 / 255, (608, 608), (0, 0, 0), swapRB=True, crop=False) net.setInput(blob) outs = net.forward(out_layers) class_indexes, class_scores, boxes = ([] for i in range(3)) objects_count = 0 # Starting a search for objects in an image for out in outs: for obj in out: scores = obj[5:] class_index = np.argmax(scores) class_score = scores[class_index] if class_score > 0: center_x = int(obj[0] * width) center_y = int(obj[1] * height) obj_width = int(obj[2] * width) obj_height = int(obj[3] * height) box = [center_x - obj_width // 2, center_y - obj_height // 2, obj_width, obj_height] boxes.append(box) class_indexes.append(class_index) class_scores.append(float(class_score)) # Selection chosen_boxes = cv2.dnn.NMSBoxes(boxes, class_scores, 0.0, 0.4) for box_index in chosen_boxes: box_index = box_index box = boxes[box_index] class_index = class_indexes[box_index] # For debugging, we draw objects included in the desired classes if classes[class_index] in classes_to_look_for: objects_count += 1 image_to_process = draw_object_bounding_box(image_to_process, class_index, box) final_image = draw_object_count(image_to_process, objects_count) return final_image
Добавим функцию, которая обведет найденные на изображении объекты с помощью координат границ, полученных из функции apply_yolo_object_detection :
def draw_object_bounding_box(image_to_process, index, box): """ Drawing object borders with captions :param image_to_process: original image :param index: index of object class defined with YOLO :param box: coordinates of the area around the object :return: image with marked objects """ x, y, w, h = box start = (x, y) end = (x + w, y + h) color = (0, 255, 0) width = 2 final_image = cv2.rectangle(image_to_process, start, end, color, width) start = (x, y - 10) font_size = 1 font = cv2.FONT_HERSHEY_SIMPLEX width = 2 text = classes[index] final_image = cv2.putText(final_image, text, start, font, font_size, color, width, cv2.LINE_AA) return final_image
Помимо отрисовки объектов, можно добавить вывод их количества. Напишем для этого еще одну функцию:
def draw_object_count(image_to_process, objects_count): """ Signature of the number of found objects in the image :param image_to_process: original image :param objects_count: the number of objects of the desired class :return: image with labeled number of found objects """ start = (10, 120) font_size = 1.5 font = cv2.FONT_HERSHEY_SIMPLEX width = 3 text = "Objects found: " + str(objects_count) # Text output with a stroke # (so that it can be seen in different lighting conditions of the picture) white_color = (255, 255, 255) black_outline_color = (0, 0, 0) final_image = cv2.putText(image_to_process, text, start, font, font_size, black_outline_color, width * 3, cv2.LINE_AA) final_image = cv2.putText(final_image, text, start, font, font_size, white_color, width, cv2.LINE_AA) return final_image
Для получения результата будем выводить входное изображение, только с отрисованными объектами и их количеством:
def start_image_object_detection(img_path): """ Image analysis """ try: # Applying Object Recognition Techniques in an Image by YOLO image = cv2.imread(img_path) image = apply_yolo_object_detection(image) # Displaying the processed image on the screen cv2.imshow("Image", image) if cv2.waitKey(0): cv2.destroyAllWindows() except KeyboardInterrupt: pass
Программа уже почти готова, осталось только написать функцию main , где будем передавать аргументы в функции.
Данный блок не является обязательным, но я захотел сделать красивый вывод текста в консоль:
# Logo tprint("Object detection") tprint("by") tprint("paveldat")
Создадим функцию main , в которой настроим нашу сеть:
if __name__ == '__main__': # Loading YOLO scales from files and setting up the network net = cv2.dnn.readNetFromDarknet("Resources/yolov4-tiny.cfg", "Resources/yolov4-tiny.weights") layer_names = net.getLayerNames() out_layers_indexes = net.getUnconnectedOutLayers() out_layers = [layer_names[index - 1] for index in out_layers_indexes] # Loading from a file of object classes that YOLO can detect with open("Resources/coco.names.txt") as file: classes = file.read().split("\n") # Determining classes that will be prioritized for search in an image # The names are in the file coco.names.txt image = input("Path to image(recapcha): ") look_for = input("What we are looking for: ").split(',') # Delete spaces list_look_for = [] for look in look_for: list_look_for.append(look.strip()) classes_to_look_for = list_look_for start_image_object_detection(image)
Программа будет запрашивать путь до изображения и объекты, которые хотим найти. Объекты должны перечисляться через запятую, если их несколько.
Запускаем программу и тестируем. Слева будет оригинальное изображение, а справа — обработанное.
Path to image(recapcha): Result\input\bus1.png What we are looking for: bus

Path to image(recapcha): Result\input\truck.jpg What we are looking for: truck

Path to image(recapcha): Result\input\city.png What we are looking for: car, person, traffic light

Мы проверили, как алгоритм YOLO справился с тестом. Погрешность все же есть, но в основном программа успешно находит необходимые объекты.
- python
- opencv
- opencv python
- object detection
- yolo
- компьютерное зрение
- поиск объектов
- deep learning
- машинное обучение
- detection
Распознавание объектов на Python / Глубокое машинное обучение

Python является одним из самых перспективных языков, позволяющий воплощать искусственный интеллект в жизнь. В уроке мы создадим распознавание объектов при помощи Python и ImageAI.
Одна из самых перспективных наук о компьютерах и программах – компьютерное зрение. Его смысл заключается в способности ПК к распознанию и определению сути картинки. Это важнейшая область в искусственном интеллекте, включающая сразу несколько действий: распознание содержимого фотографии, определение предмета и его классификация или генерация. Поиск объектов на картинке, скорее всего, является важнейшей областью компьютерного зрения.
Определение вещей или живых существ на фотографии активно используется в следующих сферах:
- Поиск автомобилей;
- Система распознания людей;
- Поиск и подсчёт количества пешеходов;
- Усиление системы безопасности;
- Создание беспилотных автомобилей и т. д.
Сегодня удалось разработать много методов для поиска объектов, которые применяются в зависимости от целевой области. В этой сфере, как и в других направлениях использования ИТ-технологий, многое напрямую зависит от программиста. Это отличный инструмент для творчества, с которым «творение» может получить собственный ум. Как использовать интеллект программы уже зависит от творческого мышления разработчика.

Технология действительно перевернула представление об искусственном интеллекте. В дальнейшем она стала основой для следующих методов R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet. Среди них и высокоточные, быстрые методы — SSD и YOLO. Для применения перечисленных алгоритмов, в основе которых глубокое обучение, требуется наличие глубоких познаний в математике и доскональное понимание фреймворков.
Начнем
Рассмотрение советов следует начинать с функциональной библиотеки ImageAI , написанной на Python. Данный фреймворков позволяет с лёгкостью интегрировать инновационные достижения в сфере компьютерного зрения в уже разработанные или новые программы.
Установка Python
Без инсталляции Python 3 здесь не обойтись. Нужно всего лишь загрузить файл с оф. сайта и запустить процесс установки.
Создание зависимостей
Сейчас самое время для того, чтобы посредством pip установить зависимости. Принцип создания команды прост: pip install и название библиотеки (основные фреймворки описаны в списке ниже). Как это выглядит:
pip install tensorflow # устанавливает программную среду Tensorflow.
Какие фреймворки нужно добавить:
- Numpy;
- SciPy;
- OpenCV (opencv-python);
- Pillow;
- Matplotlib;
- H5py;
- Keras;
- ImageAI ( ссылка ).
Просмотреть все фреймворки и команды для их установки вы можете на официальном сайте с документацией по ImageAI .

Retina Net
Теперь стоит скачать файл для модели Retina Net. Он участвует в процессе идентификации объектов на изображениях.
Как только зависимости установлены, уже есть возможность написать первые строки кода для вычисления предметов на картинках. Следует создать файл FirstDetection с расширением .py . В созданный файл следует вставить код из следующего раздела. Ещё нужно скопировать файл из модели Retina и добавить картинку для обработки в папку с файлом Python.
Тестирование
Создайте файл и разместите в нем следующий код:
from imageai.Detection import ObjectDetection import os exec_path = os.getcwd() detector = ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath(os.path.join( exec_path, "resnet50_coco_best_v2.0.1.h5") ) detector.loadModel() list = detector.detectObjectsFromImage( input_image=os.path.join(exec_path, "objects.jpg"), output_image_path=os.path.join(exec_path, "new_objects.jpg"), minimum_percentage_probability=90, display_percentage_probability=True, display_object_name=False )
Осталось запустить код и ожидать появление результатов работы в консоли. Дальше следует пройти в каталог, где установлен файл FirstDetection.py . Здесь же должна появиться новая фотография или несколько. Чтобы лучше понимать, что произошло, следует открыть изначальную и новую картинку.
Время рассмотреть принцип работы кода:
from imageai.Detection import ObjectDetection import os exec_path = os.getcwd()
Описание строк:
- 1 строка: перенос ImageAI и класса для поиска предмета;
- 2 строка: импорт Python os;
- 4 строка: создание переменной, в которой указывается путь к директории с файлом Python, RetinaNet, моделью и образом.
detector = ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath(os.path.join( exec_path, "resnet50_coco_best_v2.0.1.h5") ) detector.loadModel() list = detector.detectObjectsFromImage( input_image=os.path.join(exec_path, "objects.jpg"), output_image_path=os.path.join(exec_path, "new_objects.jpg"), minimum_percentage_probability=90, display_percentage_probability=True, display_object_name=False )
Описание строк:
- 1 строка: объявление нового класса для поиска объектов;
- 2 строка: установка типа модели RetinaNet;
- 3 строка: указание пути к модели RetinaNet;
- 6 строка: загрузка модели внутрь класса для поиска;
- 8 строка: вызов функции обнаружения (распознавания объектов) и запуск парсинга пути начального и конечного изображений.
ImageAI имеет поддержку массы различных настроек для поиска объектов. Например, можно настроить извлечение всех найденных объектов во время обработки картинки. Класс поиска способен создать отдельную папку с названием image, а затем извлечь, сохранить и вернуть массив с путём ко всем объектам.
list, extracted_images = detector.detectObjectsFromImage (input_image=os.path.join(execution_path , "objects.jpg"), output_image_path=os.path.join(execution_path , "new_objects.jpg"), extract_detected_objects=True)
Видео обзор
Для более детального рассмотрения библиотеки советуем просмотреть видео обзор этой библиотеки. В ходе видео будет показано не только распознавание объектов на фото, но также вы узнаете про рассмотрение объектов на видео.
Ссылки из видео:
- Установка Python ;
- Установка Pip ;
- Редактор PyCharm ;
- Большой курс по языку Python ;
- ImageAI GitHub ;
- ImageAI документация .
В ходе урока было создано распознавание объектов на видео. Код приведен ниже:
from imageai.Detection import VideoObjectDetection import os execution_path = os.getcwd() detector = VideoObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath( os.path.join(execution_path , "yolo.h5")) detector.loadModel() video_path = detector.detectObjectsFromVideo( input_file_path=os.path.join(execution_path, "traffic.mp4"), output_file_path=os.path.join(execution_path, "traffic_detected"), frames_per_second=20, log_progress=True ) print(video_path)
Заключение
В конце советов по глубокому изучению следует добавить небольшую выборку из самых полезных функций ImageAI, ведь её возможности выходят далеко за пределы обычного обнаружения объектов:
- Установка порога минимальной вероятности: стандартные настройки исключают из выборки все объекты с вероятностью до 50% . Они даже не записываются в лог. При желании можно изменить в большую или меньшую сторону вероятности для определённых случаев;
- Особые настройки обнаружения: с помощью класса CustomObject, есть возможность попросить приложение передавать информацию об определении некоторых уникальных объектов;
- Скорость поиска: существует возможность вручную снизить время, которое затрачивает приложение для сканирования фотографии. Есть 3 режима работы: fast, faster, fastest;
- Входящие типы: поддерживает указание в качесиве пути картинке – Numpy-массива, а также файлового потока;
- Выходные типы: можно установить, чтобы функция detectObjectsFromImage возвращала картинки файлом или массивом Numpy.
Конечно, охватить всё компьютерное зрение нереально даже за целую книгу, но основные понятия, надеемся, мы смогли донести.
Больше интересных новостей

ТОП-10: GitHub оценил популярность языков программирования

10 IT-профессий, которые могут не бояться ИИ и автоматизации

Создание Java программы с дизайном! Изучение библиотеки JavaFx

Как ИИ позволяет продавать больше, анализируя поведение клиентов
Комментарии (1)
аскар 27 января 2023 в 18:20
Input image with path C:\Users\asqar\Desktop\Projects\Object\Object.jpg not a valid file
ошибка такая, че делать?(
Владимир 24 сентября 2023 в 16:34
Поиск объектов на изображении. Часть 1
Компьютерное зрение — удивительная область, которая позволяет компьютерам видеть и понимать мир через обработку изображений и видео. Одним из наиболее популярных инструментов для работы с компьютерным зрением является библиотека 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 предоставляет мощные инструменты для обработки изображений и компьютерного зрения, и вы можете использовать эти техники для создания различных проектов, связанных с распознаванием и обработкой изображений. Однако в целом все распозналось не очень, ничего страшного, в следующих статьях мы исправим это.
- Python
- Графические оболочки