Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор. Прочетете още.

Можете да използвате много проекти, за да укрепите уменията си в компютърното зрение и Python. Един от тези проекти е създаването на прост брояч за лицеви опори с помощта на Python. Можете да напишете програмата на този проект в един файл.

Програмата ще вземе видео вход или вход в реално време от камера, ще извърши оценка на човешка поза на входа и ще преброи броя на лицевите опори, които човекът прави. За да извърши оценка на човешка поза, програмата ще използва модела за оценка на човешка поза MediaPipe.

Това е модел, разработен от Google, който проследява тридесет и три ориентира върху човешкото тяло. Той също така прогнозира сегментация на цялото тяло, която представя като сегментация от два класа. Следното изображение показва всички ориентири, които моделът може да идентифицира. Номерираните точки идентифицират всяка забележителност и се свързват една с друга с линии.

instagram viewer
Кредит за изображение: MediaPipe/GitHub

Вашата програма за брояч на лицеви опори ще използва позициите на раменете и лактите. В изображението по-горе ориентирите за раменете са 11 и 12, докато ориентирите за лактите са 13 и 14.

Настройване на вашата среда

Трябва вече да сте запознати с основите на Python. Отворете Python IDE и създайте нов Python файл. Изпълнете следната команда на терминала, за да инсталирате съответните пакети във вашата среда:

pip инсталирайте OpenCV-Python

Ще използвате OpenCV-Python, за да вземете видео входа във вашата програма и да го обработите. Тази библиотека дава вашата програма възможности за компютърно зрение.

pip инсталирайте MediaPipe

Ще използвате MediaPipe, за да извършите оценка на човешка поза на входа.

pip инсталирайте imutils

Ще използвате imutils, за да промените размера на видео входа до желаната от вас ширина.

Импортирайте трите библиотеки, които преди сте инсталирали във вашата среда. Това ще направи възможно използването на техните зависимости в проекта.

импортиране cv2
импортиране imutils
импортиране mediapipe като т.т

След това създайте три обекта MediaPipe и ги инициализирайте, като използвате съответните функции. Ще използвате mp.solutions.drawing_utilsfunction, за да начертаете различните ориентири на входа. 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
позиция = Нито един
cap = cv2.VideoCapture("v4.mp4")

Инициализирайте променливата позиция на None. Програмата ще го актуализира в зависимост от позицията на лактите и раменете.

Извикайте модела за оценка на позата MediaPipe, който ще открие човешката поза във входа.

с mp_pose. поза (
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) като поза:

Инициализациите на увереността на откриване и увереността на проследяване представляват нивото на точност, от което се нуждаете от модела. 0,7 е подобна на 70% точност. Можете да го промените до желаното от вас ниво.

Вземане и предварителна обработка на входа

Вземете входните данни, които по-късно ще предадете на модела за оценка на позата. Преоразмерете ширината на видео входа с помощта на библиотеката imutils. Преобразувайте входа от BGR в RGB, тъй като MediaPipe работи само с RGB вход. И накрая, прехвърлете конвертирания вход към модела за оценка на човешката поза, за да идентифицирате ориентирите.

докато cap.isOpened():
успех, image=cap.read()

аконе успех:
печат ("празна камера")
прекъсвам

изображение = imutils.resize (изображение, ширина=500)
изображение = cv2.cvtColor (cv2.flip (изображение, 1), cv2.COLOR_BGR2RGB)
резултат = pose.process (изображение)

След обработката на входа вие сте идентифицирали ориентирите на входа.

Рисуване на идентифицираните забележителности на входа

Създайте празен списък, който ще съхранява координатите на всяка забележителност. Използвайте класа draw_landmarks, за да нарисувате точка върху всеки ориентир и връзките между тях. Използвайки for цикъл, итерирайте ориентирите и запазете идентификатора и координатите на всеки ориентир в създадения от вас списък. Използвайте класа image.shape, за да изчислите ширината и височината на видео входа.

lmList = []

ако result.pose_landmarks:
# Чертае точките на ориентирите и ги свързва
mp_draw.draw_landmarks (изображение, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

за id, im в изброяване (result.pose_landmarks.landmark):
# Намиране на дължината и ширината на видео входа
h, w, _ = изображение.форма

# Намиране на точните координати на точките на тялото
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

Идентификаторът е номерът, даден на конкретна забележителност от модела за оценка на позата на MediaPipe. След като идентифицирате позата на човека във входа, трябва да преброите броя на лицевите опори, които прави, ако има такива.

Преброяване на броя на лицевите опори

Създайте условие, което проверява позицията на раменете спрямо позицията на лактите. Когато раменете на човека във входа са по-високи от лактите, човекът е изправен. Когато раменете са по-ниски от лактите, човекът е надолу. Проверявате това, като сравнявате идентификаторите на ориентирите на раменете с тези на ориентирите на лактите.

# Проверка дали има идентифицирани ориентири
ако len (lmList) != 0:
# Условие, което идентифицира долната позиция
ако (lmList[12][2] и lmList[11][2] >= lmList[14][2] и lmList[13][2]):
позиция = "надолу"

# Условие, което идентифицира горната позиция
ако (lmList[12][2] и lmList[11][2] <= lmList[14][2] и lmList[13][2])
и позиция == "надолу":
позиция = "нагоре"
брои +=1

За да може човек да завърши една пълна лицева опора, той трябва да заеме долна позиция и след това да се върне в горна позиция. След пълно натискане програмата може да актуализира броя с единица.

Показване на изхода

Трябва да покажете броя на лицевите опори, които програмата е преброила. Отпечатайте стойността на броя на терминала всеки път, когато потребителят прави пълна лицева опора. Накрая покажете резултата от лицето, което прави лицеви опори, с ориентирите, нарисувани върху тялото му.

 печат (брой)

cv2.imshow("Брояч за лицеви опори", cv2.flip (изображение, 1))
ключ = cv2.waitKey(1)

# Програмата прекратява, когато се натисне q
ако ключ == ord('q'):
прекъсвам

cap.release()

Резултатът трябва да изглежда нещо подобно:

Трябва да наблюдавате актуализация на терминала, тъй като лицето на изхода прави пълна лицева опора.

Укрепете уменията си за компютърно зрение

Компютърната визия е широка. Броячът за лицеви опори е един от многото проекти, които можете да използвате, за да приложите на практика уменията си за компютърно зрение. Най-добрият начин за укрепване на тези умения е чрез изграждане на повече проекти, които включват компютърно зрение.

Колкото повече проекти изградите, толкова повече ще научите!