Բովանդակություն:

Estեստի բազե. Ձեռքի ժեստերով վերահսկվող ռոբոտ ՝ օգտագործելով պատկերի մշակման վրա հիմնված ինտերֆեյսը ՝ 13 քայլ (նկարներով)
Estեստի բազե. Ձեռքի ժեստերով վերահսկվող ռոբոտ ՝ օգտագործելով պատկերի մշակման վրա հիմնված ինտերֆեյսը ՝ 13 քայլ (նկարներով)

Video: Estեստի բազե. Ձեռքի ժեստերով վերահսկվող ռոբոտ ՝ օգտագործելով պատկերի մշակման վրա հիմնված ինտերֆեյսը ՝ 13 քայլ (նկարներով)

Video: Estեստի բազե. Ձեռքի ժեստերով վերահսկվող ռոբոտ ՝ օգտագործելով պատկերի մշակման վրա հիմնված ինտերֆեյսը ՝ 13 քայլ (նկարներով)
Video: VOETIN ❌ ESTI UN GUNOI ( 2023 ) 2024, Նոյեմբեր
Anonim
Gեստի բազե. Ձեռքի ժեստերով վերահսկվող ռոբոտ ՝ օգտագործելով պատկերի մշակման վրա հիմնված միջերեսը
Gեստի բազե. Ձեռքի ժեստերով վերահսկվող ռոբոտ ՝ օգտագործելով պատկերի մշակման վրա հիմնված միջերեսը

Gesture Hawk- ը ցուցադրվել է TechEvince 4.0-ում ՝ որպես մարդ-մեքենա պատկերների մշակման պարզ միջերես: Դրա օգտակարությունը կայանում է նրանում, որ ռոբոտային մեքենան կառավարելու համար, որը աշխատում է դիֆերենցիալ սկզբունքով, անհրաժեշտ չեն լրացուցիչ սենսորներ կամ հագնելի, բացի ձեռնոցից: Այս ուսանելի հոդվածում մենք ձեզ կներկայացնենք համակարգում օգտագործվող օբյեկտների հետևման և ժեստերի հայտնաբերման աշխատանքի սկզբունքի համաձայն: Այս նախագծի աղբյուրի կոդը կարելի է ներբեռնել Github- ից ՝ հղման միջոցով ՝

Քայլ 1. ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ

ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
ՊԱՐՏԱԴԻՐ ԲԱՆԵՐ
  1. L298N շարժիչ
  2. DC Motors
  3. Ռոբոտի մեքենայի շասսի
  4. Արդուինո Ունո
  5. LiPo մարտկոցներ
  6. Arduino USB մալուխ (երկար)
  7. OpenCV գրադարան Python- ի հետ

Քայլ 2. ԱՇԽԱՏԱՆՔԻ ՍԿINԲՈՆՔ

ԱՇԽԱՏԱՆՔԻ ՍԿINԲՈՆՔ
ԱՇԽԱՏԱՆՔԻ ՍԿINԲՈՆՔ

Gesture Hawk- ը եռաֆազ մշակման համակարգ է, ինչպես կարող եք տեսնել վերը նշված դիագրամում:

Քայլ 3: Մուտքագրում և վերամշակում

Մուտքային նկարահանում և վերամշակում
Մուտքային նկարահանում և վերամշակում

Մուտքային գրավումը կարելի է հասկանալ վերը նշված դիագրամում տրված ավելի լայն կատեգորիաներում:

Ձեռքի ձևը միջավայրից հանելու համար մենք պետք է օգտագործենք որոշակի գույնի դիմակավորում կամ զտում (այս դեպքում `մանուշակագույն կապույտ): Դա անելու համար դուք պետք է պատկերը փոխարկեք BGR- ից HSV ձևաչափի, որը կարող է կատարվել ՝ օգտագործելով հետևյալ կոդի հատվածը:

hsv = cv2.cvtColor (շրջանակ, cv2. COLOR_BGR2HSV)

Այժմ, հաջորդ քայլը գտնելը HSV պարամետրերի ցանկալի տիրույթն է ՝ ձեռքը դիմակի կամ զտիչի միջոցով հանելու համար: Դրա համար ամենալավ միջոցը համապատասխան միջակայք գտնելու համար օգտագործեք հետագծեր: Ահա այս նախագծի համար օգտագործվող հետագծի սքրինշոթը:

Քայլ 4:

Պատկեր
Պատկեր

Քայլ 5:

Ահա, ստորև տրված ծածկագրի մի հատված, որը դիմակ կառուցելու համար նման հետագիծ է պատրաստում.

ներմուծել cv2

ներմուծել numpy որպես npdef ոչինչ (x). անցնել cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, ոչինչ) cv2.createTrackbar ('l_S ',' image ', 50, 255, ոչինչ) cv2.createTrackbar (' l_V ',' image ', 50, 255, ոչինչ) cv2.createTrackbar (' h_H ',' image ', 130, 255, ոչինչ) cv2. createTrackbar ('h_S', 'image', 255, 255, ոչինչ) cv2.createTrackbar ('h_V', 'image', 255, 255, ոչինչ) մինչ (1): _, frame = img.read ()

hsv = cv2.cvtColor (շրջանակ, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_V', 'պատկեր') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') lower_R = np զանգված ([lH, lS, lV]) ավելի բարձր_R = np. զանգված ([hH, hS, hV]) դիմակ = cv2.inRange (hsv, lower_R, above_R) res = cv2.bitwise_and (frame, frame, mask = mask) cv2.imshow ('պատկեր', res) k = cv2.waitKey (1) & 0xFF, եթե k == 27: ընդմիջում cv2.destroyAllWindows ()

Քայլ 6: ՄՇԱԿՄԱՆ ՄԱՍ

ՄՇԱԿՄԱՆ ՄԱՍ
ՄՇԱԿՄԱՆ ՄԱՍ

Դե, մենք ստացել ենք ձեռքի երկրաչափական ձևը, այժմ ժամանակն է այն շահագործել և օգտագործել այն ՝ ձեռքի ժեստը պարզելու համար:

Ուռուցիկ կորպուս:

Ուռուցիկ կորպուսի միջոցով մենք փորձում ենք մոտեցնել պոլիգոնին ձևի մեջ գտնվող ծայրահեղ կետերի միջոցով: Ձախ կողմում գտնվող պատկերը ցույց է տալիս մոտավոր բազմանկյունը, որը նշանակված էր ձևին ՝ կարմիրով նշված ուռուցիկ կետերով:

Ուռուցիկ կետերն այն ձևի այն կետերն են, որոնք ամենահեռավորն են այս մոտավոր բազմանկյունի կողքից: Բայց, ուռուցիկ կորպուսի խնդիրն այն է, որ դրա հաշվարկի ընթացքում մենք կստանանք բոլոր ուռուցիկ կետերի զանգված, բայց այն, ինչ մեզ պետք է, կապույտ սրածայր ուռուցիկ կետն է: Մենք ձեզ կասենք, թե ինչու է դա պահանջվում:

Այս ուռուցիկ կետը գտնելու համար մենք պետք է կիրառենք ուղղահայաց հեռավորության բանաձև ՝ մոտակա կողքով ուռուցիկ կետի հեռավորությունը գտնելու համար: Մենք նկատեցինք, որ կապույտ սրածայր կետն ունի առավելագույն հեռավորություն կողքից, և մենք ստանում ենք այս կետը:

Քայլ 7:

Պատկեր
Պատկեր

Քայլ 8:

Պատկեր
Պատկեր

Հաջորդը մենք պետք է գտնենք բութ մատի ծայրը (կամ ծայրահեղ կետը) հորիզոնականով միացնող գծի թեքությունը:

Քայլ 9:

Պատկեր
Պատկեր

Վերոնշյալ դեպքում α անկյունը պետք է լինի 0 -ից 90 աստիճանի միջև, եթե ժեստը ձախ շրջադարձի համար է: Այսինքն tan (α) պետք է լինի դրական:

Քայլ 10:

Պատկեր
Պատկեր

Վերոնշյալ դեպքում α անկյունը պետք է լինի 180 -ից 90 աստիճանի միջև, եթե ժեստը աջ շրջադարձի համար է: Այսինքն tan (α) պետք է լինի բացասական:

Հետևաբար, եթե Tan α- ն դրական է, ապա ձախ շրջադարձ: Եթե Tan α- ն բացասական է, ապա աջ շրջադարձ: Այժմ, ժամանակն է տեսնել, թե ինչպես կարելի է հայտնաբերել կանգառի ամենակարևոր հրամանը:

Այստեղ ուսումնասիրվում է որոշակի հարաբերակցությունը (հայտնաբերված հարվածի և փորձարկման միջոցով) և առավելագույն դեպքերում հեռավորությունների հարաբերակցությունը մնում է այս որոշակի տիրույթում:

Քայլ 11:

Պատկեր
Պատկեր

Վերջապես, առաջ շարժման ժեստը վերլուծվում է matchChape () գործառույթով OpenCV- ում: Այս գործառույթը համեմատում է երկու հաշվիչի ձևը, այս դեպքում, վերը նշված նկարում thight- ի վերապատրաստման օրինակի և վերը նշված պատկերի ձախ կողմում գտնվող եզրագծի միջև: Այն վերադարձնում է 0 -ից 2 կամ 3 -ի արժեքը `ըստ երկու ուրվագծերի ձևի առկա տատանումների: Նույն նույն ուրվագծի համար այն վերադարձնում է 0:

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

Այստեղ cn1- ը և cnt2- ը երկու ուրվագծերն են, որոնք պետք է համեմատվեն:

Քայլ 12. Շարժման վերահսկողություն

Շարժման վերահսկողություն
Շարժման վերահսկողություն

PySerial:

Մենք օգտագործեցինք Python- ի PySerial գրադարանը ՝ մշակված տվյալները սերիական տվյալների փոխարկելու համար, որոնք Arduino Uno- ին փոխանցվում են Arduino USB մալուխի միջոցով: Opencv- ի կողմից որոշակի ժեստ հայտնաբերելուց հետո մենք ստեղծեցինք «x» ասված ժամանակավոր փոփոխական և դրան հատկացրեցինք ինչ-որ յուրահատուկ արժեք և այն փոխարկեցինք սերիական մուտքագրման ՝ օգտագործելով հետևյալ հրամանի տողը.

ներմուծել սերիա #ներմուծել Pyserial գրադարան

serial. Serial ('', baudrate = '9600', timeout = '0') # սերիական ելքի կարգավորում.. ՊՈՐՏԱՅԻՆ ԱՆՎԱՆԸ այն նավահանգստի անունն է, որով տվյալների փոխանցումը տեղի կունենա:

serial.write (b'x ') # x այբուբենն ուղարկված այբուբենն է … b- ն այս տողը բայթերի փոխարկելն է:

Arduino վերամշակում

Այժմ arduino- ն այնպես է կոդավորված, որ յուրաքանչյուր տարբեր սերիա x գծայինորեն գծված է որոշակի գործողության վրա, որը պատասխանատու է ռոբոտի սահուն շարժման համար (ասենք, ձախ շարժման հայտնաբերումը կհանգեցնի աջ ձախ շարժիչների շարժմանը դեպի ձախ): Մենք կարող ենք վերահսկել յուրաքանչյուր անիվի շարժումը ինչպես թարգմանաբար, այնպես էլ պտույտով ՝ ծածկագիրը ճիշտ փոխելով:

L298N Շարժիչ `-

Motor Driver- ը օգտագործվում է որպես միջնորդ շարժիչի և էներգիայի աղբյուրի միջև, քանի որ շարժիչները չեն կարող ուղղակիորեն սնուցվել ցածր լարման վարկանիշների պատճառով: Li-Po մարտկոցը միացված է իր 12 Վ մուտքային տերմինալին, և մենք arduino- ի 5 Վ վարդակից միացնում ենք շարժիչի վարորդի 5 Վ մուտքային վարդակին, որը վերջապես միացնում է Li-Po- ի գետինը, ինչպես նաև arduino- ն շարժիչի վարորդի ընդհանուր վարդակից:

Այժմ շարժիչների տերմինալները միացված են տրված վարդակների վրա: Ի վերջո, մենք շարժիչի մուտքային տերմինալները միացնում ենք arduino- ի PWM ելքային վարդակներին, ինչը թույլ է տալիս մեզ ազատորեն որոշել շարժման պտտման և թարգմանության ասպեկտները:

Խորհուրդ ենք տալիս: