Tartalomjegyzék:

Gesztus Hawk: Kézi gesztusvezérelt robot képfeldolgozási felületen: 13 lépés (képekkel)
Gesztus Hawk: Kézi gesztusvezérelt robot képfeldolgozási felületen: 13 lépés (képekkel)

Videó: Gesztus Hawk: Kézi gesztusvezérelt robot képfeldolgozási felületen: 13 lépés (képekkel)

Videó: Gesztus Hawk: Kézi gesztusvezérelt robot képfeldolgozási felületen: 13 lépés (képekkel)
Videó: Книга 07 — Аудиокнига Виктора Гюго «Горбун из Нотр-Дама» (главы 1–8) 2024, Július
Anonim
Gesztus Hawk: Kézi gesztusokkal vezérelt robot képfeldolgozási felületen
Gesztus Hawk: Kézi gesztusokkal vezérelt robot képfeldolgozási felületen

A Gesture Hawk-ot a TechEvince 4.0-ban mutatták be, mint egy egyszerű képfeldolgozáson alapuló ember-gép felületet. Hasznossága abban rejlik, hogy a differenciálhajtás elvén futó robotkocsi vezérléséhez nincs szükség további érzékelőkre vagy viselhető kesztyűn kívül. Ebben az utasításban végigvezetjük a rendszerben használt objektumkövetés és gesztusérzékelés működési elvén. A projekt forráskódja letölthető a Github webhelyről a következő linkről:

1. lépés: SZÜKSÉGES DOLGOK:

SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
SZÜKSÉGES DOLGOK
  1. L298N motorvezérlő
  2. DC motorok
  3. Robot autó alváz
  4. Arduino Uno
  5. LiPo akkumulátorok
  6. Arduino USB kábel (hosszú)
  7. OpenCV könyvtár Python segítségével

2. lépés: MUNKAELV:

MUNKAELV
MUNKAELV

A Gesture Hawk egy háromfázisú feldolgozó rendszer, amint az a fenti ábrán látható.

3. lépés: BEMENET ELKÉSZÍTÉSE ÉS FELDOLGOZÁSA:

BEMENET ELKÉSZÍTÉSE ÉS FELDOLGOZÁSA
BEMENET ELKÉSZÍTÉSE ÉS FELDOLGOZÁSA

A bemeneti rögzítés a fenti diagramban megadott szélesebb kategóriákban érthető.

Ahhoz, hogy a kéz formáját kivonjuk a környezetből, meghatározott színű maszkot vagy szűrést kell használnunk (ebben az esetben - ibolyakék’). Ehhez konvertálnia kell a képet BGR -ből HSV formátumba, amelyet a következő kódrészlet segítségével lehet megtenni.

hsv = cv2.cvtColor (keret, cv2. COLOR_BGR2HSV)

Most a következő lépésben meg kell találni a kívánt HSV paraméterek tartományát, hogy maszkon vagy szűrőn keresztül ki lehessen húzni a kezet. Ehhez a legjobb módszer a sávok használata a megfelelő tartomány megtalálásához. Itt a képernyőkép a projekthez használt sávról.

4. lépés:

Kép
Kép

5. lépés:

Itt egy kódrészlet található az alábbi sáv létrehozásához a maszképítéshez:

import cv2

importálja a numpy -t npdef semmit (x): pass cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nothing) cv2.createTrackbar ('l_S ',' image ', 50, 255, nothing) cv2.createTrackbar (' l_V ',' image ', 50, 255, nothing) cv2.createTrackbar (' h_H ',' image ', 130, 255, nothing) cv2. createTrackbar ('h_S', 'image', 255, 255, nothing) cv2.createTrackbar ('h_V', 'image', 255, 255, nothing), miközben (1): _, frame = img.read ()

hsv = cv2.cvtColor (keret, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_V', 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') alsó_R = np. tömb ([lH, lS, lV]) magasabb_R = np.tömb ([hH, hS, hV]) maszk = cv2.inRange (hsv, alsó_R, magasabb_R) res = cv2.bitwise_and (keret, keret, maszk = maszk) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

6. lépés: FELDOLGOZÁSI RÉSZ:

FELDOLGOZÁSI RÉSZ
FELDOLGOZÁSI RÉSZ

Nos, megkaptuk a kéz geometriai alakját, most itt az ideje, hogy ezt kihasználjuk és felhasználjuk a kézmozdulat kitalálásához.

Domború hajótest:

A domború hajótesten keresztül megpróbálunk hozzárendelni egy hozzávetőleges sokszöget az alak szélső pontjain keresztül. A bal oldali kép a hozzávetőleges sokszöget mutatja, amelyet az alakhoz rendeltek, és a domború pontokat pirossal jelöltük.

A domború pontok az alak azon pontjai, amelyek a legközelebbi sokszög oldalától legtávolabb vannak. A domború hajótest problémája azonban az, hogy a számítás során az összes domború pont tömbjét kapjuk, de a kék hegyes domború pontra van szükségünk. Elmondjuk, miért van rá szükség.

Ennek a domború pontnak a megtalálásához a merőleges távolság képletét kell alkalmaznunk a konvex pont legközelebbi oldallal való távolságának megállapításához. Megfigyeltük, hogy a kék hegyű pont maximális távolságot mutat az oldaltól, és így megkapjuk ezt a pontot.

7. lépés:

Kép
Kép

8. lépés:

Kép
Kép

Ezután meg kell találnunk a hüvelykujj hegyét (vagy a szélső pontot) ehhez a vízszintes domború ponthoz kapcsolódó vonal dőlését.

9. lépés:

Kép
Kép

A fenti esetben az α szögnek 0 és 90 fok között kell lennie, ha a gesztus balra fordul. Ez azt jelenti, hogy a tan (α) pozitív legyen.

10. lépés:

Kép
Kép

A fenti esetben az α szögnek 180 és 90 fok között kell lennie, ha a gesztus jobbra fordul. Vagyis tan (α) legyen negatív.

Ezért, ha Tan α pozitív, akkor balra fordul. Ha Tan α negatív, akkor jobbra. Itt az ideje, hogy megtudja, hogyan lehet észlelni a legfontosabb stop parancsot.

Itt egy meghatározott arányt (találat és próba) találnak, és a legtöbb esetben ez a távolságarány ebben a tartományban marad.

11. lépés:

Kép
Kép

Végül az előrefelé irányuló mozgást az OpenCV matchShape () függvénye elemzi. Ez a függvény két számláló alakját hasonlítja össze, ebben az esetben a fenti képen a szorításra gyakorolt példa és a fenti kép bal oldalán lévő kontúr között. 0 és 2 vagy 3 közötti értéket ad vissza, két kontúr alakjában. Azonos kontúr esetén 0 -t ad vissza.

ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)

Itt a cn1 és a cnt2 a két kontúr, amelyeket össze kell hasonlítani.

12. lépés: MOTION CONTROL:

MOTION CONTROL
MOTION CONTROL

PySerial:

A PySerial python könyvtárát használtuk fel arra, hogy a feldolgozott adatokat soros adatokká alakítsuk át az Arduino Uno -hoz az Arduino USB -kábelen keresztül továbbítva. Miután az opencv észlelt egy adott gesztust, létrehoztunk egy ideiglenes változót, mondjuk az „x” -t, és hozzárendeltünk néhány egyedi értéket, és a következő parancssort használva konvertáltuk soros bemenetre:-

sorozat sorozat importálása #Pyserial könyvtár importálásához

serial. Serial ('', baudrate = '9600', timeout = '0') # soros kimenet beállítása.. PORT NÉV annak a portnak a neve, amelyen keresztül adatátvitel történik.

serial.write (b'x ') # x a portra küldött ábécé… b a karakterlánc bájtra konvertálása.

Arduino feldolgozás:

Most az arduino kódolása oly módon történik, hogy minden egyes soros x lineárisan le van képezve a robot zökkenőmentes mozgásáért felelős műveletre (mondjuk a bal oldali gesztus észlelése a jobb oldali motorokat balra kanyarítja). A kód helyes megváltoztatásával irányíthatjuk az egyes kerekek mozgását fordítva és forgásirányban is.

L298N Motor meghajtó:-

A motorvezérlő közvetítőként szolgál a motor és az áramforrás között, mivel a motorokat nem lehet közvetlenül táplálni az alacsony feszültség miatt. A Li-Po akkumulátort a 12 V-os bemeneti csatlakozójához csatlakoztatjuk, és az arduino 5 V-os aljzatát a motorvezérlő 5 V-os bemeneti aljzatához csatlakoztatjuk, amely végül a Li-Po földjét és az arduino-t csatlakoztatja a motorvezérlő közös földelő aljzatába.

Most a motorok kapcsai a megadott aljzatokon vannak csatlakoztatva. Végül csatlakoztatjuk a motor bemeneti termináljait az arduino PWM kimeneti aljzataihoz, így szabadon dönthetünk a mozgás forgási és fordítási szempontjairól.

Ajánlott: