Talaan ng mga Nilalaman:

Gesture Hawk: Kamay na Kinokontrol ng Robot na Kamay Gamit ang Pagproseso ng Imahe Batay sa Interface: 13 Mga Hakbang (na may Mga Larawan)
Gesture Hawk: Kamay na Kinokontrol ng Robot na Kamay Gamit ang Pagproseso ng Imahe Batay sa Interface: 13 Mga Hakbang (na may Mga Larawan)

Video: Gesture Hawk: Kamay na Kinokontrol ng Robot na Kamay Gamit ang Pagproseso ng Imahe Batay sa Interface: 13 Mga Hakbang (na may Mga Larawan)

Video: Gesture Hawk: Kamay na Kinokontrol ng Robot na Kamay Gamit ang Pagproseso ng Imahe Batay sa Interface: 13 Mga Hakbang (na may Mga Larawan)
Video: The Immortal Hulk: Full Story (The Big Spill) 2024, Hulyo
Anonim
Gesture Hawk: Kamay na Kinokontrol ng Robot na Kamay sa Paggamit ng Imahe na Batay sa Pagproseso ng Imahe
Gesture Hawk: Kamay na Kinokontrol ng Robot na Kamay sa Paggamit ng Imahe na Batay sa Pagproseso ng Imahe

Ang Gesture Hawk ay ipinakita sa TechEvince 4.0 bilang isang simpleng interface ng pagpoproseso ng imahe batay sa human-machine interface. Ang utility nito ay nakasalalay sa katotohanan na walang karagdagang mga sensor o naisusuot maliban sa isang guwantes ang kinakailangan upang makontrol ang robotic car na tumatakbo sa kaugalian ng prinsipyo ng drive. Sa itinuturo na ito, dadalhin ka namin sa prinsipyo ng pagtatrabaho sa likod ng pagsubaybay sa object at pagtuklas ng kilos na ginamit sa system. Maaaring ma-download ang source code ng proyektong ito mula sa Github sa pamamagitan ng link:

Hakbang 1: KINAKAILANGAN ANG MGA BAGAY:

KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
KINAKAILANGAN NG MGA BAGAY
  1. L298N Motor Driver
  2. DC Motors
  3. Mga chassis ng kotse sa robot
  4. Arduino Uno
  5. Mga baterya ng LiPo
  6. Arduino USB Cable (haba)
  7. OpenCV Library na may Python

Hakbang 2: PRINCIPLE NG TRABAHO:

PRINSIPYO NG TRABAHO
PRINSIPYO NG TRABAHO

Ang Gesture Hawk ay isang sistema ng pagproseso ng tatlong yugto tulad ng nakikita mo sa diagram sa itaas.

Hakbang 3: INPUT CAPTURE AT PAMPROSESO:

INPUT CAPTURE AT PROSESO
INPUT CAPTURE AT PROSESO

Ang pag-capture ng input ay maaaring maunawaan sa mas malawak na mga kategorya na ibinigay sa diagram sa itaas.

Upang makuha ang hugis ng kamay mula sa kapaligiran, kailangan naming gumamit ng masking o pagsala ng isang tiyak na kulay (sa kasong ito - violet blue '). Upang magawa iyon kailangan mong i-convert ang imahe mula sa BGR patungong format na HSV na maaaring gawin sa pamamagitan ng paggamit ng sumusunod na code snippet.

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

Ngayon, ang susunod na hakbang ay upang hanapin ang nais na saklaw ng mga parameter ng HSV upang makuha ang kamay sa pamamagitan ng mask o filter. Para sa mga ito, ang pinakamahusay na paraan ay ang paggamit ng mga track bar para sa paghahanap ng angkop na saklaw. Narito ang screenshot ng isang track bar na ginamit para sa proyektong ito.

Hakbang 4:

Larawan
Larawan

Hakbang 5:

Dito, mayroong isang code snippet na ibinigay sa ibaba upang makagawa ng tulad ng isang trackbar para sa pagtatayo ng mask:

import cv2

import numpy as npdef nothing (x): pass cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, wala) cv2.createTrackbar ('l_S ',' image ', 50, 255, wala) cv2.createTrackbar (' l_V ',' image ', 50, 255, wala) cv2.createTrackbar (' h_H ',' image ', 130, 255, wala) cv2. createTrackbar ('h_S', 'image', 255, 255, wala) cv2.createTrackbar ('h_V', 'image', 255, 255, wala) habang (1): _, frame = img.read ()

hsv = cv2.cvtColor (frame, 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') lower_R = np. array ([lH, lS, lV]) mas mataas_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, higher_R) res = cv2.bitwise_and (frame, frame, mask = mask) cv2.imshow ('imahe', res) k = cv2.waitKey (1) & 0xFF kung k == 27: masira ang cv2.destroyAllWindows ()

Hakbang 6: BAHAGI NG PAMPROSESO:

PAMPROSESONG BAHAGI
PAMPROSESONG BAHAGI

Sa gayon, nakuha namin ang isang geometriko na hugis ng isang kamay, oras na upang samantalahin ito at gamitin ito upang malaman ang kilos ng kamay.

Convex Hull:

Sa pamamagitan ng convex hull, sinusubukan naming magkasya sa isang tinatayang polygon sa pamamagitan ng matinding mga puntos na naroroon sa hugis. Ipinapakita ng imahe na nasa kaliwa ang tinatayang polygon na naitalaga sa hugis na may mga puntos na convex na minarkahan ng pula.

Ang mga puntos ng convex ay ang mga puntong nasa hugis na pinakamalayo mula sa isang gilid ng tinatayang polygon na ito. Ngunit, ang problema sa convex hull ay habang sa pagkalkula nito, makakakuha kami ng isang hanay ng lahat ng mga convex point ngunit ang kailangan namin ay ang asul na matulis na convex point. Sasabihin namin sa iyo kung bakit kinakailangan ito.

Upang mahanap ang convex point na ito, kailangan naming ilapat ang patayo na formula ng distansya para sa paghahanap ng distansya ng convex point na may pinakamalapit na panig. Napansin namin na ang asul na matulis na point ay nagtataglay ng maximum na distansya mula sa gilid at sa gayon nakukuha natin ang puntong ito.

Hakbang 7:

Larawan
Larawan

Hakbang 8:

Larawan
Larawan

Susunod na kailangan nating hanapin ang pagkahilig ng linya na sumasali sa dulo ng hinlalaki (o ang matinding punto) sa convex point na ito na may pahalang.

Hakbang 9:

Larawan
Larawan

Sa kaso sa itaas, Ang anggulo α ay dapat na nasa pagitan ng 0 hanggang 90 degree kung ang kilos ay para sa kaliwang pagliko. Ang tan (α) na iyon ay dapat na positibo.

Hakbang 10:

Larawan
Larawan

Sa kaso sa itaas, Ang anggulo α ay dapat na nasa pagitan ng 180 hanggang 90 degree kung ang kilos ay para sa tamang pagliko. Iyon ay tan (α) ay dapat na negatibo.

Samakatuwid, Kung ang Tan α ay positibo, pagkatapos ay Kaliwa. Kung ang Tan α ay negatibo, pagkatapos ang Pag-right turn. Ngayon, oras na upang makita kung paano makita ang pinakamahalagang utos ng paghinto.

Dito, isang tinukoy na ratio (natagpuan ng hit at trial) ay susuriin at sa mga maximum na kaso ang ratio ng mga distansya na ito ay mananatili sa partikular na saklaw na ito.

Hakbang 11:

Larawan
Larawan

Sa Huli, ang kilos ng paggalaw ng foreward ay sinusuri ng pag-andar ng matchShape () sa OpenCV. Inihahambing ng pagpapaandar na ito ang hugis ng dalawang mga countors, sa kasong ito, sa pagitan ng halimbawa ng pagsasanay sa thright sa itaas na larawan sa tabas sa kaliwang bahagi ng imahe sa itaas. Nagbabalik ito ng isang halaga mula 0 hanggang 2 o 3, ayon sa pagkakaiba-iba na naroroon sa hugis ng dalawang mga contour. Para sa magkatulad na tabas, nagbabalik ito ng 0.

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

Dito, ang cn1 at cnt2 ay ang dalawang contour na maihahambing.

Hakbang 12: KONTROL SA PAGGANYAK:

KONTROL SA PAGGANYAK
KONTROL SA PAGGANYAK

PySerial:

Gumamit kami ng PySerial library ng python upang i-convert ang naprosesong data sa serial data upang maiparating sa Arduino Uno sa pamamagitan ng Arduino USB Cable. Kapag ang isang partikular na kilos ay napansin ng opencv lumikha kami ng isang pansamantalang variable na sabihin na 'x' at itinalaga dito ang ilang natatanging halaga at na-convert ito sa serial input gamit ang sumusunod na linya ng utos: -

i-import ang serial # sa pag-import ng Pyserial library

serial. Serial ('', baudrate = '9600', timeout = '0') # pagse-set up ng serial output.. PORT NAME ang pangalan ng port kung saan magaganap ang paghahatid ng data.

serial.write (b'x ') # x ang alpabeto na ipinadala sa port … b ay upang i-convert ang string na ito sa mga byte.

Pagproseso ng Arduino:

Ngayon ang arduino ay naka-code sa isang paraan na ang bawat magkakaibang serial x ay linear na nai-map sa ilang mga aksyon na responsable para sa isang makinis na paggalaw ng robot (sabihin ang pagtuklas ng kaliwang kilos ay magpapalitaw sa mga motor sa kanan upang lumiko sa kaliwa). Maaari naming makontrol ang paggalaw ng bawat gulong sa pagsasalin pati na rin ang pag-ikot sa pamamagitan ng pagbabago ng maayos ang code.

L298N Motor driver: -

Ginamit ang Motor Driver bilang tagapamagitan sa pagitan ng motor at pinagmulan ng kuryente dahil ang motor ay hindi maaaring direktang mapagana dahil sa mababang mga rating ng boltahe. Ang Li-Po Battery ay konektado sa 12V input terminal nito at ikinonekta namin ang 5V socket ng arduino sa 5V input socket ng driver ng motor na sa wakas ay nagkokonekta sa lupa ng Li-Po pati na rin ang arduino sa isang karaniwang ground socket ng motor driver.

Ngayon ang mga terminal ng mga motor ay konektado sa mga socket na ibinigay. Sa wakas ay ikonekta namin ang mga terminal ng pag-input para sa motor sa mga socket ng output ng PWM ng arduino na nagpapahintulot sa amin na malaya na magpasya nang wasto ang mga aspeto ng pag-ikot at pagsasalin ng paggalaw.

Inirerekumendang: