Turinys:

„Gesture Hawk“: rankomis valdomas robotas naudojant vaizdo apdorojimo sąsają: 13 žingsnių (su paveikslėliais)
„Gesture Hawk“: rankomis valdomas robotas naudojant vaizdo apdorojimo sąsają: 13 žingsnių (su paveikslėliais)

Video: „Gesture Hawk“: rankomis valdomas robotas naudojant vaizdo apdorojimo sąsają: 13 žingsnių (su paveikslėliais)

Video: „Gesture Hawk“: rankomis valdomas robotas naudojant vaizdo apdorojimo sąsają: 13 žingsnių (su paveikslėliais)
Video: Ranka Valdoma Mašina 2024, Lapkritis
Anonim
„Gesture Hawk“: rankomis valdomas robotas, naudojant vaizdo apdorojimo sąsają
„Gesture Hawk“: rankomis valdomas robotas, naudojant vaizdo apdorojimo sąsają

„Gesture Hawk“buvo pristatytas „TechEvince 4.0“kaip paprasta vaizdų apdorojimo žmogaus ir mašinos sąsaja. Jo naudingumas slypi tame, kad norint valdyti robotinį automobilį, kuris veikia diferencinės pavaros principu, nereikia jokių papildomų jutiklių ar dėvimų daiktų, išskyrus pirštines. Šioje instrukcijoje mes supažindinsime jus su sistemoje naudojamų objektų sekimo ir gestų aptikimo principu. Šio projekto šaltinio kodą galima atsisiųsti iš „Github“per nuorodą:

1 žingsnis: REIKALINGI dalykai:

Reikalingi dalykai
Reikalingi dalykai
Reikalingi dalykai
Reikalingi dalykai
Reikalingi dalykai
Reikalingi dalykai
Reikalingi dalykai
Reikalingi dalykai
  1. L298N variklio tvarkyklė
  2. DC varikliai
  3. Automobilių robotų važiuoklė
  4. Arduino Uno
  5. LiPo baterijos
  6. „Arduino“USB kabelis (ilgas)
  7. „OpenCV“biblioteka su „Python“

2 žingsnis: DARBO PRINCIPAS:

DARBO PRINCIPAS
DARBO PRINCIPAS

„Gesture Hawk“yra trijų fazių apdorojimo sistema, kaip matote aukščiau esančioje diagramoje.

3 veiksmas: įvesties surinkimas ir apdorojimas:

Įvesties surinkimas ir apdorojimas
Įvesties surinkimas ir apdorojimas

Įvesties fiksavimą galima suprasti platesnėmis kategorijomis, pateiktomis aukščiau pateiktoje diagramoje.

Norėdami išgauti rankos formą iš aplinkos, turime naudoti tam tikros spalvos maskavimą arba filtravimą (šiuo atveju - violetinės mėlynos spalvos). Norėdami tai padaryti, turite konvertuoti vaizdą iš BGR į HSV formatą, kurį galima padaryti naudojant šį kodo fragmentą.

hsv = cv2.cvtColor (rėmelis, cv2. COLOR_BGR2HSV)

Dabar kitas žingsnis yra surasti norimą HSV parametrų diapazoną, kad ištrauktumėte ranką per kaukę ar filtrą. Tam tinkamiausias diapazonas yra geriausias būdas naudoti takelius. Čia yra šiam projektui naudojamos takelio juostos ekrano kopija.

4 žingsnis:

Vaizdas
Vaizdas

5 veiksmas:

Žemiau pateikiamas kodo fragmentas, skirtas tokiai kaukių konstravimo juostai sukurti:

importuoti cv2

importuoti numpy kaip npdef nieko (x): perduoti 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) o (1): _, frame = img.read ()

