Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius. Skaityti daugiau.

Galite naudoti daugybę projektų, kad sustiprintumėte savo kompiuterinio matymo ir Python įgūdžius. Vienas iš šių projektų yra paprasto atsispaudimo skaitiklio kūrimas naudojant Python. Šio projekto programą galite parašyti viename faile.

Programa paims vaizdo įvestį arba realaus laiko įvestį iš fotoaparato, atliks žmogaus pozos įvertinimą ir suskaičiuos žmogaus atliekamų atsispaudimų skaičių. Žmogaus pozos įvertinimui atlikti programa naudos MediaPipe žmogaus pozos įvertinimo modelį.

Tai „Google“ sukurtas modelis, stebintis trisdešimt tris žmogaus kūno orientyrus. Jis taip pat numato viso kūno segmentaciją, kuri yra dviejų klasių segmentacija. Toliau pateiktame paveikslėlyje rodomi visi orientyrai, kuriuos modelis gali atpažinti. Sunumeruoti taškai identifikuoja kiekvieną orientyrą ir jungiasi vienas su kitu linijomis.

Vaizdo kreditas: MediaPipe/GitHub
instagram viewer

Jūsų atsispaudimų skaitiklio programa naudos pečių ir alkūnių padėtis. Aukščiau pateiktame paveikslėlyje pečių orientyrai yra 11 ir 12, o alkūnės orientyrai yra 13 ir 14.

Aplinkos nustatymas

Jūs jau turėtumėte būti susipažinę su Python pagrindai. Atidarykite Python IDE ir sukurkite naują Python failą. Paleiskite šią komandą terminale, kad įdiegtumėte atitinkamus paketus savo aplinkoje:

pip įdiegti OpenCV-Python

Naudosite „OpenCV-Python“, kad paimtumėte vaizdo įvestį į programą ir ją apdorotumėte. Ši biblioteka pateikia jūsų programą kompiuterinio matymo galimybės.

pip įdiegti MediaPipe

Naudosite MediaPipe, kad atliktumėte žmogaus pozos įvertinimą įvestyje.

pip install imutils

Norėdami pakeisti vaizdo įvesties dydį iki norimo pločio, naudosite imutils.

Importuokite tris bibliotekas, kurias anksčiau įdiegėte savo aplinkoje. Tai leis projekte panaudoti jų priklausomybes.

importuoti cv2
importuoti imutils
importuoti mediapipe kaip mp

Tada sukurkite tris MediaPipe objektus ir inicijuokite juos naudodami atitinkamas funkcijas. Norėdami nubrėžti įvairius orientyrus įvestyje, naudosite mp.solutions.drawing_utilsfunction. mp.solutions.drawing_styles, kad pakeistumėte stilių, kuriuose rodomi orientyrų brėžiniai, ir mp.solutions.pose, kuris yra modelis, kurį naudosite šiems orientyrams identifikuoti.

mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

Žmogaus pozos įvertinimas

Žmogaus pozos nustatymas yra jo kūno orientacijos nustatymo procesas, nustatant ir klasifikuojant sąnarius.

Jūsų kintamųjų deklaravimas

Nurodykite kintamuosius, kuriuos naudosite atsispaudimų skaičiui, pečių ir alkūnių padėčiai ir vaizdo įvesties įrašymui išsaugoti.

skaičiuoti = 0
padėtis = Nė vienas
cap = cv2.VideoCapture("v4.mp4")

Inicijuoti pozicijos kintamąjį į None. Programa ją atnaujins priklausomai nuo alkūnių ir pečių padėties.

Iškvieskite MediaPipe pozos įvertinimo modelį, kuris įvestyje aptiks žmogaus pozą.

su mp_pose. poza (
min_detection_pasitikimas = 0.7,
min_stebėjimo_pasitikėjimas = 0.7) kaip poza:

Aptikimo patikimumo ir sekimo patikimumo inicijavimas parodo tikslumo lygį, kurio jums reikia iš modelio. 0,7 yra panašus į 70% tikslumą. Galite pakeisti jį į norimą lygį.

Įvesties paėmimas ir išankstinis apdorojimas

Paimkite įvestį, kurią vėliau perkelsite į pozos įvertinimo modelį. Pakeiskite vaizdo įvesties plotį naudodami imutils biblioteką. Konvertuokite įvestį iš BGR į RGB, nes „MediaPipe“ veikia tik su RGB įvestimi. Galiausiai perduokite konvertuotą įvestį į žmogaus pozos įvertinimo modelį, kad nustatytumėte orientyrus.

