Puteți folosi multe proiecte pentru a vă consolida abilitățile în viziunea computerizată și Python. Unul dintre aceste proiecte este crearea unui contor simplu push-up folosind Python. Puteți scrie programul acestui proiect într-un singur fișier.
Programul va prelua o intrare video sau o intrare în timp real de la o cameră, va efectua estimarea poziției umane pe intrare și va număra numărul de flotări pe care persoana le face. Pentru a efectua estimarea pozitiei umane, programul va folosi modelul de estimare a pozitiei umane MediaPipe.
Este un model dezvoltat de Google care urmărește treizeci și trei de repere ale corpului uman. De asemenea, prezice o segmentare a întregului corp pe care o reprezintă ca o segmentare cu două clase. Următoarea imagine arată toate reperele pe care modelul este capabil să le identifice. Punctele numerotate identifică fiecare reper și se conectează între ele prin linii.
Programul dvs. de contor de flotări va utiliza pozițiile umerilor și ale coatelor. În imaginea de mai sus, reperele umărului sunt 11 și 12, în timp ce reperele cotului sunt 13 și 14.
Configurarea mediului
Ar trebui să fii deja familiarizat elementele de bază ale Python. Deschideți un IDE Python și creați un nou fișier Python. Rulați următoarea comandă pe terminal pentru a instala pachetele respective în mediul dvs.:
pip instalează OpenCV-Python
Veți folosi OpenCV-Python pentru a prelua intrarea video în programul dvs. și a o procesa. Această bibliotecă vă oferă programul capabilități de viziune computerizată.
pip instalează MediaPipe
Veți folosi MediaPipe pentru a efectua estimarea poziției umane pe intrare.
pip install imutils
Veți folosi imutils pentru a redimensiona intrarea video la lățimea dorită.
Importați cele trei biblioteci pe care le-ați instalat anterior în mediul dvs. Acest lucru va face posibilă utilizarea dependențelor lor în proiect.
import cv2
import imutils
import mediapipe la fel de mp
Apoi creați trei obiecte MediaPipe și inițializați-le folosind funcțiile respective. Veți folosi mp.solutions.drawing_utilsfunction pentru a desena diferitele repere pe intrare. mp.solutions.drawing_styles pentru a schimba stilurile în care apar desenele reperelor și mp.solutions.pose care este modelul pe care îl veți folosi pentru a identifica aceste repere.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
Efectuarea estimării poziției umane
Detectarea posturii unui om este procesul de identificare a orientării corpului său prin identificarea și clasificarea articulațiilor.
Declararea variabilelor dvs
Declarați variabilele pe care le veți folosi pentru a stoca numărul de flotări, poziția umerilor și a coatelor și intrarea video.
numără = 0
pozitia = Nici unul
capac = cv2.VideoCapture(„v4.mp4”)
Inițializați variabila de poziție la Nimic. Programul il va actualiza in functie de pozitia coatelor si umerilor.
Apelați modelul de estimare a poziției MediaPipe care va detecta poziția umană în intrare.
cu mp_pose. Poza (
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) la fel de poza:
Inițializările încrederii de detecție și încrederii de urmărire reprezintă nivelul de precizie de care aveți nevoie de la model. 0,7 este similar cu o precizie de 70%. Îl poți schimba la nivelul dorit.
Preluarea și preprocesarea intrării
Luați intrarea pe care o veți trece ulterior modelului de estimare a poziției. Redimensionați lățimea intrării video folosind biblioteca imutils. Convertiți intrarea din BGR în RGB, deoarece MediaPipe funcționează numai cu intrare RGB. În cele din urmă, treceți intrarea convertită la modelul de estimare a poziției umane pentru a identifica reperele.
in timp ce cap.isOpened():
succes, imagine=cap.read()dacănu succes:
imprimare("camera goala")
pauză
imagine = imutils.resize (imagine, width=500)
imagine = cv2.cvtColor (cv2.flip (imagine, 1), cv2.COLOR_BGR2RGB)
rezultat = pose.process (imagine)
După procesarea intrării, ați identificat reperele pe intrare.
Desenarea reperelor identificate pe intrare
Creați o listă goală care va stoca coordonatele fiecărui reper. Utilizați clasa draw_landmarks pentru a desena un punct pe fiecare reper și conexiunile dintre ele. Folosind o buclă for, repetați peste repere și stocați ID-ul și coordonatele fiecărui reper în lista pe care ați creat-o. Utilizați clasa image.shape pentru a calcula lățimea și înălțimea intrării video.
lmList = []
dacă result.pose_landmarks:
# Desenează punctele reperelor și le conectează
mp_draw.draw_landmarks (imagine, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)pentru id, im în enumera (result.pose_landmarks.landmark):
# Găsirea lungimii și lățimii intrării video
h, w, _ = imagine.formă
# Găsirea coordonatelor exacte ale punctelor corpului
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])
ID-ul este numărul dat unui reper specific de către modelul de estimare a poziției MediaPipe. După ce ați identificat poziția omului în intrare, trebuie să numărați numărul de flotări pe care le fac, dacă este cazul.
Numărarea numărului de flotări
Creați o condiție care să verifice poziția umerilor față de poziția coatelor. Când umerii persoanei din intrare sunt mai sus decât coatele, persoana este sus. Când umerii sunt mai jos decât coatele, persoana este în jos. Verificați acest lucru comparând ID-urile reperelor umerilor cu cele ale reperelor coatelor.
# Verificarea dacă există repere identificate
dacă len (lmList) != 0:
# Condiție care identifică poziția în jos
dacă (lmList[12][2] și lmList[11][2] >= lmList[14][2] și lmList[13][2]):
pozitia = "jos"
# Condiție care identifică poziția sus
dacă (lmList[12][2] și lmList[11][2] <= lmList[14][2] și lmList[13][2])
și pozitia == "jos":
pozitia = "sus"
numără +=1
Pentru ca o persoană să efectueze o împingere completă, trebuie să-și asume o poziție în jos și apoi să revină în poziția sus. După o împingere completă, programul poate actualiza numărul cu unul.
Afișarea ieșirii
Trebuie să afișați numărul de flotări pe care le-a numărat programul. Tipăriți valoarea numărării pe terminal, de fiecare dată când utilizatorul face o împingere completă. În cele din urmă, afișați rezultatul persoanei care face flotări cu reperele desenate pe corp.
imprimare (numărare)
cv2.imshow(„Contor push-up”, cv2.flip (imagine, 1))
cheie = cv2.waitKey(1)# Programul se încheie când este apăsat q
dacă cheie == ord('q'):
pauză
cap.release()
Ieșirea ar trebui să arate cam așa:
Ar trebui să observați o actualizare a terminalului, deoarece persoana de pe ieșire face un push-up complet.
Întăriți-vă abilitățile de viziune pe computer
Viziunea computerizată este largă. Un contor de push-up este unul dintre numeroasele proiecte pe care le puteți folosi pentru a vă pune în practică abilitățile de viziune pe computer. Cea mai bună modalitate de a consolida aceste abilități este construirea mai multor proiecte care implică viziunea computerizată.
Cu cât vei construi mai multe proiecte, cu atât vei învăța mai multe!