Arvutinägemise ja Pythoni alaste oskuste tugevdamiseks saate kasutada paljusid projekte. Üks neist projektidest on Pythoni abil lihtsa push-up loenduri loomine. Saate selle projekti programmi kirjutada ühes failis.
Programm võtab kaamerast videosisendi või reaalajas sisendi, hindab sisendil inimese poosi ja loendab inimese tehtud kätekõverduste arvu. Inimese poseerimise hindamiseks kasutab programm MediaPipe'i inimese poosi hindamise mudelit.
See on Google'i välja töötatud mudel, mis jälgib inimkehal kolmekümne kolme maamärki. Samuti ennustab see kogu keha segmenteerimist, mida see esindab kahe klassi segmentatsioonina. Järgmisel pildil on näidatud kõik orientiirid, mida mudel suudab tuvastada. Nummerdatud punktid tuvastavad iga maamärgi ja ühendavad üksteisega joontega.
Teie push-up loenduri programm kasutab õlgade ja küünarnukkide asendit. Ülaltoodud pildil on õlgade orientiirid 11 ja 12 ning küünarnuki orientiirid 13 ja 14.
Oma keskkonna seadistamine
Sa peaksid juba tuttav olema Pythoni põhitõed. Avage Pythoni IDE ja looge uus Pythoni fail. Vastavate pakettide installimiseks oma keskkonda käivitage terminalis järgmine käsk:
pip installi OpenCV-Python
Programmi videosisendi saamiseks ja selle töötlemiseks kasutate OpenCV-Pythonti. See raamatukogu annab teie programmi arvuti nägemise võimalused.
pip install MediaPipe
Kasutate MediaPipe'i, et hinnata sisendil inimese poosi.
pip install imutils
Videosisendi soovitud laiuse muutmiseks kasutate imutile.
Importige kolm teeki, mille olete varem oma keskkonda installinud. See võimaldab projektis kasutada nende sõltuvusi.
importida cv2
importida imutils
importida mediapipe nagu mp
Seejärel looge kolm MediaPipe'i objekti ja lähtestage need vastavate funktsioonide abil. Erinevate orientiiride joonistamiseks sisendile kasutate funktsiooni mp.solutions.drawing_utils. mp.solutions.drawing_styles, et muuta orientiiride jooniste stiile, ja mp.solutions.pose, mis on mudel, mida kasutate nende orientiiride tuvastamiseks.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
Inimese poosi hindamine
Inimese poosi tuvastamine on tema keha orientatsiooni tuvastamine liigeste tuvastamise ja klassifitseerimise teel.
Muutujate deklareerimine
Deklareerige muutujad, mida kasutate surumiste arvu, õlgade ja küünarnukkide asukoha ning videosisendi salvestamiseks.
arv = 0
asend = Mitte ühtegi
cap = cv2.VideoCapture("v4.mp4")
Muutke positsioonimuutuja väärtuseks Puudub. Programm värskendab seda sõltuvalt küünarnukkide ja õlgade asendist.
Kutsuge välja MediaPipe'i poosihinnangu mudel, mis tuvastab sisendis inimese poosi.
koos mp_pose. Pose (
min_tuvastuse_kindlus = 0.7,
min_jälgimise_kindlus = 0.7) nagu poos:
Tuvastamise usaldusväärsuse ja jälgimise usaldusväärsuse lähtestamine tähistab täpsuse taset, mida mudelilt vajate. 0,7 on sarnane 70% täpsusega. Saate seda soovitud tasemele muuta.
Sisendi võtmine ja eeltöötlus
Võtke sisend, mille edastate hiljem poosihinnangu mudelile. Muutke videosisendi laiust imutilsi teegi abil. Teisendage sisend BGR-st RGB-ks, kuna MediaPipe töötab ainult RGB-sisendiga. Lõpuks edastage teisendatud sisend maamärkide tuvastamiseks inimese poosi hindamise mudelile.
samal ajal cap.isOpened():
edu, image=cap.read()kuimitte edu:
print("tühi kaamera")
murda
pilt = imutils.resize (pilt, laius=500)
pilt = cv2.cvtColor (cv2.flip (pilt, 1), cv2.COLOR_BGR2RGB)
tulemus = pose.process (pilt)
Pärast sisendi töötlemist olete tuvastanud sisendil olevad orientiirid.
Identifitseeritud maamärkide joonistamine sisendile
Looge tühi loend, mis salvestab iga maamärgi koordinaadid. Kasutage joonistus_maamärgid klassi, et joonistada igale orientiirile ja nendevahelistele seostele punkt. Kasutage for-tsüklit, korrake üle orientiirid ning salvestage loodud loendisse iga maamärgi ID ja koordinaadid. Kasutage videosisendi laiuse ja kõrguse arvutamiseks klassi image.shape.
lmList = []
kui result.pose_landmarks:
# Joonistab maamärkide punktid ja ühendab need
mp_draw.draw_landmarks (pilt, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)jaoks id, im sisse loetlema (result.pose_landmarks.landmark):
# Videosisendi pikkuse ja laiuse leidmine
h, w, _ = pilt.kuju
# Kehapunktide täpsete koordinaatide leidmine
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])
ID on MediaPipe'i poosihinnangu mudeli poolt konkreetsele maamärgile antud number. Olles sisendis tuvastanud inimese poosi, peate loendama, kui palju ta kätekõverdusi teeb.
Push-Upside arvu loendamine
Loo tingimus, mis kontrollib õlgade asendit küünarnukkide asendi suhtes. Kui sisendis oleva inimese õlad on küünarnukkidest kõrgemal, on inimene püsti. Kui õlad on küünarnukkidest madalamal, on inimene maas. Saate seda kontrollida, võrreldes õlgade orientiiride ID-sid küünarnukkide orientiiride omadega.
# Kontrollimine, kas on tuvastatud orientiiri
kui len (lmList) != 0:
# Tingimus, mis tuvastab alumise positsiooni
kui (lmList[12][2] ja lmList[11][2] >= lmList[14][2] ja lmList[13][2]):
asend = "alla"
# Tingimus, mis tuvastab ülemise positsiooni
kui (lmList[12][2] ja lmList[11][2] <= lmList[14][2] ja lmList[13][2])
ja positsioon == "alla":
asend = "üles"
loe +=1
Selleks, et inimene saaks ühe täistõuke sooritada, peab ta võtma alla asendi ja seejärel tõusma tagasi üles. Pärast täielikku surumist saab programm loendust ühe võrra värskendada.
Väljundi kuvamine
Peate kuvama programmi poolt loendatud surumiste arvu. Printige loenduri väärtus terminalis iga kord, kui kasutaja teeb täieliku push-upi. Lõpuks kuvage kätekõverdusi tegeva inimese väljund koos tema kehale joonistatud orientiiridega.
print (loenda)
cv2.imshow("Push-up loendur", cv2.flip (pilt, 1))
võti = cv2.waitKey(1)# Programm lõpeb, kui vajutada q
kui klahv == ord('q'):
murda
cap.release()
Väljund peaks välja nägema umbes selline:
Peaksite jälgima terminali värskendust, kuna väljundis olev inimene teeb täieliku push-upi.
Tugevdage oma arvutinägemise oskusi
Arvuti nägemus on lai. Push-up loendur on üks paljudest projektidest, mille abil saate oma arvutinägemise oskusi praktikas rakendada. Parim viis nende oskuste tugevdamiseks on luua rohkem projekte, mis hõlmavad arvutinägemist.
Mida rohkem projekte ehitate, seda rohkem õpite!