Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11

Пишем систему распознавания ладони на Python OpenCV

Аватарка пользователя Simple User
Отредактировано

Покажу как написать систему распознавания ладони на Python + OpenCV (26 строчек кода). Этот урок требует минимальных знаний OpenCV.

21К открытий24К показов

Всем привет, сегодня я покажу как написать систему распознавания ладони на Python + OpenCV (26 строчек кода). Этот урок требует минимальных знаний OpenCV.

Что мы получим на выходе

Примерно это:

Пишем систему распознавания ладони на Python OpenCV 1

Полезные ссылки

Сайт OpenCV
Документация mediapipe
Код на GitHub (Без комментариев)

Перед работой

Вам потребуется:

  1. Python 3;
  2. OpenCV;
  3. mediapipe.

Установка происходит через пакетный менеджер:

			pip install opencv-python
		
			pip install mediapipe
		

Кодим

Я решил использовать mediapipe, потому что в нём есть уже обученная ИИ для распознания ладони.

Для начало вам нужно понять, что ладонь состоит из суставов, которые можно выразить точками:

Пишем систему распознавания ладони на Python OpenCV 2

Далее пишем сам код:

			import cv2
import mediapipe as mp

cap = cv2.VideoCapture(0) #Камера
hands = mp.solutions.hands.Hands(max_num_hands=1) #Объект ИИ для определения ладони
draw = mp.solutions.drawing_utils #Для рисование ладони

while True:
    #Закрытие окна
    if cv2.waitKey(1) & 0xFF == 27:
        break

    success, image = cap.read() #Считываем изображение с камеры
    image = cv2.flip(image, -1) #Отражаем изображение для корекктной картинки
    imageRGB = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) #Конвертируем в rgb
    results = hands.process(imageRGB) #Работа mediapipe

    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = image.shape
                cx, cy = int(lm.x * w), int(lm.y * h)

            draw.draw_landmarks(image, handLms, mp.solutions.hands.HAND_CONNECTIONS) #Рисуем ладонь

    cv2.imshow("Hand", image) #Отображаем картинку
		

Решение ошибки: ImportError: DLL load failed можно найти здесь.

В коде есть комментарии, но предлагаю разобрать подробно:

Импорты OpenCV и mediapipe.

			import cv2
import mediapipe as mp
		

Необходимые объекты: камера (cap), нейронка для определения ладоней (hands) с аргументов max_num_hands — максимальное количество ладоней, — и наша «рисовалка» (draw).

			cap = cv2.VideoCapture(0)
hands = mp.solutions.hands.Hands(max_num_hands=1)
draw = mp.solutions.drawing_utils
		

Бесконечный цикл.

			while True:
		

Выходим из цикла если нажата клавиша с номером 27 (Esc).

			if cv2.waitKey(1) & 0xFF == 27:
    break
		

Считываем изображение с камеры, отражаем изображение по вертикали и горизонтали, конвертируем в RGB. И, самое интересное, отдаём нашу картинку на определение ладоней.

			success, image = cap.read()
image = cv2.flip(image, -1)
imageRGB = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = hands.process(imageRGB)
		

Первый if-блок проверяет были ли вообще найдены ладони (любой не пустой объект является истинным). Далее циклом for мы «перебираем» объект с набором этих точек. Второй for — перебираем сами точки из набора

draw.draw_landmarks — удобная утилита, которая рисует ладонь на изображении, в аргументах: изображение, набор точек, и что рисуем (в нашем случае руку).

			if results.multi_hand_landmarks:
    for handLms in results.multi_hand_landmarks:
        for id, lm in enumerate(handLms.landmark):
            h, w, c = image.shape
            cx, cy = int(lm.x * w), int(lm.y * h)

        draw.draw_landmarks(image, handLms, mp.solutions.hands.HAND_CONNECTIONS)
		

Отображаем картинку.

			cv2.imshow("Hand", image)
		

Итог

Мы написали распознавание ладони на Python в 26 строк кода, круто, не так ли? Оцените этот пост ведь это важно для меня.

Следите за новыми постами
Следите за новыми постами по любимым темам
21К открытий24К показов