Sommario:
- Passaggio 1: COSE RICHIESTE:
- Fase 2: PRINCIPIO DI FUNZIONAMENTO:
- Passaggio 3: CATTURA ED ELABORAZIONE INPUT:
- Passaggio 4:
- Passaggio 5:
- Fase 6: PARTE ELABORAZIONE:
- Passaggio 7:
- Passaggio 8:
- Passaggio 9:
- Passaggio 10:
- Passaggio 11:
- Passaggio 12: CONTROLLO DEL MOVIMENTO:
- Passaggio 13:
Video: Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini: 13 passaggi (con immagini)
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
Gesture Hawk è stato presentato in TechEvince 4.0 come una semplice interfaccia uomo-macchina basata sull'elaborazione delle immagini. La sua utilità risiede nel fatto che non sono necessari sensori aggiuntivi o dispositivi indossabili tranne un guanto per controllare l'auto robotica che funziona con il principio di azionamento differenziale. In questo tutorial, ti guideremo attraverso il principio di funzionamento alla base del rilevamento degli oggetti e del rilevamento dei gesti utilizzati nel sistema. Il codice sorgente di questo progetto può essere scaricato da Github tramite link:
Passaggio 1: COSE RICHIESTE:
- Driver del motore L298N
- Motori CC
- Telaio per auto robot
- Arduino Uno
- Batterie LiPo
- Cavo USB Arduino (lungo)
- Libreria OpenCV con Python
Fase 2: PRINCIPIO DI FUNZIONAMENTO:
Gesture Hawk è un sistema di elaborazione trifase come puoi vedere nel diagramma sopra.
Passaggio 3: CATTURA ED ELABORAZIONE INPUT:
La cattura dell'input può essere compresa nelle categorie più ampie fornite nel diagramma sopra.
Per estrarre la forma della mano dall'ambiente, dobbiamo usare mascherature o filtri di un colore definito (in questo caso - viola blu'). Per fare ciò è necessario convertire l'immagine dal formato BGR al formato HSV che può essere eseguito utilizzando il seguente frammento di codice.
hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)
Ora, il prossimo passo è trovare l'intervallo desiderato di parametri HSV per estrarre la mano tramite maschera o filtro. Per questo, il modo migliore è utilizzare le barre di traccia per trovare un intervallo adatto. Ecco lo screenshot di una barra di traccia utilizzata per questo progetto.
Passaggio 4:
Passaggio 5:
Qui, c'è uno snippet di codice riportato di seguito per creare una trackbar di questo tipo per la costruzione della maschera:
importa cv2
import numpy as npdef niente(x): pass cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, niente) cv2.createTrackbar('l_S ', 'image', 50, 255, niente) cv2.createTrackbar('l_V', 'image', 50, 255, niente) cv2.createTrackbar('h_H', 'image', 130, 255, niente) cv2. createTrackbar('h_S', 'image', 255, 255, niente) cv2.createTrackbar('h_V', 'image', 255, 255, niente) 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]) upper_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, lower_R, upper_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF se k == 27: break cv2.destroyAllWindows()
Fase 6: PARTE ELABORAZIONE:
Bene, abbiamo la forma geometrica di una mano, ora è il momento di sfruttarla e utilizzarla per capire il gesto della mano.
Scafo convesso:
Attraverso lo scafo convesso, cerchiamo di adattare un poligono approssimativo tramite i punti estremi presenti nella forma. L'immagine presente a sinistra mostra il poligono approssimativo che era stato assegnato alla forma con i punti convessi contrassegnati in rosso.
I punti convessi sono quei punti nella forma che sono più lontani da un lato di questo poligono approssimato. Ma il problema con l'inviluppo convesso è che durante il suo calcolo, otterremo un array di tutti i punti convessi, ma ciò di cui abbiamo bisogno è il punto convesso a punta blu. Ti diremo perché è richiesto.
Per trovare questo punto convesso, dobbiamo applicare la formula della distanza perpendicolare per trovare la distanza del punto convesso con il lato più vicino. Abbiamo osservato che il punto appuntito blu possiede la massima distanza dal lato e quindi otteniamo questo punto.
Passaggio 7:
Passaggio 8:
Quindi dobbiamo trovare l'inclinazione della linea che unisce la punta del pollice (o il punto estremo) a questo punto convesso con l'orizzontale.
Passaggio 9:
Nel caso sopra, l'angolo α dovrebbe essere compreso tra 0 e 90 gradi se il gesto è per la svolta a sinistra. Questo è tan(α) dovrebbe essere positivo.
Passaggio 10:
Nel caso sopra, l'angolo α dovrebbe essere compreso tra 180 e 90 gradi se il gesto è per la svolta a destra. Cioè tan(α) dovrebbe essere negativo.
Pertanto, se Tan α è positivo, allora svolta a sinistra. Se Tan α è negativo, allora svolta a destra. Ora è il momento di vedere come rilevare il comando di arresto più importante.
Qui viene esaminato un rapporto specificato (trovato per hit e trial) e nei casi massimi questo rapporto di distanze rimane in questo particolare intervallo.
Passaggio 11:
Alla fine, il gesto di movimento in avanti viene analizzato dalla funzione matchShape() in OpenCV. Questa funzione confronta la forma di due contatori, in questo caso, tra l'esempio di allenamento a destra nell'immagine sopra al contorno nella parte sinistra dell'immagine sopra. Restituisce un valore compreso tra 0 e 2 o 3, a seconda della variazione presente nella forma dei due contorni. Per lo stesso contorno identico, restituisce 0.
ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)
Qui, cn1 e cnt2 sono i due contorni che devono essere confrontati.
Passaggio 12: CONTROLLO DEL MOVIMENTO:
PySerial:
Abbiamo utilizzato la libreria PySerial di Python per convertire i dati elaborati in dati seriali da comunicare ad Arduino Uno tramite il cavo USB Arduino. Una volta che un particolare gesto è stato rilevato da opencv, abbiamo creato una variabile temporanea dire "x" e gli abbiamo assegnato un valore univoco e l'abbiamo convertita in input seriale utilizzando la seguente riga di comando: -
import serial #per importare la libreria Pyserial
serial. Serial('', baudrate = '9600', timeout = '0') # impostazione dell'output seriale.. PORT NAME è il nome della porta tramite la quale avverrà la trasmissione dei dati.
serial.write(b'x') # x è l'alfabeto inviato alla porta …b è per convertire questa stringa in byte.
Elaborazione Arduino:
Ora arduino è codificato in modo tale che ogni diverso seriale x sia mappato linearmente a determinate azioni responsabili di un movimento fluido del robot (diciamo che il rilevamento del gesto sinistro attiverà i motori a destra per girare a sinistra). Possiamo controllare il movimento di ciascuna ruota in senso traslazionale e rotatorio modificando il codice in modo appropriato.
L298N Driver del motore:-
Il driver del motore viene utilizzato come mediatore tra il motore e la fonte di alimentazione poiché i motori non possono essere alimentati direttamente a causa dei valori nominali di bassa tensione. La batteria Li-Po è collegata al suo terminale di ingresso da 12 V e colleghiamo la presa da 5 V di arduino alla presa di ingresso da 5 V del driver del motore, infine collegando la terra di Li-Po e arduino in una presa di terra comune del driver del motore.
Ora i terminali dei motori sono collegati alle prese date. Infine colleghiamo i terminali di ingresso per il motore alle prese di uscita PWM di arduino lasciandoci liberi di decidere con precisione gli aspetti di rotazione e traslazione del movimento.
Consigliato:
Robot controllato da gesti che utilizza Arduino: 7 passaggi
Robot controllato dai gesti che utilizza Arduino: i robot sono utilizzati in molti settori come l'edilizia, militare, manifatturiero, assemblaggio, ecc. I robot possono essere autonomi o semi-autonomi. I robot autonomi non richiedono alcun intervento umano e possono agire da soli in base alla situazione. Se
Gioco tenuto in mano delle forbici della roccia di carta di Arduino che utilizza il display LCD 20x4 con I2C: 7 passaggi
Gioco portatile Arduino Paper Rock Scissors con display LCD 20x4 con I2C: Ciao a tutti o forse dovrei dire "Ciao mondo!" Sarebbe un grande piacere condividere con voi un progetto che è stato il mio ingresso in molte cose Arduino. Questo è un gioco Arduino Paper Rock Scissors portatile che utilizza un display LCD I2C 20x4. IO
Sistema di riconoscimento ed estinzione incendi basato sull'elaborazione delle immagini: 3 passaggi
Sistema di riconoscimento ed estinzione incendi basato sull'elaborazione delle immagini: Ciao amici, questo è un sistema di rilevamento ed estinzione incendi basato sull'elaborazione delle immagini che utilizza Arduino
Flipper da tavolo che utilizza Evive - Piattaforma incorporata basata su Arduino: 18 passaggi (con immagini)
Flipper da tavolo che utilizza Evive - Piattaforma incorporata basata su Arduino: un altro fine settimana, un altro gioco emozionante! E questa volta non è altro che il gioco arcade preferito da tutti: il flipper! Questo progetto ti mostrerà come creare facilmente il tuo flipper personale a casa. Tutto ciò di cui hai bisogno sono i componenti di Evive
Pulsantiera LED Arduino che guida l'elaborazione delle animazioni: 36 passaggi (con immagini)
Pulsantiera LED Arduino che guida l'elaborazione delle animazioni: cosaQuesta pulsantiera è realizzata utilizzando un PCB e altri componenti prodotti da Sparkfun. È pilotato da un Arduino Mega. Ogni pulsante è bello, morbido e soddisfacente da premere, e ha un LED RGB all'interno! L'ho usato per controllare le animazioni che