hsv = cv2.cvtColor (kadras, 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') low_R = np. masyvas ([lH, lS, lV]) didesnis_R = np.masyvas ([hH, hS, hV]) kaukė = cv2.inRange (hsv, apatinis_R, didesnis_R) res = cv2.bitwise_and (rėmas, rėmas, kaukė = kaukė) cv2.imshow ('vaizdas', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

6 žingsnis: APDOROJIMO DALIS:

APDOROJIMO DALIS
APDOROJIMO DALIS

Na, mes turime geometrinę rankos formą, dabar atėjo laikas ją išnaudoti ir panaudoti, norint išsiaiškinti rankos gestą.

Išgaubtas korpusas:

Per išgaubtą korpusą mes bandome pritaikyti apytikslį daugiakampį per kraštutinius formos taškus. Kairėje esančiame paveikslėlyje rodomas apytikslis daugiakampis, kuris buvo priskirtas formai su išgaubtais taškais, pažymėtais raudona spalva.

Išgaubti taškai yra tie formos taškai, esantys toliausiai nuo šio apytikslio daugiakampio šono. Tačiau išgaubto korpuso problema yra ta, kad skaičiuojant gausime visų išgaubtų taškų masyvą, tačiau mums reikia išgaubto mėlyno taško. Mes jums pasakysime, kodėl to reikia.

Norėdami rasti šį išgaubtą tašką, turime taikyti statmenos atstumo formulę, kad surastume išgaubto taško atstumą su artimiausia puse. Mes pastebėjome, kad mėlynas smailus taškas turi didžiausią atstumą nuo šono, todėl mes gauname šį tašką.

7 žingsnis:

Vaizdas
Vaizdas

8 žingsnis:

Vaizdas
Vaizdas

Toliau turime rasti linijos, jungiančios nykščio galiuką (arba kraštutinį tašką), linkį su šiuo išgaubtu tašku su horizontaliu.

9 veiksmas:

Vaizdas
Vaizdas

Pirmiau nurodytu atveju kampas α turėtų būti nuo 0 iki 90 laipsnių, jei gestas skirtas posūkiui į kairę. Tai yra įdegis (α) turėtų būti teigiamas.

10 veiksmas:

Vaizdas
Vaizdas

Pirmiau nurodytu atveju kampas α turėtų būti nuo 180 iki 90 laipsnių, jei gestas skirtas posūkiui į dešinę. Tai yra įdegis (α) turėtų būti neigiamas.

Todėl, jei Tan α yra teigiamas, tada pasukite į kairę. Jei Tan α yra neigiamas, pasukite į dešinę. Dabar atėjo laikas pamatyti, kaip aptikti svarbiausią sustabdymo komandą.

Čia išnagrinėtas nurodytas santykis (nustatytas pagal smūgį ir bandymą) ir daugeliu atvejų šis atstumų santykis išlieka šiame konkrečiame diapazone.

11 veiksmas:

Vaizdas
Vaizdas

Galiausiai, judėjimo į priekį gestas analizuojamas naudojant OpenSV funkciją matchShape (). Ši funkcija palygina dviejų skaitiklių formą, šiuo atveju, tarp treniruotės pavyzdžio dėl sandarumo aukščiau esančiame paveikslėlyje su kontūru kairėje aukščiau esančio vaizdo pusėje. Ji grąžina reikšmę nuo 0 iki 2 arba 3, atsižvelgiant į dviejų kontūrų formos kitimą. Tuo pačiu kontūru jis grąžina 0.

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

Čia cn1 ir cnt2 yra du kontūrai, kuriuos reikia palyginti.

12 žingsnis: JUDĖJIMŲ KONTROLĖ:

JUDESIO KONTROLĖ
JUDESIO KONTROLĖ

„PySerial“:

Mes panaudojome „PySerial“„python“biblioteką, norėdami paversti apdorotus duomenis į serijinius duomenis ir perduoti „Arduino Uno“per „Arduino“USB kabelį. Kai „opencv“aptiko tam tikrą gestą, mes sukūrėme laikiną kintamąjį, pvz., „X“, ir priskyrėme jam unikalią vertę ir konvertavome jį į nuoseklųjį įvestį naudodami šią komandų eilutę:-

importuoti serial #importuoti Pyserial biblioteką

serial. Serial ('', baudrate = '9600', timeout = '0') # nustatantis serijinę išvestį.. UOSTO PAVADINIMAS yra prievado, kuriuo bus perduodami duomenys, pavadinimas.

serial.write (b'x ') # x yra abėcėlė, siunčiama į prievadą … b yra konvertuoti šią eilutę į baitus.

„Arduino“apdorojimas:

Dabar „arduino“yra užkoduotas taip, kad kiekvienas skirtingas serijinis x yra linijiškai susietas su tam tikru veiksmu, atsakingu už sklandų roboto judėjimą (tarkime, kairiojo gesto aptikimas paskatins dešinėje esančius variklius pasukti į kairę). Tinkamai pakeisdami kodą, mes galime kontroliuoti kiekvieno rato judesį tiek vertikaliai, tiek sukimosi būdu.

L298N variklio vairuotojas:-

Variklio vairuotojas naudojamas kaip tarpininkas tarp variklio ir maitinimo šaltinio, nes varikliai negali būti tiesiogiai maitinami dėl žemos įtampos. „Li-Po“akumuliatorius yra prijungtas prie jo 12 V įvesties gnybto, o mes prijungiame „arduino“5 V lizdą prie variklio vairuotojo 5 V įvesties lizdo, galiausiai prijungiančio „Li-Po“žemę, taip pat „arduino“į bendrą variklio vairuotojo įžeminimo lizdą.

Dabar variklių gnybtai yra prijungti prie nurodytų lizdų. Galiausiai mes prijungiame variklio įvesties gnybtus prie arduino PWM išvesties lizdų, kad galėtume tiksliai nuspręsti dėl judesio sukimosi ir vertimo aspektų.

Rekomenduojamas: