Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

Na posilnenie svojich zručností v počítačovom videní a Pythone môžete použiť mnoho projektov. Jedným z týchto projektov je vytvorenie jednoduchého push-up počítadla pomocou Pythonu. Program tohto projektu môžete napísať do jedného súboru.

Program vezme video vstup alebo vstup v reálnom čase z kamery, vykoná odhad ľudskej pozície na vstupe a spočíta počet klikov, ktoré osoba robí. Na vykonanie odhadu ľudskej polohy program použije model odhadu ľudskej polohy MediaPipe.

Ide o model vyvinutý spoločnosťou Google, ktorý sleduje tridsaťtri orientačných bodov na ľudskom tele. Tiež predpovedá segmentáciu celého tela, ktorú predstavuje ako segmentáciu dvoch tried. Nasledujúci obrázok zobrazuje všetky orientačné body, ktoré je model schopný identifikovať. Očíslované body identifikujú každý orientačný bod a navzájom sa spájajú čiarami.

Obrazový kredit: MediaPipe/GitHub
instagram viewer

Váš program push-up counter bude využívať pozície ramien a lakťov. Na obrázku vyššie sú značky na ramenách 11 a 12, zatiaľ čo značky na lakťoch sú 13 a 14.

Nastavenie vášho prostredia

Už by ste mali byť oboznámení základy Pythonu. Otvorte Python IDE a vytvorte nový Python súbor. Spustite nasledujúci príkaz na termináli a nainštalujte príslušné balíky do vášho prostredia:

pip nainštalovať OpenCV-Python

OpenCV-Python použijete na to, aby ste vzali video vstup do svojho programu a spracovali ho. Táto knižnica poskytuje váš program schopnosti počítačového videnia.

pip nainštalovať MediaPipe

Na vykonanie odhadu ľudskej pozície na vstupe použijete MediaPipe.

pip install imutils

Na zmenu veľkosti video vstupu na požadovanú šírku použijete imutils.

Importujte tri knižnice, ktoré ste predtým nainštalovali do svojho prostredia. To umožní využiť ich závislosti v projekte.

importovať cv2
importovať imutils
importovať mediapipe ako t.t

Potom vytvorte tri objekty MediaPipe a inicializujte ich pomocou príslušných funkcií. Na kreslenie rôznych orientačných bodov na vstupe použijete funkciu mp.solutions.drawing_utils. mp.solutions.drawing_styles, ak chcete zmeniť štýly, v ktorých sa zobrazujú kresby orientačných bodov, a mp.solutions.pose, čo je model, ktorý použijete na identifikáciu týchto orientačných bodov.

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

Vykonanie odhadu ľudskej pozície

Detekcia pozície človeka je proces identifikácie ich telesnej orientácie identifikáciou a klasifikáciou ich kĺbov.

Deklarovanie vašich premenných

Deklarujte premenné, ktoré použijete na uloženie počtu klikov, polohy ramien a lakťov a video vstupu.

počítať = 0
pozícia = žiadne
cap = cv2.VideoCapture("v4.mp4")

Inicializujte premennú polohy na hodnotu Žiadne. Program ho aktualizuje v závislosti od polohy lakťov a ramien.

Zavolajte model odhadu pozície MediaPipe, ktorý vo vstupe zistí ľudskú pózu.

s mp_pose. Póza(
min_detekcia_dôvera = 0.7,
min_tracking_dôvera = 0.7) ako póza:

Inicializácie spoľahlivosti detekcie a spoľahlivosti sledovania predstavujú úroveň presnosti, ktorú od modelu potrebujete. 0,7 je podobná presnosti 70 %. Môžete ho zmeniť na požadovanú úroveň.

Prevzatie a predbežné spracovanie vstupu

Vezmite vstup, ktorý neskôr prenesiete do modelu odhadu pozície. Zmeňte veľkosť šírky video vstupu pomocou knižnice imutils. Preveďte vstup z BGR na RGB, pretože MediaPipe funguje iba so vstupom RGB. Nakoniec odovzdajte konvertovaný vstup do modelu odhadu ľudskej polohy, aby ste identifikovali orientačné body.

