A kézkövetés az a folyamat, amikor számítógépes látást használnak egy személy kézmozdulatainak valós időben történő észlelésére és követésére. A kézi követés legdominánsabb alkalmazása a virtuális valóság fejhallgatóiban van. A fejhallgatók lehetővé teszik, hogy a kezét használd bemenetként az érintővezérlők helyett. Ez viszont még magával ragadóbbá teszi az élményt.
Ismerje meg, hogyan követheti nyomon egy személy kezét a Python, az OpenCV számítógépes látáshoz és a MediaPipe segítségével.
A Google kifejlesztette a MediaPipe keretrendszert, amely számos gépi tanulási megoldást tartalmaz. Az egyik megoldás az ún. kéz- és ujjkövető megoldás MediaPipe kezek. A kezek követéséhez a MediaPipe Hands két folyamatot hajt végre: tenyérérzékelést és tereptárgyak észlelését.
Kéztenyér érzékelés
A MediaPipe azzal kezdődik, hogy azonosítja, hol vannak a tenyér a bemeneti képen. Mivel a merev tárgyak határolókereteinek becslése egyszerűbb, mint az összeillesztett ujjakkal rendelkező kezek azonosítása.
Kézi tereptárgyak észlelése
A tenyérérzékelés után a MediaPipe végrehajtja a kézi tereptárgyak észlelését. A kézi tereptárgy-modell 21 pontos koordinátát képes megjósolni az egyes kézi tereptárgyak helyének.
A számok minden tereptárgy egyedi azonosítóját jelentik.
Környezetének beállítása
A projekt követéséhez ismernie kell a Python alapjai. Telepítse a következő könyvtárakat a környezetében:
- OpenCV: Ezt a könyvtárat számítógépes látáshoz és képfeldolgozási technikák végrehajtásához fogja használni a bemeneti képen.
- MediaPipe: Ezt a könyvtárat fogja használni a kézfelismerés és a bemeneti kép nyomon követésére.
- imutils: Ezzel a könyvtárral átméretezheti a bemenet videokockáját.
Futtassa a következő parancsot a terminálon az OpenCV, MediaPipe és imutils könyvtárak telepítéséhez. Telepítse a pip-et – a Python csomagkezelőt- ha kell. Győződjön meg róla, hogy szóközzel tagolt listaként adja át a könyvtárakat.
pip telepítése OpenCV-Python MediaPipe imutils
Amikor a frissítés befejeződött, a környezet készen áll a kódolás megkezdésére.
A projekt teljes forráskódja elérhető a GitHub adattár.
A szükséges könyvtárak importálása
Importálnia kell a telepített könyvtárakat, hogy használni tudja őket. Nyissa meg bármelyik Python IDE, hozzon létre egy Python-fájlt, és adja hozzá a következő importálásokat:
import cv2
import mediapipe mint mp
import imutilok
Győződjön meg róla, hogy az OpenCV-t cv2-ként és a MediaPipe-ot kisbetűvel importálja. Ennek elmulasztása hibát jelez.
Az mpHands segítségével hívhatja meg a MediaPipe kézi megoldást, a hands objektum pedig a kézi bemenet észlelésére és nyomon követésére. Az mpDraw objektum segítségével megrajzolhatja az azonosított kezek tereptárgyai közötti kapcsolatokat.
mpHands = mp.solutions.hands
kezek = mpHands. kezek ()
mpDraw = mp.solutions.drawing_utils
Finomhangolhatja a MediaPipe kezek modelljét, ha különféle paramétereket ad át a Hands() konstruktornak. Az alapértelmezett értékek elég jók ehhez a projekthez, de kísérletezhet velük, hogy megtudja, hogyan befolyásolják a modellt:
Hagynod kell a static_image_mode hamisként, hogy biztosítsa, hogy a modell egyszer észlelje a kezeket, mielőtt elkezdi követni őket. Csak akkor ismétli meg a követési folyamatot, ha az észlelési megbízhatóság alacsonyabb, mint a deklarált paraméter, ami gyorsabbá teszi a teljes bemeneti feldolgozást.
Kézkövetés végrehajtása
A kézi követés végrehajtásához három funkcióra van szükség: az egyik a bemenet feldolgozásához, a másik a kézi tereptárgyak kapcsolatainak megrajzolásához és egy fő funkció a programfolyamat vezérléséhez.
Bemeneti feldolgozási funkció
Ez a funkció átveszi a bemenetet, szürkeárnyalatossá alakítja, és átadja a MediaPipe kézi modellnek, hogy észlelje és nyomon kövesse a bemenetben lévő mutatókat.
# A bemeneti kép feldolgozása
defprocess_image(img):
# A bemenet átalakítása szürkeárnyalatossá
gray_image = cv2.cvtColor (img, cv2.COLOR_BGR2RGB)
eredmények = hands.process (gray_image)
# Az észlelt kezek visszaállítása hívó funkcióba
Visszatérés eredmények
A függvény visszaadja az eredményeket, hogy voltak-e észlelt kezek a bemeneten.
A Handmark Connections Rajz funkció
Ez a funkció ellenőrzi, hogy a beviteli feldolgozás funkció észlelt-e kezet. Ha észlelt kezek vannak, minden tereptárgyon átfordul, és kört rajzol körülötte, nyomon követve a tereptárgyat a A Python felsorolás funkciója. Ezután megrajzolja a kapcsolatokat az eredeti videobemeneten lévő tereptárgyak között.
# Mérföldkőnek számító kapcsolatok rajzolása
defdraw_hand_connections(kép, eredmények):
ha results.multi_hand_landmarks:
számára handLms ban ben results.multi_hand_landmarks:
számára id, lm ban ben felsorol (handLms.landmark):
h, w, c = img.shape# Az egyes tereptárgyak koordinátáinak megkeresése
cx, cy = int (lm.x * w), int (lm.y * h)# Minden tereptárgy azonosítójának és koordinátájának kinyomtatása
# a terminálon
nyomtatás (id, cx, cy)# Kör létrehozása minden tereptárgy körül
cv2.circle (img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
# A mérföldkőnek számító kapcsolatok megrajzolása
mpDraw.draw_landmarks (img, handLms,
mpHands. HAND_CONNECTIONS)
Visszatérés img
A funkció az egyes tereptárgyak bekarikázásával kezdődik:
Ezután megrajzolja a kézi kapcsolatokat:
Végül visszaadja a kimenetét a hívó függvénynek.
A fő funkció
Hozzon létre egy fő funkciót, amely szabályozza a program folyamát. Fogja a bemenetet, és átméretezi a videokockát, hogy biztosítsa a kimenet konzisztenciáját. Adja át a bemenetet a feldolgozó funkciónak, amely ezután észleli és követi a kezeket. A visszaadott eredményeket vigye át a kézi tereptárgyak kapcsolatrajzi funkciójába, amely az eredeti videobemenetre rajzolja a kapcsolatot. Végül megjeleníti a kimenetet a felhasználó számára.
deffő-():
# Cserélje ki a 0-t a videó elérési útjával a használatához
# előre rögzített videó
cap = cv2.VideoCapture(0)mígIgaz:
# A bemenet felvétele
siker, kép = cap.read()
kép = imutils.resize (kép, szélesség=500, magasság=500)
eredmények = process_image (kép)
draw_hand_connections (kép, eredmények)# A kimenet megjelenítése
cv2.imshow("Kézi nyomkövető", kép)
# A program a q gomb megnyomásakor leáll
ha cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()
Az utolsó lépés a program futtatása. Az alábbi kód biztosítja, hogy a program futtatásakor a fő funkció fusson először.
ha __név__ == "__fő__":
fő()
Amikor a program fut, a következő kimenetet állítja elő:
A program valós időben követi a kezeket.
Kézi követés a magával ragadó virtuális valóságért
A virtuális valóságban a kézi követés csábítóbbá teszi a technológiát. A virtuális valóság fejhallgatói elkezdték bevezetni a kézi követést, és a felfokozott valóság érzetét hozzák a virtuális világba. A headsetek lehetővé teszik a felhasználó számára, hogy virtuális kéz használatával parancsokat vigyen be.
A virtuális headsetek kézi követése ennek a technológiának csak egy alkalmazása. Kézi nyomkövetést beépíthet bármely tetszőleges területre.