Inhoudsopgave:
- Stap 1: VEREISTE DINGEN:
- Stap 2: WERKINGSPRINCIPE:
- Stap 3: INPUT OPNAME EN VERWERKING:
- Stap 4:
- Stap 5:
- Stap 6: VERWERKINGSONDERDEEL:
- Stap 7:
- Stap 8:
- Stap 9:
- Stap 10:
- Stap 11:
- Stap 12: BEWEGINGSCONTROLE:
- Stap 13:
Video: Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Gesture Hawk werd in TechEvince 4.0 gepresenteerd als een eenvoudige mens-machine-interface op basis van beeldverwerking. Het nut ervan ligt in het feit dat er geen extra sensoren of wearables nodig zijn, behalve een handschoen, om de robotauto te besturen die op het principe van differentiële aandrijving rijdt. In deze instructable nemen we u mee door het werkingsprincipe achter het volgen van objecten en gebarendetectie die in het systeem worden gebruikt. De broncode van dit project kan worden gedownload van Github via een link:
Stap 1: VEREISTE DINGEN:
- L298N-motorstuurprogramma
- DC-motoren
- Robot auto chassis
- Arduino Uno
- LiPo-batterijen
- Arduino USB-kabel (lang)
- OpenCV-bibliotheek met Python
Stap 2: WERKINGSPRINCIPE:
Gesture Hawk is een driefasenverwerkingssysteem zoals u kunt zien in het bovenstaande diagram.
Stap 3: INPUT OPNAME EN VERWERKING:
Het vastleggen van invoer kan worden begrepen in de bredere categorieën die in het bovenstaande diagram worden gegeven.
Om de handvorm uit de omgeving te halen, moeten we maskering of filtering van een bepaalde kleur gebruiken (in dit geval - violetblauw'). Om dat te doen, moet u de afbeelding converteren van BGR naar HSV-indeling, wat kan worden gedaan met behulp van het volgende codefragment.
hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)
De volgende stap is nu om het gewenste bereik van HSV-parameters te vinden om de hand via masker of filter te verwijderen. Hiervoor kun je het beste trackbars gebruiken om een geschikte actieradius te vinden. Hier is de schermafbeelding van een trackbalk die voor dit project wordt gebruikt.
Stap 4:
Stap 5:
Hier is er een codefragment dat hieronder wordt gegeven om zo'n trackbar voor maskerconstructie te maken:
import cv2
importeer numpy als npdef niets(x): pass cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, niets) cv2.createTrackbar('l_S ', 'afbeelding', 50, 255, niets) cv2.createTrackbar('l_V', 'afbeelding', 50, 255, niets) cv2.createTrackbar('h_H', 'afbeelding', 130, 255, niets) cv2. createTrackbar('h_S', 'afbeelding', 255, 255, niets) cv2.createTrackbar('h_V', 'afbeelding', 255, 255, niets) while(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]) hogere_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, lower_R, hogere_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF als k == 27: breek cv2.destroyAllWindows()
Stap 6: VERWERKINGSONDERDEEL:
Welnu, we hebben de geometrische vorm van een hand, nu is het tijd om deze te exploiteren en te gebruiken om het handgebaar te achterhalen.
Convexe romp:
Door een bolle romp proberen we een benaderde veelhoek te passen via extreme punten die in de vorm aanwezig zijn. Afbeelding aan de linkerkant toont bij benadering de veelhoek die was toegewezen aan de vorm met de convexe punten gemarkeerd met rood.
Convexe punten zijn die punten in de vorm die het verst verwijderd zijn van een zijde van deze benaderde veelhoek. Maar het probleem met een convexe romp is dat we tijdens de berekening een array van alle convexe punten krijgen, maar wat we nodig hebben is het convexe punt met blauwe punt. Wij zullen u vertellen waarom dit nodig is.
Om dit convexe punt te vinden, moeten we de formule voor de loodrechte afstand toepassen om de afstand van het convexe punt met de dichtstbijzijnde zijde te vinden. We hebben vastgesteld dat het blauwe puntige punt de maximale afstand vanaf de zijkant heeft en dus krijgen we dit punt.
Stap 7:
Stap 8:
Vervolgens moeten we de helling vinden van de lijn die de top van de duim (of het uiterste punt) verbindt met dit convexe punt met horizontaal.
Stap 9:
In het bovenstaande geval moet de hoek α tussen 0 en 90 graden zijn als het gebaar is om naar links te draaien. Dat is tan(α) moet positief zijn.
Stap 10:
In het bovenstaande geval moet de hoek α tussen 180 en 90 graden zijn als het gebaar is om naar rechts te draaien. Dat is tan(α) moet negatief zijn.
Daarom, als Tan α positief is, draai dan naar links. Als Tan α negatief is, draai dan naar rechts. Nu is het tijd om te zien hoe u de belangrijkste stopopdracht kunt detecteren.
Hier wordt een gespecificeerde verhouding (gevonden door hit and trial) onderzocht en in maximale gevallen blijft deze verhouding van afstanden in dit specifieke bereik.
Stap 11:
Eindelijk wordt het voorwaartse bewegingsgebaar geanalyseerd door de matchShape()-functie in OpenCV. Deze functie vergelijkt de vorm van twee tellers, in dit geval tussen het trainingsvoorbeeld in de bovenstaande afbeelding en de contour aan de linkerkant van de bovenstaande afbeelding. Het retourneert een waarde variërend van 0 tot 2 of 3, afhankelijk van de variatie die aanwezig is in de vorm van twee contouren. Voor identiek dezelfde contour retourneert het 0.
ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)
Hier zijn cn1 en cnt2 de twee contouren die moeten worden vergeleken.
Stap 12: BEWEGINGSCONTROLE:
PySerial:
We gebruikten PySerial-bibliotheek van python om de verwerkte gegevens om te zetten in seriële gegevens om via Arduino USB-kabel naar Arduino Uno te communiceren. Nadat een bepaald gebaar door opencv was gedetecteerd, hebben we een tijdelijke variabele gemaakt, zeg 'x' en er een unieke waarde aan toegewezen en deze geconverteerd naar seriële invoer met behulp van de volgende opdrachtregel: -
importeer seriële #om Pyserial-bibliotheek te importeren
serial. Serial('', baudrate = '9600', timeout = '0') # seriële uitvoer instellen.. POORTNAAM is de naam van de poort via welke gegevensoverdracht zal plaatsvinden.
serial.write(b'x') # x is het alfabet dat naar de poort wordt gestuurd …b is om deze string om te zetten in bytes.
Arduino-verwerking:
Nu is arduino zo gecodeerd dat elke verschillende seriële x lineair wordt toegewezen aan een bepaalde actie die verantwoordelijk is voor een soepele beweging van de robot (zeg dat detectie van een linkergebaar de motoren aan de rechterkant zal activeren om naar links te draaien). We kunnen de beweging van elk wiel zowel translationeel als roterend regelen door de code op de juiste manier te veranderen.
L298N Motorstuurprogramma: -
Motor Driver wordt gebruikt als bemiddelaar tussen motor en stroombron, omdat motoren niet rechtstreeks kunnen worden gevoed vanwege lage spanningswaarden. Li-Po-batterij is verbonden met de 12V-ingangsaansluiting en we verbinden de 5V-aansluiting van arduino met de 5V-ingang van de motorbestuurder die uiteindelijk de aarde van Li-Po en arduino verbindt in een gemeenschappelijke aardingsaansluiting van de motorstuurprogramma.
Nu zijn de klemmen van de motoren aangesloten op de gegeven stopcontacten. Ten slotte verbinden we ingangsterminals voor motor met PWM-uitgangen van Arduino, zodat we vrij zijn om de rotatie- en translatieaspecten van beweging nauwkeurig te bepalen.
Aanbevolen:
Is het mogelijk om foto's over te zetten met behulp van op LPWAN gebaseerde IoT-apparaten?: 6 stappen
Is het mogelijk om foto's over te zetten met behulp van op LPWAN gebaseerde IoT-apparaten?: LPWAN staat voor Low Power Wide Area Network en het is een redelijk geschikte communicatietechnologie op het gebied van IoT. Representatieve technologieën zijn Sigfox, LoRa NB-IoT en LTE Cat.M1. Dit zijn allemaal technologie voor communicatie op lange afstand met een laag vermogen. In ge
Op beeldverwerking gebaseerd brandherkennings- en blussysteem: 3 stappen
Op beeldverwerking gebaseerd brandherkennings- en blussysteem: Hallo vrienden, dit is een op beeldverwerking gebaseerd branddetectie- en blussysteem met Arduino
Op Arduino gebaseerde contactloze infraroodthermometer - Op IR gebaseerde thermometer met Arduino: 4 stappen
Arduino-gebaseerde contactloze infraroodthermometer | IR-gebaseerde thermometer met Arduino: Hallo allemaal, in deze instructables zullen we een contactloze thermometer maken met behulp van Arduino. Omdat de temperatuur van de vloeistof / vaste stof soms veel te hoog of te laag is en dan is het moeilijk om er contact mee te maken en de temperatuur dan in die sc
Een inleiding tot beeldverwerking: Pixy en zijn alternatieven: 6 stappen
Een inleiding tot beeldverwerking: Pixy en zijn alternatieven: in dit artikel zullen we de betekenis van digitale beeldverwerking (DIP) uitleggen en de redenen voor het gebruik van hardware zoals Pixy en andere hulpmiddelen om een proces op foto's of video's te maken. Aan het einde van dit artikel leert u: Hoe een digitaal beeld wordt gevormd
Hoe u gebruikersniveaus van NUMA toevoegt aan uw exemplaar van N met behulp van NumADD Firefox AddOn: 4 stappen
Gebruikersniveaus van NUMA toevoegen aan uw exemplaar van N NumADD Firefox-add-on gebruiken: Elke gebruiker van Metanet's N-database op gebruikersniveau NUMA weet hoe onhandig de interface is voor het kopiëren van door gebruikers gemaakte niveaus naar uw exemplaar van het spel. NumADD, elimineert de noodzaak van kopiëren en plakken en maakt het overzetten van niveaus het werk van één muisklik