Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision. Läs mer.

Du kan använda många projekt för att stärka dina färdigheter i datorseende och Python. Ett av dessa projekt är att skapa en enkel push-up-räknare med Python. Du kan skriva detta projekts program i en enda fil.

Programmet kommer att ta en videoingång eller en realtidsinmatning från en kamera, utföra uppskattning av mänsklig pose på ingången och räkna antalet armhävningar personen gör. För att utföra uppskattning av den mänskliga poseringen kommer programmet att använda MediaPipes modell för uppskattning av den mänskliga poseringen.

Det är en modell utvecklad av Google som spårar trettiotre landmärken på människokroppen. Den förutsäger också en helkroppssegmentering som den representerar som en tvåklassig segmentering. Följande bild visar alla landmärken som modellen kan identifiera. Numrerade punkter identifierar varje landmärke och ansluter till varandra med linjer.

instagram viewer
Bildkredit: MediaPipe/GitHub

Ditt push-up counter-program kommer att använda positionerna för axlarna och armbågarna. I bilden ovan är axelns landmärken 11 och 12 medan armbågens landmärken är 13 och 14.

Ställa in din miljö

Du borde redan vara bekant med grunderna i Python. Öppna en Python IDE och skapa en ny Python-fil. Kör följande kommando på terminalen för att installera respektive paket på din miljö:

pip installera OpenCV-Python

Du kommer att använda OpenCV-Python för att ta videoingången i ditt program och bearbeta den. Detta bibliotek ger ditt program datorseende.

pip installera MediaPipe

Du kommer att använda MediaPipe för att utföra uppskattning av mänsklig pose på ingången.

pip installera imutils

Du kommer att använda imutils för att ändra storlek på videoingången till önskad bredd.

Importera de tre biblioteken som du tidigare installerat i din miljö. Detta kommer att göra det möjligt att använda deras beroenden i projektet.

importera cv2
importera imutils
importera mediapipe som smp

Skapa sedan tre MediaPipe-objekt och initiera dem med hjälp av respektive funktioner. Du kommer att använda mp.solutions.drawing_utilsfunction för att rita de olika landmärkena på ingången. mp.solutions.drawing_styles för att ändra stilarna där ritningarna av landmärkena visas, och mp.solutions.pose som är modellen du kommer att använda för att identifiera dessa landmärken.

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

Utföra uppskattningen av den mänskliga ställningen

Att upptäcka en människas ställning är processen att identifiera deras kroppsorientering genom att identifiera och klassificera deras leder.

Deklarera dina variabler

Deklarera de variabler du kommer att använda för att lagra antalet armhävningar, positionen för axlar och armbågar och videoingången.

räkna = 0
position = Ingen
cap = cv2.VideoCapture("v4.mp4")

Initiera positionsvariabeln till Ingen. Programmet kommer att uppdatera det beroende på positionen för armbågar och axlar.

Ring uppskattningsmodellen för MediaPipe posering som kommer att upptäcka den mänskliga poseringen i ingången.

med mp_pose. Utgör(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) som utgör:

Initieringarna av detektionsförtroendet och spårningsförtroendet representerar den nivå av noggrannhet du behöver från modellen. 0,7 liknar 70 % noggrannhet. Du kan ändra den till önskad nivå.

Ta och förbearbeta indata

Ta ingången som du senare kommer att skicka till modellen för poseskattning. Ändra storlek på videoingångens bredd med hjälp av imutils-biblioteket. Konvertera indata från BGR till RGB eftersom MediaPipe endast fungerar med RGB-ingång. Skicka slutligen den konverterade ingången till den mänskliga poseuppskattningsmodellen för att identifiera landmärkena.

medan cap.isOpened():
framgång, image=cap.read()

ominte Framgång:
skriva ut("tom kamera")
ha sönder

image = imutils.resize (bild, bredd=500)
bild = cv2.cvtColor (cv2.flip (bild, 1), cv2.COLOR_BGR2RGB)
resultat = pose.process (bild)

Efter bearbetning av inmatningen har du identifierat landmärkena på inmatningen.

Rita de identifierade landmärkena på ingången

Skapa en tom lista som lagrar koordinaterna för varje landmärke. Använd klassen draw_landmarks för att rita en prick på varje landmärke och kopplingarna mellan dem. Använd en for-loop, iterera över landmärkena och lagra ID och koordinater för varje landmärke i listan du skapade. Använd klassen image.shape för att beräkna bredd och höjd på videoingången.

lmList = []

om result.pose_landmarks:
# Ritar landmärkens punkter och kopplar ihop dem
mp_draw.draw_landmarks (image, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

för id, im i enumerate (result.pose_landmarks.landmark):
# Hitta längden och bredden på videoingången
h, w, _ = bild.form

# Hitta de exakta koordinaterna för kroppspunkterna
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

ID: t är numret som ges till ett specifikt landmärke av MediaPipes poseuppskattningsmodell. Efter att ha identifierat ställningen för människan i inmatningen måste du räkna antalet armhävningar de gör om några.

Räknar antalet armhävningar

Skapa ett tillstånd som kontrollerar axlarnas position mot armbågarnas position. När axlarna på personen i ingången är högre än armbågarna är personen uppe. När axlarna är lägre än armbågarna är personen nere. Du kontrollerar detta genom att jämföra ID: n för axlarnas landmärken med dem för armbågarnas landmärken.

# Kontrollera om det finns några identifierade landmärken
om len (lmList) != 0:
# Tillstånd som identifierar nedläget
om (lmList[12][2] och lmList[11][2] >= lmList[14][2] och lmList[13][2]):
position = "ner"

# Tillstånd som identifierar den övre positionen
om (lmList[12][2] och lmList[11][2] <= lmList[14][2] och lmList[13][2])
och position == "ner":
position = "upp"
räkna +=1

För att en person ska kunna slutföra en hel armhävning måste de inta en nedre position och sedan komma tillbaka till upppositionen. Efter en fullständig push-up kan programmet uppdatera räkningen med en.

Visar utdata

Du måste visa antalet armhävningar som programmet har räknat. Skriv ut värdet på räkningen på terminalen, varje gång användaren gör en komplett push-up. Till sist, visa resultatet från personen som gör armhävningar med landmärkena ritade på kroppen.

 skriva ut (räkna)

cv2.imshow("Push-up-räknare", cv2.flip (bild, 1))
nyckel = cv2.waitKey(1)

# Programmet avslutas när q trycks ned
om nyckel == ord('q'):
ha sönder

cap.release()

Utgången ska se ut ungefär så här:

Du bör observera en uppdatering på terminalen eftersom personen på utgången gör en komplett push-up.

Stärk din datorseende

Datorsynen är bred. En push-up-disk är ett av de många projekt du kan använda för att omsätta dina datorseende färdigheter i praktiken. Det bästa sättet att stärka dessa färdigheter är att bygga fler projekt som involverar datorseende.

Ju fler projekt du kommer att bygga, desto mer lär du dig!