Подсчитайте отжимания, используя Python и камеру вашего компьютера
Узнайте, как написать программу, которая наблюдает за вашими тренировками и подсчитывает результаты.
Вы можете использовать множество проектов, чтобы улучшить свои навыки в компьютерном зрении и Python. Один из этих проектов — создание простого счетчика отжиманий с использованием Python. Вы можете написать программу этого проекта в одном файле.
Программа будет принимать видеосигнал или данные с камеры в реальном времени, оценивать позу человека на входных данных и подсчитывать количество отжиманий, которые делает человек. Для оценки позы человека программа будет использовать модель оценки позы человека MediaPipe.
Что такое модель оценки позы человека MediaPipe?
Это модель, разработанная Google, которая отслеживает тридцать три ориентира на человеческом теле. Он также прогнозирует сегментацию всего тела, которую представляет собой сегментацию на два класса. На следующем изображении показаны все ориентиры, которые способна идентифицировать модель. Пронумерованные точки обозначают каждый ориентир и соединяются друг с другом линиями.
В вашей контрпрограмме отжиманий будут использоваться положения плеч и локтей. На изображении выше отметки плеч — 11 и 12, а ориентиры локтей — 13 и 14.
Настройка вашей среды
Вы уже должны быть знакомы с основами Python. Откройте IDE Python и создайте новый файл Python. Запустите следующую команду на терминале, чтобы установить соответствующие пакеты в вашей среде:
pip install OpenCV-Python
Вы будете использовать OpenCV-Python , чтобы принять входной видеосигнал в свою программу и обработать его. Эта библиотека предоставляет вашей программе возможности компьютерного зрения.
pip install MediaPipe
Вы будете использовать MediaPipe для оценки позы человека на входных данных.
pip install imutils
Вы будете использовать imutils, чтобы изменить размер видеовхода до желаемой ширины.
Импорт и инициализация MediaPipe
Импортируйте три библиотеки, которые вы ранее установили в своей среде. Это даст возможность использовать их зависимости в проекте.
import cv2
import imutils
import mediapipe as mp
Затем создайте три объекта MediaPipe и инициализируйте их с помощью соответствующих функций. Вы будете использовать функцию mp.solutions.drawing_utils для рисования различных ориентиров на входных данных. mp.solutions.drawing_styles для изменения стилей, в которых отображаются рисунки ориентиров, и mp.solutions.pose — модель, которую вы будете использовать для идентификации этих ориентиров.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
Выполнение оценки позы человека
Обнаружение позы человека — это процесс определения ориентации его тела путем определения и классификации его суставов.
Объявление ваших переменных
Объявите переменные, которые вы будете использовать для хранения количества отжиманий, положения плеч и локтей, а также видеовхода.
count = 0
position = None
cap = cv2.VideoCapture("v4.mp4")
Инициализируйте переменную положения как None. Программа будет обновлять его в зависимости от положения локтей и плеч.
Вызов модели оценки положения MediaPipe
Вызовите модель оценки позы MediaPipe, которая определит позу человека во входных данных.
with mp_pose.Pose(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) as pose:
Инициализация достоверности обнаружения и достоверности отслеживания представляет собой уровень точности, который вам нужен от модели. 0,7 соответствует точности 70%. Вы можете изменить его на желаемый уровень.
Получение и предварительная обработка входных данных
Возьмите входные данные, которые вы позже передадите в модель оценки позы. Измените размер видеовхода с помощью библиотеки imutils. Преобразуйте входной сигнал из BGR в RGB, поскольку MediaPipe работает только с входным сигналом RGB. Наконец, передайте преобразованные входные данные в модель оценки позы человека, чтобы определить ориентиры.
while cap.isOpened():
success, image=cap.read()
if not success:
print("empty camera")
break
image = imutils.resize(image, width=500)
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
result = pose.process(image)
После обработки входных данных вы определили ориентиры на входных данных.
Рисование идентифицированных ориентиров на входе
Создайте пустой список, в котором будут храниться координаты каждого ориентира. Используйте класс draw_landmarks, чтобы нарисовать точку на каждом ориентире и соединениях между ними. Используя цикл for, переберите ориентиры и сохраните идентификатор и координаты каждого ориентира в созданном вами списке. Используйте класс image.shape для расчета ширины и высоты видеовхода.
lmList = []
if result.pose_landmarks:
# Draws the landmarks' points and connects them
mp_draw.draw_landmarks(image, result.pose_landmarks,
mp_pose.POSE_CONNECTIONS)
for id, im in enumerate(result.pose_landmarks.landmark):
# Finding the length and width of the video input
h, w, _ = image.shape
# Finding the exact coordinates of the body points
X, Y = int(im.x * w), int(im.y * h)
lmList.append([id, X, Y])
Идентификатор — это номер, присваиваемый определенному ориентиру моделью оценки позы MediaPipe. Определив позу человека во входных данных, вам нужно посчитать количество отжиманий, которые он делает, если таковые имеются.
Подсчет количества отжиманий
Создайте условие, которое сверяет положение плеч с положением локтей. Когда плечи человека на входе выше локтей, человек стоит. Когда плечи ниже локтей, человек находится внизу. Вы проверяете это, сравнивая идентификаторы ориентиров плеч с идентификаторами ориентиров локтей.
# Checking whether there are any identified landmarks
if len(lmList) != 0:
# Condition that identifies the down position
if (lmList[12][2] and lmList[11][2] >= lmList[14][2] and lmList[13][2]):
position = "down"
# Condition that identifies the up position
if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2])
and position == "down":
position = "up"
count +=1
Чтобы человек выполнил одно полное отжимание, он должен принять нижнее положение, а затем вернуться в верхнее положение. После полного отжима программа может обновить счетчик на единицу.
Отображение вывода
Вам необходимо отобразить количество отжиманий, которое посчитала программа. Выводите значение счетчика на терминал каждый раз, когда пользователь делает полное отжимание. Наконец, отобразите результаты человека, делающего отжимания, с помощью ориентиров, нарисованных на его теле.
print(count)
cv2.imshow("Push-up counter", cv2.flip(image, 1))
key = cv2.waitKey(1)
# Program terminates when q is pressed
if key == ord('q'):
break
cap.release()
Вывод должен выглядеть примерно так:
Вы должны наблюдать обновление на терминале, когда человек на выходе делает полное отжимание.
Укрепите свои навыки компьютерного зрения
Компьютерное зрение широкое. Счетчик отжиманий — один из многих проектов, которые вы можете использовать, чтобы применить на практике свои навыки компьютерного зрения. Лучший способ укрепить эти навыки — создавать больше проектов, связанных с компьютерным зрением.
Чем больше проектов вы построите, тем больше вы узнаете!