Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius. Skaityti daugiau.

Rankų sekimas – tai kompiuterinės vizijos panaudojimo procesas, siekiant aptikti ir sekti žmogaus rankos judesius realiuoju laiku. Labiausiai dominuojantis rankinio sekimo pritaikymas yra virtualios realybės ausinės. Ausinės leidžia naudoti rankas kaip įvestį vietoj jutiklinių valdiklių. Tai savo ruožtu daro patirtį labiau įtraukianti.

Sužinokite, kaip sekti žmogaus rankas naudojant Python, OpenCV kompiuteriniam matymui ir MediaPipe.

„Google“ sukūrė „MediaPipe“ sistemą, kurioje yra daug mašininio mokymosi sprendimų. Vienas iš sprendimų yra rankų ir pirštų sekimo sprendimas „MediaPipe“ rankos. Norėdami sekti rankas, MediaPipe Hands atlieka du procesus: delno aptikimą ir orientyrų aptikimą.

Rankų delno aptikimas

„MediaPipe“ pradeda nustatyti, kur įvesties vaizde yra delnai. Kadangi kietų objektų ribojančius langelius įvertinti yra paprasčiau nei atpažinti rankas su sujungtais pirštais.

instagram viewer

Rankų orientyrų aptikimas

Po delno aptikimo MediaPipe atlieka orientyrų aptikimą rankomis. Rankinio orientyro modelis gali numatyti 21 tikslią kiekvieno orientyro vietos koordinatę.

Skaičiai žymi unikalų kiekvieno orientyro identifikatorių.

Aplinkos nustatymas

Norėdami tęsti šį projektą, turėtumėte būti susipažinę su Python pagrindai. Įdiekite šias bibliotekas savo aplinkoje:

  • OpenCV: šią biblioteką naudosite kompiuteriniam matymui ir įvesties vaizdo vaizdų apdorojimo technikoms atlikti.
  • „MediaPipe“: šią biblioteką naudosite norėdami aptikti ranką ir sekti įvesties vaizdą.
  • imutils: Ši biblioteka pakeis įvesties vaizdo kadro dydį.

Paleiskite šią komandą savo terminale, kad įdiegtumėte OpenCV, MediaPipe ir imutils bibliotekas. Įdiekite pip – Python paketų tvarkyklę– jei reikia. Įsitikinkite, kad perduodate bibliotekas kaip tarpais atskirtą sąrašą.

pip įdiegti OpenCV-Python MediaPipe imutils

Kai atnaujinimas bus baigtas, aplinka yra paruošta pradėti kodavimą.

Visas šio projekto šaltinio kodas yra jo GitHub saugykla.

Reikalingų bibliotekų importavimas

Turėsite importuoti įdiegtas bibliotekas, kad galėtumėte jas naudoti. Atidarykite bet kurį Python IDE, sukurkite Python failą ir pridėkite šiuos importuotus elementus:

importuoti cv2
importuoti mediapipe kaip mp
importuoti imutils

Įsitikinkite, kad importuojate OpenCV kaip cv2 ir MediaPipe mažosiomis raidėmis. Jei to nepadarysite, bus rodoma klaida.

Naudosite „mpHands“, kad iškviestumėte „MediaPipe“ rankų sprendimą, o rankos objektas aptiks ir stebės rankos įvestį. Naudosite objektą mpDraw, kad nubrėžtumėte identifikuotų rankų orientyrų ryšius.

mpHands = mp.solutions.hands
rankos = mpRankos. Rankos ()
mpDraw = mp.solutions.drawing_utils

Galite tiksliai sureguliuoti MediaPipe rankų modelį, perduodami įvairius parametrus Hands() konstruktoriui. Numatytosios reikšmės yra pakankamai geros šiam projektui, tačiau galite su jomis eksperimentuoti, kad pamatytumėte, kaip jos veikia modelį:

Turėtumėte palikti statinis_vaizdo_režimas kaip False, kad įsitikintų, jog modelis vieną kartą aptinka rankas prieš pradėdamas jas sekti. Sekimo procesas kartojamas tik tuo atveju, jei aptikimo patikimumas nukrenta žemiau deklaruoto parametro, todėl bendras įvesties apdorojimas yra greitesnis.

Rankų sekimo atlikimas

Norint sekti ranka, reikia trijų funkcijų: vienos – apdoroti įvestį, kitos – nubrėžti rankinio orientyro ryšius, o pagrindinės – programos srautui valdyti.