kol cap.isOpened():
sėkmės, image=cap.read()

jeigune sėkmė:
spausdinti ("tuščia kamera")
pertrauka

vaizdas = imutils.resize (vaizdas, plotis =500)
vaizdas = cv2.cvtColor (cv2.flip (vaizdas, 1), cv2.COLOR_BGR2RGB)
rezultatas = poza.procesas (vaizdas)

Apdoroję įvestį, nustatėte įvesties orientyrus.

Identifikuotų orientyrų piešimas ant įvesties

Sukurkite tuščią sąrašą, kuriame bus saugomos kiekvieno orientyro koordinatės. Naudokite klasę draw_landmarks, kad nubrėžtumėte tašką ant kiekvieno orientyro ir jungčių tarp jų. Naudodami for kilpą, kartokite orientyrus ir išsaugokite kiekvieno orientyro ID bei koordinates sukurtame sąraše. Norėdami apskaičiuoti vaizdo įvesties plotį ir aukštį, naudokite image.shape klasę.

lmList = []

jeigu result.pose_landmarks:
# Nubrėžia orientyrų taškus ir juos sujungia
mp_draw.draw_landmarks (image, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

dėl id, im in išvardinti (result.pose_landmarks.landmark):
# Vaizdo įvesties ilgio ir pločio radimas
h, w, _ = vaizdas.forma

# Tikslių kūno taškų koordinačių radimas
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

ID yra skaičius, kurį konkrečiam orientyrui suteikia MediaPipe pozos įvertinimo modelis. Nustačius žmogaus pozą įvestyje, reikia suskaičiuoti jo daromų atsispaudimų skaičių, jei tokių yra.

Atsispaudimų skaičiaus skaičiavimas

Sukurkite sąlygą, kuri patikrintų pečių padėtį, palyginti su alkūnių padėtimi. Kai įvesto asmens pečiai yra aukščiau nei alkūnės, asmuo yra aukštyn. Kai pečiai yra žemiau alkūnių, žmogus yra žemyn. Tai patikrinsite palyginę pečių orientyrų ID su alkūnių orientyrų ID.

# Tikrinama, ar nėra identifikuotų orientyrų
jeigu len (lmList) != 0:
# Sąlyga, kuri identifikuoja padėtį žemyn
jeigu (lmList[12][2] ir lmList[11][2] >= lmList[14][2] ir lmList[13][2]):
padėtis = "žemyn"

# Sąlyga, kuri identifikuoja aukštesnę poziciją
jeigu (lmList[12][2] ir lmList[11][2] <= lmList[14][2] ir lmList[13][2])
ir pozicija == "žemyn":
padėtis = "aukštyn"
skaičiuoti +=1

Kad žmogus atliktų vieną pilną atsispaudimą, jis turi nusileisti žemyn ir grįžti į aukštesnę padėtį. Po visiško atsispaudimo programa gali atnaujinti skaičių vienu.

Išvesties rodymas

Turite parodyti programos suskaičiuotų atsispaudimų skaičių. Kiekvieną kartą, kai vartotojas padaro visą atsispaudimą, terminale atspausdinkite skaičiaus reikšmę. Galiausiai parodykite atsilenkimus darančio asmens rezultatus, nupieštus orientyrus ant jo kūno.

 spausdinti (skaičiuoti)

cv2.imshow("Push-up skaitiklis", cv2.flip (vaizdas, 1))
raktas = cv2.waitKey(1)

# Programa baigiasi paspaudus q
jeigu raktas == ord('q'):
pertrauka

cap.release()

Išvestis turėtų atrodyti maždaug taip:

Turėtumėte stebėti terminalo atnaujinimą, nes išvestyje esantis asmuo atlieka visišką atsispaudimą.

Pagerinkite savo kompiuterio matymo įgūdžius

Kompiuterinis matymas platus. Atsispaudimų skaitiklis yra vienas iš daugelio projektų, kuriuos galite naudoti norėdami praktiškai pritaikyti savo kompiuterinio matymo įgūdžius. Geriausias būdas sustiprinti šiuos įgūdžius yra sukurti daugiau projektų, susijusių su kompiuterine vizija.

Kuo daugiau projektų kursite, tuo daugiau išmoksite!