Obsah:

Gesture Hawk: Robot ovládaný gesty pomocí rozhraní založeného na zpracování obrazu: 13 kroků (s obrázky)
Gesture Hawk: Robot ovládaný gesty pomocí rozhraní založeného na zpracování obrazu: 13 kroků (s obrázky)

Video: Gesture Hawk: Robot ovládaný gesty pomocí rozhraní založeného na zpracování obrazu: 13 kroků (s obrázky)

Video: Gesture Hawk: Robot ovládaný gesty pomocí rozhraní založeného na zpracování obrazu: 13 kroků (s obrázky)
Video: Spotlight 9. Модуль 4a. Reading & Vocabulary 2024, Listopad
Anonim
Gesture Hawk: Robot ovládaný gesty pomocí rozhraní založeného na zpracování obrazu
Gesture Hawk: Robot ovládaný gesty pomocí rozhraní založeného na zpracování obrazu

Gesture Hawk byl představen v TechEvince 4.0 jako jednoduché rozhraní pro zpracování obrazu založené na člověku a stroji. Jeho užitečnost spočívá v tom, že k ovládání robotického auta, které pracuje na principu diferenciálního pohonu, nejsou potřeba žádné další senzory ani nositelné kromě rukavice. V tomto pokynu vás provedeme fungujícím principem sledování objektu a detekce gest používaného v systému. Zdrojový kód tohoto projektu lze stáhnout z Githubu prostřednictvím odkazu:

Krok 1: POŽADOVANÉ VĚCI:

POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
POŽADOVANÉ VĚCI
  1. Ovladač motoru L298N
  2. DC motory
  3. Robotický podvozek automobilu
  4. Arduino Uno
  5. LiPo baterie
  6. Arduino USB kabel (dlouhý)
  7. OpenCV knihovna s Pythonem

Krok 2: PRINCIP PRÁCE:

PRINCIP PRÁCE
PRINCIP PRÁCE

Gesture Hawk je třífázový systém zpracování, jak můžete vidět na výše uvedeném diagramu.

Krok 3: VSTUPNÍ ZACHYCENÍ A ZPRACOVÁNÍ:

VSTUP A ZPRACOVÁNÍ
VSTUP A ZPRACOVÁNÍ

Vstupní zachycení lze chápat v širších kategoriích uvedených ve výše uvedeném diagramu.

K extrahování tvaru ruky z prostředí musíme použít maskování nebo filtrování určité barvy (v tomto případě - fialová modrá ‘). Chcete -li to provést, musíte převést obrázek z formátu BGR do formátu HSV, který lze provést pomocí následujícího fragmentu kódu.

hsv = cv2.cvtColor (rámeček, cv2. COLOR_BGR2HSV)

Nyní je dalším krokem nalezení požadovaného rozsahu parametrů HSV k extrakci ruky pomocí masky nebo filtru. K tomu je nejlepším způsobem použití kolejnic pro nalezení vhodného dosahu. Zde je screenshot lišty stopy použité pro tento projekt.

Krok 4:

obraz
obraz

Krok 5:

Zde je uveden úryvek kódu, který vytvoří takový trackbar pro konstrukci masky:

importovat cv2

import numpy jako npdef nic (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) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (snímek, 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') nižší_R = np. pole ([lH, lS, lV]) higher_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, higher_R) res = cv2.bitwise_and (frame, frame, mask = mask) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Krok 6: ČÁST ZPRACOVÁNÍ:

ZPRACOVÁNÍ ČÁST
ZPRACOVÁNÍ ČÁST

Získali jsme geometrický tvar ruky, nyní je čas ji využít a využít ji k určení gesta ruky.

Konvexní obal:

Prostřednictvím konvexního trupu se snažíme vložit přibližný polygon prostřednictvím extrémních bodů přítomných ve tvaru. Na obrázku vlevo je přibližný polygon, který byl tvaru přiřazen s konvexními body označenými červenou barvou.

Konvexní body jsou body ve tvaru, které jsou nejdále od strany tohoto aproximovaného mnohoúhelníku. Problém konvexního trupu je ale v tom, že během jeho výpočtu získáme pole všech konvexních bodů, ale to, co potřebujeme, je modře špičatý konvexní bod. Řekneme vám, proč je to nutné.

Abychom našli tento konvexní bod, musíme použít vzorec kolmé vzdálenosti pro nalezení vzdálenosti konvexního bodu s nejbližší stranou. Zjistili jsme, že modrý špičatý bod má maximální vzdálenost od boku, a tak tento bod získáme.

Krok 7:

obraz
obraz

Krok 8:

obraz
obraz

Dále musíme zjistit sklon čáry spojující špičku palce (nebo extrémní bod) s tímto konvexním bodem s horizontálou.

Krok 9:

obraz
obraz

Ve výše uvedeném případě by úhel α měl být mezi 0 až 90 stupni, pokud je gesto pro zatáčení doleva. To znamená, že tan (α) by měl být kladný.

Krok 10:

obraz
obraz

Ve výše uvedeném případě by úhel α měl být mezi 180 až 90 stupni, pokud je gesto pro pravé otočení. To je tan (α) by mělo být negativní.

Pokud je tedy Tan α kladný, pak zatočte doleva. Pokud je Tan α záporný, pak zatočte doprava. Nyní je načase zjistit, jak detekovat nejdůležitější příkaz k zastavení.

Zde je zkoumán specifikovaný poměr (zjištěný zásahem a pokusem) a v maximálních případech tento poměr vzdáleností zůstává v tomto konkrétním rozsahu.

Krok 11:

obraz
obraz

Nakonec je gesto pohybu vpřed analyzováno funkcí matchShape () v OpenCV. Tato funkce porovnává tvar dvou čítačů, v tomto případě mezi příkladem tréninku nahoře na obrázku výše a obrysem na levé straně obrázku výše. Vrací hodnotu v rozmezí od 0 do 2 nebo 3 podle variace přítomné ve tvaru dvou obrysů. Pro identicky stejný obrys vrátí 0.

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

Zde jsou cn1 a cnt2 dva obrysy, které mají být porovnány.

Krok 12: POHYBOVÁ ŘÍZENÍ:

KONTROLA POHYBU
KONTROLA POHYBU

PySerial:

K převodu zpracovaných dat na sériová data, která byla sdělena Arduino Uno pomocí kabelu USB Arduino, jsme použili knihovnu python PySerial. Jakmile opencv zjistilo konkrétní gesto, vytvořili jsme dočasnou proměnnou „x“a přiřadili jí nějakou jedinečnou hodnotu a převedli ji na sériový vstup pomocí následujícího příkazového řádku:-

import serial #importovat knihovnu Pyserial

serial. Serial ('', baudrate = '9600', timeout = '0') # nastavení sériového výstupu.. PORT NAME je název portu, na kterém bude probíhat přenos dat.

serial.write (b'x ') # x je abeceda odeslaná na port … b je převod tohoto řetězce na bajty.

Zpracování Arduino:

Nyní je arduino kódováno takovým způsobem, že každý jiný sériový x je lineárně mapován na určitou akci zodpovědnou za plynulý pohyb robota (řekněme detekce levého gesta spustí motory vpravo a odbočí doleva). Pohyb každého kola můžeme ovládat translačně i rotačně správnou změnou kódu.

L298N Motorový ovladač:-

Motor Driver se používá jako prostředník mezi motorem a zdrojem energie, protože motory nelze napájet přímo z důvodu nízkého napětí. Baterie Li-Po je připojena ke vstupnímu terminálu 12V a my připojíme 5V zásuvku arduino k 5V vstupní zásuvce ovladače motoru a nakonec připojíme zem Li-Po i arduino do společné zemní zásuvky ovladače motoru.

Nyní jsou svorky motorů připojeny k uvedeným zásuvkám. Nakonec připojíme vstupní terminály pro motor k výstupním zásuvkám PWM arduina, což nám umožní svobodně rozhodnout o rotačních a translačních aspektech pohybu.

Doporučuje: