Мазмуну:

Gesture Hawk: Hand Gesture Controled Robot using Image Processing Based Interface: 13 Steps (Сүрөттөр менен)
Gesture Hawk: Hand Gesture Controled Robot using Image Processing Based Interface: 13 Steps (Сүрөттөр менен)
Anonim
Gesture Hawk: Hand Gesture Controlled Robot, Image Processing based Interface колдонот
Gesture Hawk: Hand Gesture Controlled Robot, Image Processing based Interface колдонот

Gesture Hawk TechEvince 4.0де жөнөкөй сүрөт иштетүүгө негизделген адам-машина интерфейси катары көрсөтүлдү. Анын пайдалуулугу дифференциалдуу айдоо принцибинде иштеген робот машинаны башкаруу үчүн колкаптан башка эч кандай кошумча сенсорлордун же тагынуучу кийимдердин кереги жоктугунда. Бул көрсөтмөдө, биз сизди системада колдонулган объектилерди көзөмөлдөө жана жаңсоолорду аныктоо боюнча иштөө принциби аркылуу алып чыгабыз. Бул долбоордун булак кодун Githubдан шилтеме аркылуу жүктөп алсаңыз болот:

1 -кадам: КЕРЕКТҮҮ нерселер:

КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
КЕРЕКТҮҮ нерселер
  1. L298N мотор айдоочу
  2. DC Motors
  3. Робот машинанын шасси
  4. Arduino Uno
  5. LiPo батареялары
  6. Arduino USB кабели (узун)
  7. Python менен OpenCV китепканасы

2 -кадам: ЭМГЕК ПРИНЦИПИ:

ЭМГЕК ПРИНЦИПИ
ЭМГЕК ПРИНЦИПИ

Gesture Hawk - бул жогоруда көрсөтүлгөн диаграммадан көрүнүп тургандай, үч фазалуу иштетүү системасы.

3 -кадам: Киргизүү жана иштетүү:

Киргизүү жана иштетүү
Киргизүү жана иштетүү

Киргизүүнү жогорудагы диаграммада берилген кененирээк категорияларда түшүнсө болот.

Кол формасын айлана -чөйрөдөн алуу үчүн, биз белгилүү бир түстүн маскировкасын же фильтрин колдонушубуз керек (бул учурда - кызгылт көк). Бул үчүн сиз сүрөттү BGRден HSV форматына айландырышыңыз керек, аны төмөнкү коддун үзүндүсү аркылуу жасоого болот.

hsv = cv2.cvtColor (кадр, cv2. COLOR_BGR2HSV)

Эми, кийинки кадам - HSV параметрлеринин керектүү диапазонун табуу, масканы же фильтр аркылуу колун чыгарып алуу. Бул үчүн эң жакшы ыкма - ылайыктуу диапазонду табуу үчүн трек тилкелерин колдонуу. Мына бул долбоор үчүн колдонулган трек тилкесинин скриншоту.

4 -кадам:

Сүрөт
Сүрөт

5 -кадам:

Бул жерде, маска куруу үчүн мындай тректи жасоо үчүн төмөндө берилген коддун үзүндүсү бар:

cv2 импорттоо

npdef эч нерсе эмес (x): pass 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, эч нерсе) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (кадр, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackVPos, ' 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') low_R = np. массив ([lH, lS, lV]) жогору_R = np.array ([hH, hS, hV]) маска = cv2.inRange (hsv, төмөнкү_R, жогору_R) res = cv2.bitwise_and (кадр, кадр, маска = маска) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

6 -кадам: БОЛУШТУ БОЛУШ:

КАЙРА БӨЛҮК
КАЙРА БӨЛҮК

Ооба, бизде колдун геометриялык фигурасы бар, эми аны колдонуп, кол жаңсоону аныктоо үчүн колдонуу убактысы келди.

Томпок кабык:

Дөңгөч кабык аркылуу биз формада болгон экстремалдуу чекиттер аркылуу болжолдуу полигонго туура келүүгө аракет кылабыз. Сол жактагы сүрөттө кызыл менен белгиленген дөңсөө чекиттери бар формага берилген болжолдуу полигон көрсөтүлгөн.

Томпок чекиттер - бул болжолдонгон көп бурчтуктун эң бир четиндеги формалардагы чекиттер. Бирок, дөңсөө корпусунун көйгөйү, аны эсептөө учурунда биз бардык дөңсөө чекиттеринин массивин алабыз, бирок бизге керектүү нерсе - көк учтуу дөңсөө чекити. Биз бул эмне үчүн талап кылынарын айтып беребиз.

Бул томпок чекитти табуу үчүн, жакынкы жагы бар дөңсөө чекиттин аралыкын табуу үчүн перпендикулярдык аралык формуласын колдонуу керек. Биз көк учтуу чекит капталдан максималдуу аралыкка ээ экенин байкадык, ошондуктан биз бул чекитти алабыз.

7 -кадам:

Сүрөт
Сүрөт

8 -кадам:

Сүрөт
Сүрөт

Андан кийин бармактын учуна (же эң чекитине) кошулган сызыктын горизонталдуу бул дөңсөө чекитке болгон жантаюусун табышыбыз керек.

9 -кадам:

Сүрөт
Сүрөт

Жогорудагы учурда, эгер ымдоо солго бурулса α бурчу 0дөн 90 градуска чейин болушу керек. Башкача айтканда, тан (α) оң болушу керек.

10 -кадам:

Сүрөт
Сүрөт

Жогорудагы учурда, эгер ымдоо оңго бурулса α бурчу 180ден 90 градуска чейин болушу керек. Башкача айтканда, тан (α) терс болушу керек.

Демек, эгер Тан α оң болсо, анда солго бурулат. Эгерде Тан α терс болсо, анда оңго бурулат. Эми, эң маанилүү токтоочу буйрукту кантип табууга болорун көрүүгө убакыт келди.

Бул жерде көрсөтүлгөн катыш (хит жана сыноо аркылуу табылган) каралат жана максималдуу учурларда бул аралыктардын катышы ушул белгилүү диапазондо калат.

11 -кадам:

Сүрөт
Сүрөт

Акырында, алдын ала кыймылдын жаңсоосу OpenCVдеги matchShape () функциясы менен талданат. Бул функция эки эсептегичтин формасын салыштырат, бул учурда жогорудагы сүрөттөгү трайт боюнча мисал менен жогорудагы сүрөттүн сол жагындагы контурду салыштырат. Бул эки контур түрүндөгү вариацияга ылайык, 0дөн 2 же 3кө чейинки маанини кайтарат. Ошол эле контур үчүн ал 0 кайтарат.

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

Бул жерде cn1 жана cnt2 - салыштырууга боло турган эки контур.

12 -кадам: КЫЙМЫЛДЫ БАШКАРУУ:

КЫЙМЫЛДЫ БАШКАРУУ
КЫЙМЫЛДЫ БАШКАРУУ

PySerial:

Биз Python PySerial китепканасын иштетилген маалыматтарды Arduino USB кабели аркылуу Arduino Uno менен байланышуу үчүн сериялык маалыматка айландыруу үчүн колдондук. Белгилүү бир жаңсоо opencv аркылуу аныкталгандан кийин, биз "x" деп убактылуу өзгөрмөнү түзүп, ага уникалдуу маанини ыйгарып, аны төмөнкү буйрук сабы аркылуу сериялык киргизүүгө айландырдык:-

Pyserial китепканасын импорттоо үчүн сериялык #импорттоо

serial. Serial ('', baudrate = '9600', timeout = '0') # сериялык чыгарууну орнотуу.. ПОРТ АТЫ - бул маалымат бериле турган порттун аты.

serial.write (b'x ') # x портко жөнөтүлгөн алфавит… b бул сапты байтка айландыруу.

Arduino иштетүү:

Эми ардуино коддолгон, ошондуктан ар бир сериялык х роботтун жылмакай кыймылы үчүн жооптуу болгон белгилүү бир иш -аракеттерге сызыктуу түрдө картага түшүрүлгөн (сол кыймылдын аныкталышы моторлорду солго бурууга түрткү берет дейли). Биз кодду туура өзгөртүү менен ар бир дөңгөлөктүн кыймылын трансляциялык, ошондой эле ротациялык көзөмөлдөй алабыз.

L298N мотор айдоочу:-

Мотор драйвери мотор менен энергия булагынын ортосунда ортомчу катары колдонулат, анткени моторлор төмөн чыңалуу рейтингине байланыштуу түздөн -түз иштей албайт. Li-Po Батареясы анын 12В кирүү терминалына туташкан жана биз ардуинонун 5В розеткасын мотор айдоочусунун 5V кирүүчү розеткасына акыры Li-Po менен ардуинону мотор драйверинин жалпы розеткасына туташтырабыз.

Эми моторлордун терминалдары берилген розеткаларга туташтырылган. Акырында, биз мотор үчүн кирүүчү терминалдарды PWM чыгаруу розеткаларына туташтырабыз, бул бизге кыймылдын айлануу жана которуу аспектилерин так чечүүгө мүмкүнчүлүк берет.

Сунушталууда: