Всем привет, сегодня я покажу как написать систему распознавания ладони на Python + OpenCV (26 строчек кода). Этот урок требует минимальных знаний OpenCV.
Что мы получим на выходе
Примерно это:
Полезные ссылки
Сайт OpenCV
Документация mediapipe
Код на GitHub (Без комментариев)
Перед работой
Вам потребуется:
- Python 3;
- OpenCV;
- mediapipe.
Установка происходит через пакетный менеджер:
pip install opencv-python
pip install mediapipe
Кодим
Я решил использовать mediapipe, потому что в нём есть уже обученная ИИ для распознания ладони.
Для начало вам нужно понять, что ладонь состоит из суставов, которые можно выразить точками:
Далее пишем сам код:
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 строк кода, круто, не так ли? Оцените этот пост ведь это важно для меня.