Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

K posílení svých dovedností v počítačovém vidění a Pythonu můžete využít mnoho projektů. Jedním z těchto projektů je vytvoření jednoduchého push-up počítadla pomocí Pythonu. Program tohoto projektu můžete napsat do jednoho souboru.

Program vezme video vstup nebo vstup v reálném čase z kamery, provede odhad lidské pozice na vstupu a spočítá počet kliků, které osoba dělá. K provedení odhadu lidské pozice bude program používat model odhadu lidské pozice MediaPipe.

Jde o model vyvinutý společností Google, který sleduje třicet tři orientačních bodů na lidském těle. Také předpovídá celotělovou segmentaci, kterou představuje jako dvoutřídní segmentaci. Následující obrázek ukazuje všechny orientační body, které je model schopen identifikovat. Očíslované body identifikují každý orientační bod a spojují se navzájem čarami.

Obrazový kredit: MediaPipe/GitHub
instagram viewer

Váš program push-up counter bude využívat pozice ramen a loktů. Na obrázku nahoře jsou značky ramen 11 a 12, zatímco značky loktů jsou 13 a 14.

Nastavení vašeho prostředí

Už byste měli být obeznámeni základy Pythonu. Otevřete IDE Python a vytvořte nový soubor Pythonu. Spuštěním následujícího příkazu na terminálu nainstalujte příslušné balíčky do vašeho prostředí:

pip nainstalovat OpenCV-Python

Budete používat OpenCV-Python, abyste vzali video vstup do vašeho programu a zpracovali ho. Tato knihovna poskytuje váš program schopnosti počítačového vidění.

pip nainstalovat MediaPipe

K provedení odhadu lidské pozice na vstupu použijete MediaPipe.

pip install imutils

Pro změnu velikosti video vstupu na požadovanou šířku použijete imutils.

Importujte tři knihovny, které jste dříve nainstalovali do svého prostředí. To umožní využít jejich závislosti v projektu.

import cv2
import imutils
import mediapipe tak jako t.t

Poté vytvořte tři objekty MediaPipe a inicializujte je pomocí příslušných funkcí. K vykreslení různých orientačních bodů na vstupu použijete funkci mp.solutions.drawing_utils. mp.solutions.drawing_styles pro změnu stylů, ve kterých se zobrazují kresby orientačních bodů, a mp.solutions.pose, což je model, který budete používat k identifikaci těchto orientačních bodů.

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

Provádění odhadu lidské pozice

Detekce pozice člověka je proces identifikace jeho tělesné orientace pomocí identifikace a klasifikace jeho kloubů.

Deklarace vašich proměnných

Deklarujte proměnné, které použijete k uložení počtu kliků, polohy ramen a loktů a video vstupu.

počítat = 0
pozice = Žádný
cap = cv2.VideoCapture("v4.mp4")

Inicializujte proměnnou pozice na hodnotu Žádná. Program jej aktualizuje v závislosti na poloze loktů a ramen.

Zavolejte model odhadu pozice MediaPipe, který ve vstupu zjistí lidskou pozici.

s mp_pose. Póza(
min_detekce_důvěra = 0.7,
min_tracking_dôvera = 0.7) tak jako póza:

Inicializace spolehlivosti detekce a spolehlivosti sledování představují úroveň přesnosti, kterou od modelu potřebujete. 0,7 je podobná 70% přesnosti. Můžete ji změnit na požadovanou úroveň.

Převzetí a předběžné zpracování vstupu

Vezměte vstup, který později předáte do modelu odhadu pozice. Změňte velikost šířky video vstupu pomocí knihovny imutils. Převeďte vstup z BGR na RGB, protože MediaPipe pracuje pouze se vstupem RGB. Nakonec předejte převedený vstup do modelu odhadu lidské pozice k identifikaci orientačních bodů.

zatímco cap.isOpened():
úspěch, image=cap.read()

-line úspěch:
tisk("prázdný fotoaparát")
přestávka

image = imutils.resize (obrázek, šířka=500)
obrázek = cv2.cvtColor (cv2.flip (obrázek, 1), cv2.COLOR_BGR2RGB)
výsledek = pose.process (obrázek)

Po zpracování zadání jste identifikovali orientační body na vstupu.

Kreslení identifikovaných orientačních bodů na vstupu

Vytvořte prázdný seznam, do kterého budou uloženy souřadnice každého orientačního bodu. Pomocí třídy draw_landmarks nakreslete tečku na každý orientační bod a spojení mezi nimi. Pomocí smyčky for iterujte přes orientační body a uložte ID a souřadnice každého orientačního bodu do seznamu, který jste vytvořili. Pro výpočet šířky a výšky video vstupu použijte třídu image.shape.

lmList = []

-li result.pose_landmarks:
# Nakreslí body orientačních bodů a spojí je
mp_draw.draw_landmarks (obrázek, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

pro id, im v vyjmenovat (result.pose_landmarks.landmark):
# Zjištění délky a šířky video vstupu
v, š, _ = obraz.tvar

# Nalezení přesných souřadnic bodů těla
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

ID je číslo přidělené konkrétnímu orientačnímu bodu modelem odhadu pozice MediaPipe. Po identifikaci pozice člověka ve vstupu musíte spočítat počet kliků, které dělají, pokud vůbec nějaké.

Počítání počtu kliků

Vytvořte stav, který kontroluje polohu ramen vůči poloze loktů. Když jsou ramena osoby ve vstupu výše než lokty, osoba je nahoře. Když jsou ramena níže než lokty, je člověk dole. Zkontrolujete to porovnáním ID orientačních bodů na ramenou s identifikačními body na loktech.

# Kontrola, zda existují nějaké identifikované orientační body
-li len (lmList) != 0:
# Stav, který identifikuje spodní polohu
-li (lmList[12][2] a lmList[11][2] >= lmList[14][2] a lmList[13][2]):
pozice = "dolů"

# Stav, který identifikuje horní polohu
-li (lmList[12][2] a lmList[11][2] <= lmList[14][2] a lmList[13][2])
a pozice == "dolů":
pozice = "nahoru"
počítat +=1

Aby člověk dokončil jeden úplný klik, musí zaujmout polohu dolů a poté se vrátit do horní polohy. Po úplném stisknutí může program aktualizovat počet o jednu.

Zobrazení výstupu

Musíte zobrazit počet kliků, které program napočítal. Pokaždé, když uživatel provede úplný klik, vytiskněte na terminál hodnotu počtu. Nakonec zobrazte výstup osoby, která dělá kliky, s orientačními body nakreslenými na jejím těle.

 tisknout (počítat)

cv2.imshow("Počítadlo push-up", cv2.flip (obrázek, 1))
klíč = cv2.waitKey(1)

# Program se ukončí stisknutím q
-li klíč == ord('q'):
přestávka

cap.release()

Výstup by měl vypadat nějak takto:

Měli byste sledovat aktualizaci na terminálu, protože osoba na výstupu udělá úplný klik.

Posilte své počítačové vidění

Počítačové vidění je široké. Push-up counter je jedním z mnoha projektů, které můžete použít k tomu, abyste své dovednosti v oblasti počítačového vidění uplatnili v praxi. Nejlepší způsob, jak posílit tyto dovednosti, je vybudovat více projektů, které zahrnují počítačové vidění.

Čím více projektů postavíte, tím více se naučíte!