Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

Možete koristiti mnoge projekte za jačanje svojih vještina računalnog vida i Pythona. Jedan od tih projekata je stvaranje jednostavnog brojača sklekova pomoću Pythona. Program ovog projekta možete napisati u jednoj datoteci.

Program će uzeti video ulaz ili ulaz u stvarnom vremenu s kamere, izvršiti procjenu ljudske poze na ulazu i brojati broj sklekova koje osoba radi. Za izvođenje procjene ljudske poze, program će koristiti MediaPipe model procjene ljudske poze.

Riječ je o modelu koji je razvio Google i koji prati trideset i tri znamenitosti na ljudskom tijelu. Također predviđa segmentaciju cijelog tijela koju predstavlja kao segmentaciju na dvije klase. Sljedeća slika prikazuje sve orijentire koje model može identificirati. Numerirane točke identificiraju svaki orijentir i međusobno se povezuju linijama.

Autor slike: MediaPipe/GitHub

Vaš program brojača sklekova koristit će položaje ramena i laktova. Na gornjoj slici, oznake ramena su 11 i 12, dok su oznake lakta 13 i 14.

instagram viewer

Postavljanje vašeg okruženja

Trebali biste već biti upoznati osnove Pythona. Otvorite Python IDE i izradite novu Python datoteku. Pokrenite sljedeću naredbu na terminalu da biste instalirali odgovarajuće pakete u svoje okruženje:

pip instalirajte OpenCV-Python

Koristit ćete OpenCV-Python da preuzmete video ulaz u svoj program i obradite ga. Ova biblioteka daje vaš program sposobnosti računalnog vida.

pip instalirajte MediaPipe

MediaPipe ćete koristiti za procjenu ljudske poze na ulazu.

pip instaliraj imutils

Koristit ćete imutils za promjenu veličine video ulaza na željenu širinu.

Uvezite tri biblioteke koje ste prethodno instalirali u svoje okruženje. To će omogućiti korištenje njihovih ovisnosti u projektu.

uvoz cv2
uvoz imutils
uvoz medijapipe kao mp

Zatim stvorite tri MediaPipe objekta i inicijalizirajte ih pomoću odgovarajućih funkcija. Koristit ćete mp.solutions.drawing_utilsfunction za crtanje različitih orijentira na ulazu. mp.solutions.drawing_styles za promjenu stilova u kojima se pojavljuju crteži orijentira i mp.solutions.pose koji je model koji ćete koristiti za prepoznavanje tih orijentira.

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

Izvođenje procjene ljudske poze

Detektiranje poze čovjeka je proces identifikacije njihove tjelesne orijentacije identificiranjem i klasificiranjem njihovih zglobova.

Deklariranje vaših varijabli

Deklarirajte varijable koje ćete koristiti za pohranjivanje broja sklekova, položaja ramena i laktova i video ulaza.

brojati = 0
položaj = Nijedan
cap = cv2.VideoCapture("v4.mp4")

Inicijalizirajte varijablu položaja na Ništa. Program će ga ažurirati ovisno o položaju laktova i ramena.

Pozovite MediaPipe model procjene poze koji će otkriti ljudsku pozu u unosu.

s mp_poza. Poza(
min_pouzdanost_otkrivanja = 0.7,
min_tracking_confidence = 0.7) kao poza:

Inicijalizacije pouzdanosti otkrivanja i pouzdanosti praćenja predstavljaju razinu točnosti koju trebate od modela. 0,7 je slično 70% točnosti. Možete ga promijeniti na željenu razinu.

Uzimanje i pretprocesiranje ulaza

Uzmite unos koji ćete kasnije proslijediti modelu procjene poze. Promijenite veličinu širine video ulaza pomoću biblioteke imutils. Pretvorite ulaz iz BGR u RGB jer MediaPipe radi samo s RGB ulazom. Na kraju, proslijedite konvertirani unos u model procjene ljudske poze kako biste identificirali orijentire.

dok cap.isOpened():
uspjeh, image=cap.read()

akone uspjeh:
ispis("prazna kamera")
pauza

slika = imutils.resize (slika, širina=500)
slika = cv2.cvtColor (cv2.flip (slika, 1), cv2.COLOR_BGR2RGB)
rezultat = pose.proces (slika)

Nakon obrade unosa, identificirali ste orijentire na unosu.

Crtanje identificiranih orijentira na ulazu

Napravite prazan popis koji će pohraniti koordinate svakog orijentira. Koristite klasu draw_landmarks da nacrtate točku na svakom orijentiru i veze između njih. Koristeći for petlju, iterirajte preko orijentira i pohranite ID i koordinate svakog orijentira na popis koji ste stvorili. Koristite klasu image.shape za izračun širine i visine video ulaza.

lmList = []

ako result.pose_landmarks:
# Crta točke orijentira i povezuje ih
mp_draw.draw_landmarks (slika, result.pose_landmarks,
mp_poza. POSE_CONNECTIONS)

za id, im u nabroji (result.pose_landmarks.landmark):
# Pronalaženje duljine i širine video ulaza
h, w, _ = slika.oblik

# Pronalaženje točnih koordinata točaka tijela
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

ID je broj koji model procjene poze MediaPipe daje određenom orijentiru. Nakon što ste identificirali pozu čovjeka u unosu, morate izbrojati broj sklekova koje radi, ako ih ima.

Brojanje broja sklekova

Stvorite stanje koje provjerava položaj ramena u odnosu na položaj laktova. Kada su ramena osobe u ulazu viša od laktova, osoba je podignuta. Kada su ramena niža od laktova, osoba je dolje. To možete provjeriti usporedbom ID-ova orijentira ramena s orijentirima laktova.

# Provjera postoje li identificirani orijentiri
ako len (lmList) != 0:
# Uvjet koji identificira donji položaj
ako (lmList[12][2] i lmList[11][2] >= lmList[14][2] i lmList[13][2]):
položaj = "dolje"

# Uvjet koji identificira gornji položaj
ako (lmList[12][2] i lmList[11][2] <= lmList[14][2] i lmList[13][2])
i položaj == "dolje":
položaj = "gore"
brojati +=1

Da bi osoba dovršila jedan puni sklek, mora zauzeti donji položaj i zatim se vratiti u gornji položaj. Nakon potpunog skleka, program može ažurirati broj za jedan.

Prikaz izlaza

Morate prikazati broj sklekova koje je program izbrojao. Ispišite vrijednost brojanja na terminalu, svaki put kada korisnik napravi cijeli sklek. Na kraju, prikažite rezultat osobe koja radi sklekove s orijentirima nacrtanim na tijelu.

 ispisati (brojiti)

cv2.imshow("Brojač sklekova", cv2.flip (slika, 1))
ključ = cv2.waitKey(1)

# Program se prekida kada se pritisne q
ako ključ == red('q'):
pauza

cap.release()

Izlaz bi trebao izgledati otprilike ovako:

Trebali biste pratiti ažuriranje na terminalu dok osoba na izlazu radi potpuni sklek.

Ojačajte svoje vještine računalnog vida

Računalni vid je širok. Brojač sklekova jedan je od mnogih projekata koje možete koristiti da svoje vještine računalnog vida primijenite u praksi. Najbolji način za jačanje ovih vještina je izgradnja više projekata koji uključuju računalni vid.

Što više projekata izgradite, više ćete naučiti!