Įvesties apdorojimo funkcija

Ši funkcija paima įvestį, konvertuoja ją į pilkos spalvos tonus ir perduoda „MediaPipe“ rankų modeliui, kad būtų galima aptikti ir sekti rodykles įvestyje.

# Apdorojamas įvesties vaizdas
defproceso_vaizdas(img):
# Konvertuoti įvestį į pilkos spalvos tonus
gray_image = cv2.cvtColor (img, cv2.COLOR_BGR2RGB)
rezultatai = rankos.procesas (pilkas_vaizdas)

# Aptiktų rankų grąžinimas į skambinimo funkciją
grąžinti rezultatus

Funkcija grąžina rezultatus, ar įvestyje buvo aptiktos rankos.

Rankinio orientyro jungčių piešimo funkcija

Ši funkcija patikrina, ar įvesties apdorojimo funkcija aptiko rankas. Jei aptinkamos rankos, ji aplenkia kiekvieną orientyrą ir nubrėžia aplink jį apskritimą, stebėdama orientyrą naudodami Python surašymo funkcija. Tada jis nubrėžia ryšius tarp orientyrų pradinėje vaizdo įvestyje.

# Ryšių piešimas
defpiešti_rankos_jungtys(vaizdas, rezultatai):
jeigu results.multi_hand_landmarks:
dėl handLms in results.multi_hand_landmarks:
dėl id, lm in išvardinti (handLms.landmark):
h, w, c = img.shape

# Kiekvieno orientyro koordinačių radimas
cx, cy = int (lm.x * w), int (lm.y * h)

# Kiekvieno orientyro ID ir koordinačių spausdinimas
# terminale
spausdinti (id, cx, cy)

# Sukurkite apskritimą aplink kiekvieną orientyrą
cv2.circle (img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
# Nubrėžkite orientyrus ryšius
mpDraw.draw_landmarks (img, handLms,
mpHands. HAND_CONNECTIONS)

grąžinti img

Funkcija pradedama apibraukiant kiekvieną orientyrą:

Tada jis nubrėžia rankines jungtis:

Galiausiai jis grąžina savo išvestį į skambinimo funkciją.

Pagrindinė funkcija

Sukurkite pagrindinę funkciją, kuri valdys jūsų programos eigą. Tam reikės įvesties ir pakeisti vaizdo kadro dydį, kad būtų užtikrintas išvesties nuoseklumas. Perduokite įvestį apdorojimo funkcijai, kuri aptiks ir stebės rankas. Grąžintus rezultatus perkelkite į rankinio orientyrų ryšio piešimo funkciją, kuri nubrėžs ryšį pagal pradinę vaizdo įvestį. Galiausiai jis parodys išvestį vartotojui.

defpagrindinis():
# Pakeiskite 0 vaizdo įrašo keliu, kad galėtumėte naudoti a
# iš anksto įrašytas vaizdo įrašas
cap = cv2.VideoCapture(0)

kolTiesa:
# Priimama įvestis
sėkmė, vaizdas = cap.read()
vaizdas = imutils.resize (vaizdas, plotis =500, aukštis =500)
rezultatai = proceso_vaizdas (vaizdas)
draw_hand_connections (vaizdas, rezultatai)

# Rodomas išėjimas
cv2.imshow("Rankinis sekiklis", vaizdas)

# Programa baigiasi paspaudus q mygtuką
jeigu cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()

Paskutinis veiksmas yra programos paleidimas. Toliau pateiktas kodas užtikrina, kad paleidus programą pirmiausia būtų paleista pagrindinė funkcija.

jeigu __vardas__ == "__pagrindinis__":
pagrindinis ()

Kai programa paleidžiama, ji sukuria tokią išvestį:

Programa seka rankas realiu laiku.

Sekimas rankomis, kad būtų įtraukta virtuali realybė

Rankinis sekimas virtualioje realybėje daro technologiją patrauklesnę. Virtualios realybės ausinės pradėjo diegti rankinį sekimą, įnešdamos į virtualų pasaulį padidintos realybės jausmą. Ausinės leidžia vartotojui įvesti komandas naudojant virtualią ranką.

Rankų sekimas virtualiose ausinėse yra tik vienas šios technologijos pritaikymų. Galite įtraukti rankinį stebėjimą į bet kurią jums patinkančią sritį.