Je kunt veel projecten gebruiken om je vaardigheden in computervisie en Python te versterken. Een van deze projecten is het maken van een eenvoudige push-up-teller met behulp van Python. U kunt het programma van dit project in één bestand schrijven.
Het programma neemt een video-invoer of een real-time invoer van een camera, voert een schatting van de menselijke pose uit op de invoer en telt het aantal push-ups dat de persoon doet. Om de menselijke houding in te schatten, gebruikt het programma het MediaPipe-model voor de schatting van de menselijke houding.
Het is een door Google ontwikkeld model dat drieëndertig oriëntatiepunten op het menselijk lichaam volgt. Het voorspelt ook een segmentatie van het hele lichaam die het vertegenwoordigt als een segmentatie van twee klassen. De volgende afbeelding toont alle oriëntatiepunten die het model kan identificeren. Genummerde punten identificeren elk herkenningspunt en zijn met lijnen met elkaar verbonden.
Uw push-up counter-programma maakt gebruik van de posities van de schouders en de ellebogen. In de bovenstaande afbeelding zijn de schouderoriëntatiepunten 11 en 12, terwijl de elleboogoriëntatiepunten 13 en 14 zijn.
Uw omgeving instellen
Je zou al bekend moeten zijn met de basis van Python. Open een Python IDE en maak een nieuw Python-bestand aan. Voer de volgende opdracht uit op de terminal om de respectieve pakketten in uw omgeving te installeren:
pip installeer OpenCV-Python
U gebruikt OpenCV-Python om de video-invoer in uw programma te nemen en te verwerken. Deze bibliotheek geeft uw programma mogelijkheden voor computervisie.
pip installeer MediaPipe
Je gebruikt MediaPipe om menselijke pose-inschattingen uit te voeren op de input.
pip installeer imutils
U gebruikt imutils om de grootte van de video-invoer aan te passen aan de gewenste breedte.
Importeer de drie bibliotheken die u eerder in uw omgeving hebt geïnstalleerd. Dit maakt het mogelijk om hun afhankelijkheden in het project te gebruiken.
importeren cv2
importeren imutilaties
importeren mediapijp als mp
Maak vervolgens drie MediaPipe-objecten en initialiseer ze met de respectieve functies. U gebruikt mp.solutions.drawing_utilsfunction om de verschillende oriëntatiepunten op de invoer te tekenen. mp.solutions.drawing_styles om de stijlen te wijzigen waarin de tekeningen van de oriëntatiepunten verschijnen, en mp.solutions.pose, het model dat u gaat gebruiken om deze oriëntatiepunten te identificeren.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
De schatting van de menselijke houding uitvoeren
Het detecteren van de houding van een mens is het proces van het identificeren van hun lichaamsoriëntatie door hun gewrichten te identificeren en te classificeren.
Uw variabelen declareren
Declareer de variabelen die u gaat gebruiken om het aantal push-ups, de positie van de schouders en ellebogen en de video-invoer op te slaan.
tel = 0
positie = Geen
cap = cv2.VideoCapture("v4.mp4")
Initialiseer de positievariabele op Geen. Het programma zal het bijwerken afhankelijk van de positie van de ellebogen en schouders.
Roep het MediaPipe pose-schattingsmodel aan dat de menselijke pose in de invoer zal detecteren.
met mp_pose. Houding(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) als houding:
De initialisaties van de detectievertrouwen en trackingvertrouwen vertegenwoordigen het nauwkeurigheidsniveau dat u van het model nodig hebt. 0,7 komt overeen met een nauwkeurigheid van 70%. U kunt het naar uw gewenste niveau wijzigen.
De invoer opnemen en voorbewerken
Neem de invoer die u later doorgeeft aan het pose-schattingsmodel. Pas de breedte van de video-invoer aan met behulp van de imutils-bibliotheek. Converteer de invoer van BGR naar RGB, aangezien MediaPipe alleen met RGB-invoer werkt. Geef ten slotte de geconverteerde invoer door aan het schattingsmodel voor menselijke poses om de oriëntatiepunten te identificeren.
terwijl cap.isOpened():
succes, image=cap.read()alsniet succes:
afdrukken("lege camera")
pauze
afbeelding = imutils.formaat wijzigen (afbeelding, breedte=500)
afbeelding = cv2.cvtColor (cv2.flip (afbeelding, 1), cv2.COLOR_BGR2RGB)
resultaat = pose.proces (afbeelding)
Na het verwerken van de input heb je de oriëntatiepunten op de input geïdentificeerd.
De geïdentificeerde oriëntatiepunten op de invoer tekenen
Maak een lege lijst waarin de coördinaten van elk oriëntatiepunt worden opgeslagen. Gebruik de klasse draw_landmarks om een punt te tekenen op elk oriëntatiepunt en de verbindingen ertussen. Herhaal met een for-lus de oriëntatiepunten en sla de ID en coördinaten van elk oriëntatiepunt op in de lijst die u hebt gemaakt. Gebruik de klasse image.shape om de breedte en hoogte van de video-invoer te berekenen.
lmLijst = []
als resultaat.pose_landmarks:
# Tekent de oriëntatiepunten en verbindt ze
mp_draw.draw_landmarks (afbeelding, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)voor idd, im in opsommen (resultaat.pose_landmarks.landmark):
# De lengte en breedte van de video-invoer vinden
h, w, _ = afbeelding.vorm
# De exacte coördinaten van de lichaamspunten vinden
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])
De ID is het nummer dat aan een specifiek oriëntatiepunt wordt gegeven door het MediaPipe pose-schattingsmodel. Nadat je de pose van de mens in de invoer hebt geïdentificeerd, moet je het aantal push-ups tellen dat ze doen, indien van toepassing.
Het aantal push-ups tellen
Creëer een conditie die de positie van de schouders afzet tegen de positie van de ellebogen. Wanneer de schouders van de persoon in de ingang hoger zijn dan de ellebogen, staat de persoon rechtop. Wanneer de schouders lager zijn dan de ellebogen, is de persoon naar beneden. U controleert dit door de ID's van de oriëntatiepunten van de schouders te vergelijken met die van de oriëntatiepunten van de ellebogen.
# Controleren of er geïdentificeerde oriëntatiepunten zijn
als len (lmLijst) != 0:
# Voorwaarde die de neerwaartse positie identificeert
als (lmLijst[12][2] En lmLijst[11][2] >= lmLijst[14][2] En lmLijst[13][2]):
positie = "omlaag"
# Voorwaarde die de opwaartse positie identificeert
als (lmLijst[12][2] En lmLijst[11][2] <= lmLijst[14][2] En lmLijst[13][2])
En positie == "omlaag":
positie = "omhoog"
tel +=1
Om een volledige push-up te voltooien, moet een persoon een neerwaartse positie aannemen en vervolgens terugkeren naar de opwaartse positie. Na een volledige push-up kan het programma de telling met één bijwerken.
De uitvoer weergeven
U moet het aantal push-ups weergeven dat het programma heeft geteld. Druk de waarde van de telling af op de terminal, elke keer dat de gebruiker een volledige push-up doet. Geef ten slotte de output weer van de persoon die push-ups doet met de oriëntatiepunten op zijn lichaam getekend.
afdrukken (tellen)
cv2.imshow("Push-up teller", cv2.flip (afbeelding, 1))
sleutel = cv2.waitKey(1)# Het programma wordt beëindigd wanneer op q wordt gedrukt
als toets == volgorde('Q'):
pauze
cap.release()
De uitvoer zou er ongeveer zo uit moeten zien:
U zou een update op de terminal moeten observeren terwijl de persoon op de uitgang een volledige push-up doet.
Versterk uw computervisievaardigheden
Computervisie is breed. Een push-up counter is een van de vele projecten die u kunt gebruiken om uw computervisievaardigheden in de praktijk te brengen. De beste manier om deze vaardigheden te versterken, is door meer projecten te bouwen waarbij computervisie betrokken is.
Hoe meer projecten je bouwt, hoe meer je leert!