Вы можете использовать множество проектов, чтобы укрепить свои навыки компьютерного зрения и Python. Один из таких проектов — создание простого счетчика отжиманий с использованием Python. Вы можете написать программу этого проекта в одном файле.
Программа будет принимать видеовход или данные в реальном времени с камеры, выполнять оценку позы человека на входе и подсчитывать количество отжиманий, которые делает человек. Для выполнения оценки позы человека программа будет использовать модель оценки позы человека MediaPipe.
Это модель, разработанная Google, которая отслеживает тридцать три ориентира на теле человека. Он также предсказывает сегментацию всего тела, которую он представляет как сегментацию на два класса. На следующем изображении показаны все ориентиры, которые модель способна идентифицировать. Пронумерованные точки обозначают каждый ориентир и соединяются друг с другом линиями.
Ваша программа отжиманий будет использовать положение плеч и локтей. На изображении выше плечевые ориентиры — 11 и 12, а локтевые ориентиры — 13 и 14.
Настройка вашей среды
Вы уже должны быть знакомы с основы Python. Откройте Python IDE и создайте новый файл Python. Выполните следующую команду на терминале, чтобы установить соответствующие пакеты в вашей среде:
pip установить OpenCV-Python
Вы будете использовать OpenCV-Python, чтобы получить видеовход в вашей программе и обработать его. Эта библиотека дает вашей программе возможности компьютерного зрения.
pip установить MediaPipe
Вы будете использовать MediaPipe для оценки позы человека на входе.
пип установить imutils
Вы будете использовать imutils для изменения размера видеовхода до желаемой ширины.
Импортируйте три библиотеки, которые вы ранее установили в своей среде. Это позволит использовать их зависимости в проекте.
Импортировать cv2
Импортировать imutils
Импортировать медиапайп как член парламента
Затем создайте три объекта 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
Выполнение оценки позы человека
Определение позы человека — это процесс определения ориентации его тела путем определения и классификации его суставов.
Объявление ваших переменных
Объявите переменные, которые вы будете использовать для хранения количества отжиманий, положения плеч и локтей и видеовхода.
количество = 0
положение = Никто
крышка = cv2.VideoCapture("v4.mp4")
Инициализируйте переменную position значением None. Программа будет обновлять его в зависимости от положения локтей и плеч.
Вызовите модель оценки позы MediaPipe, которая обнаружит позу человека во входных данных.
с mp_pose. поза(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) как поза:
Инициализации достоверности обнаружения и достоверности отслеживания представляют уровень точности, который требуется от модели. 0,7 соответствует точности 70%. Вы можете изменить его на желаемый уровень.
Получение и предварительная обработка ввода
Возьмите ввод, который вы позже передадите в модель оценки позы. Измените ширину видеовхода с помощью библиотеки imutils. Преобразуйте вход из BGR в RGB, поскольку MediaPipe работает только с входом RGB. Наконец, передайте преобразованный ввод в модель оценки позы человека, чтобы идентифицировать ориентиры.
пока крышка.isOpened():
успех, изображение=cap.read()еслинет успех:
Распечатать("пустая камера")
перерыв
image = imutils.resize (изображение, ширина =500)
изображение = cv2.cvtColor (cv2.flip (изображение, 1), cv2.COLOR_BGR2RGB)
результат = pose.process (изображение)
После обработки ввода вы определили ориентиры на входе.
Отрисовка выявленных ориентиров на входе
Создайте пустой список, в котором будут храниться координаты каждого ориентира. Используйте класс draw_landmarks, чтобы нарисовать точку на каждом ориентире и связи между ними. Используя цикл for, выполните итерацию по ориентирам и сохраните идентификатор и координаты каждого ориентира в созданном вами списке. Используйте класс image.shape для расчета ширины и высоты видеовхода.
ЛмСписок = []
если результат.pose_landmarks:
# Рисует точки ориентиров и соединяет их
mp_draw.draw_landmarks (изображение, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)для идентификатор, я в перечислить (result.pose_landmarks.landmark):
# Находим длину и ширину видеовхода
ч, ш, _ = изображение.форма
# Нахождение точных координат точек тела
X, Y = int (им.х * ш), int (им.у * ч)
lmList.append([id, X, Y])
Идентификатор — это номер, присвоенный конкретному ориентиру моделью оценки позы MediaPipe. Определив позу человека на входе, вам нужно подсчитать количество отжиманий, которые он делает, если они есть.
Подсчет количества отжиманий
Создайте условие, которое проверяет положение плеч относительно положения локтей. Когда плечи человека на входе выше локтей, человек находится вверху. Когда плечи ниже локтей, человек опущен. Вы проверяете это, сравнивая идентификаторы ориентиров плеч с идентификаторами ориентиров локтей.
# Проверяем, есть ли опознанные ориентиры
если лен (lmList) != 0:
# Условие, определяющее нижнее положение
если (lmList[12][2] и lmList[11][2] >= lmList[14][2] и lmList[13][2]):
положение = "вниз"
# Условие, определяющее верхнее положение
если (lmList[12][2] и lmList[11][2] <= лмСписок[14][2] и lmList[13][2])
и позиция == "вниз":
положение = "вверх"
количество +=1
Чтобы человек выполнил одно полное отжимание, он должен принять нижнее положение, а затем вернуться в верхнее положение. После полного отжимания программа может обновить счет на единицу.
Отображение вывода
Вам нужно отобразить количество отжиманий, которые насчитала программа. Выводить значение счетчика на терминал каждый раз, когда пользователь делает полное отжимание. Наконец, отобразите вывод человека, выполняющего отжимания, с ориентирами, нарисованными на его теле.
распечатать (количество)
cv2.imshow («Счетчик отжиманий», cv2.flip (изображение, 1))
ключ = cv2.waitKey(1)# Программа завершается при нажатии q
если ключ == порядок('к'):
перерыв
крышка.релиз()
Вывод должен выглядеть примерно так:
Вы должны наблюдать обновление на терминале, когда человек на выходе делает полное отжимание.
Укрепите свои навыки компьютерного зрения
Компьютерное зрение широкое. Счетчик отжиманий — один из многих проектов, которые вы можете использовать, чтобы применить свои навыки компьютерного зрения на практике. Лучший способ укрепить эти навыки — создать больше проектов, связанных с компьютерным зрением.
Чем больше проектов вы создадите, тем большему вы научитесь!