zatiaľ čo cap.isOpened():
úspech, image=cap.read()

aknie úspech:
vytlačiť ("prázdny fotoaparát")
prestávka

image = imutils.resize (obrázok, šírka=500)
image = cv2.cvtColor (cv2.flip (obrázok, 1), cv2.COLOR_BGR2RGB)
výsledok = pose.process (obrázok)

Po spracovaní vstupu ste identifikovali orientačné body na vstupe.

Kreslenie identifikovaných orientačných bodov na vstupe

Vytvorte prázdny zoznam, v ktorom budú uložené súradnice každého orientačného bodu. Pomocou triedy draw_landmarks nakreslite bodku na každý orientačný bod a spojenie medzi nimi. Pomocou cyklu for iterujte cez orientačné body a uložte ID a súradnice každého orientačného bodu do zoznamu, ktorý ste vytvorili. Na výpočet šírky a výšky video vstupu použite triedu image.shape.

lmList = []

ak result.pose_landmarks:
# Nakreslí body orientačných bodov a spojí ich
mp_draw.draw_landmarks (obrázok, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

pre id, im v enumerate (result.pose_landmarks.landmark):
# Nájdenie dĺžky a šírky video vstupu
v, š, _ = obraz.tvar

# Nájdenie presných súradníc bodov tela
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

ID je číslo priradené konkrétnemu orientačnému bodu modelom odhadu pozície MediaPipe. Po identifikácii pozície človeka vo vstupe musíte spočítať počet klikov, ktoré robia, ak nejaké sú.

Počítanie počtu klikov

Vytvorte stav, ktorý kontroluje polohu ramien oproti polohe lakťov. Keď sú ramená osoby na vstupe vyššie ako lakte, osoba je hore. Keď sú ramená nižšie ako lakte, človek je dole. Overíte si to porovnaním ID orientačných bodov na ramenách s ID orientačných bodov na lakťoch.

# Kontrola, či existujú nejaké identifikované orientačné body
ak len (lmList) != 0:
# Stav, ktorý identifikuje spodnú polohu
ak (lmList[12][2] a lmList[11][2] >= lmList[14][2] a lmList[13][2]):
pozícia = "dole"

# Stav, ktorý identifikuje hornú polohu
ak (lmList[12][2] a lmList[11][2] <= lmList[14][2] a lmList[13][2])
a pozícia == "dole":
pozícia = "hore"
počítať +=1

Aby osoba dokončila jeden úplný klik, musí zaujať polohu dole a potom sa vrátiť do hornej polohy. Po úplnom stlačení môže program aktualizovať počet o jeden.

Zobrazenie výstupu

Musíte zobraziť počet klikov, ktoré program napočítal. Vytlačte hodnotu počtu na terminál vždy, keď používateľ urobí úplný klik. Nakoniec zobrazte výstup osoby, ktorá robí kliky, s orientačnými bodmi nakreslenými na jej tele.

 vytlačiť (počítať)

cv2.imshow("Počítadlo push-up", cv2.flip (obrázok, 1))
kľúč = cv2.waitKey(1)

# Program sa ukončí stlačením q
ak kľúč == ord('q'):
prestávka

cap.release()

Výstup by mal vyzerať asi takto:

Mali by ste sledovať aktualizáciu na termináli, pretože osoba na výstupe urobí úplný klik.

Posilnite svoje počítačové videnie

Počítačové videnie je široké. Push-up pult je jedným z mnohých projektov, ktoré môžete použiť na to, aby ste svoje zručnosti v oblasti počítačového videnia uplatnili v praxi. Najlepší spôsob, ako posilniť tieto zručnosti, je vybudovať viac projektov, ktoré zahŕňajú počítačové videnie.

Čím viac projektov postavíte, tým viac sa naučíte!