Tabla de contenido:
- Paso 1: COSAS REQUERIDAS:
- Paso 2: PRINCIPIO DE FUNCIONAMIENTO:
- Paso 3: CAPTURA DE ENTRADA Y PROCESAMIENTO:
- Paso 4:
- Paso 5:
- Paso 6: PARTE DE PROCESAMIENTO:
- Paso 7:
- Paso 8:
- Paso 9:
- Paso 10:
- Paso 11:
- Paso 12: CONTROL DE MOVIMIENTO:
- Paso 13:
Video: Gesture Hawk: Robot controlado por gestos con la mano utilizando una interfaz basada en procesamiento de imágenes: 13 pasos (con imágenes)
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
Gesture Hawk se presentó en TechEvince 4.0 como una sencilla interfaz hombre-máquina basada en el procesamiento de imágenes. Su utilidad radica en el hecho de que no se requieren sensores adicionales o dispositivos portátiles, excepto un guante, para controlar el automóvil robótico que funciona con el principio de conducción diferencial. En este instructivo, lo guiaremos a través del principio de funcionamiento detrás del seguimiento de objetos y la detección de gestos utilizados en el sistema. El código fuente de este proyecto se puede descargar de Github a través del enlace:
Paso 1: COSAS REQUERIDAS:
- Controlador de motor L298N
- Motores DC
- Chasis de coche robot
- Arduino Uno
- Baterías LiPo
- Cable USB Arduino (largo)
- Biblioteca OpenCV con Python
Paso 2: PRINCIPIO DE FUNCIONAMIENTO:
Gesture Hawk es un sistema de procesamiento de tres fases como puede ver en el diagrama anterior.
Paso 3: CAPTURA DE ENTRADA Y PROCESAMIENTO:
La captura de entrada se puede entender en las categorías más amplias que se dan en el diagrama anterior.
Para extraer la forma de la mano del entorno, necesitamos usar enmascaramiento o filtrado de un color definido (en este caso, azul violeta). Para hacer eso, necesita convertir la imagen de formato BGR a HSV que se puede hacer usando el siguiente fragmento de código.
hsv = cv2.cvtColor (marco, cv2. COLOR_BGR2HSV)
Ahora, el siguiente paso es encontrar el rango deseado de parámetros de HSV para extraer la mano a través de una máscara o un filtro. Para ello, la mejor forma es utilizar las barras de seguimiento para encontrar un rango adecuado. Aquí está la captura de pantalla de una barra de seguimiento utilizada para este proyecto.
Paso 4:
Paso 5:
Aquí, hay un fragmento de código que se proporciona a continuación para crear una barra de seguimiento para la construcción de máscaras:
importar cv2
importar numpy como npdef nothing (x): pass cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nada) cv2.createTrackbar ('l_S ',' imagen ', 50, 255, nada) cv2.createTrackbar (' l_V ',' imagen ', 50, 255, nada) cv2.createTrackbar (' h_H ',' imagen ', 130, 255, nada) cv2. createTrackbar ('h_S', 'imagen', 255, 255, nada) cv2.createTrackbar ('h_V', 'imagen', 255, 255, nada) 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', 'imagen') hH = cv2.getTrackbarPos ('h_H', 'imagen') hS = cv2.getTrackbarPos ('h_S', 'imagen') hV = cv2.getTrackbarPos ('h_V', 'imagen') lower_R = np. array ([lH, lS, lV]) upper_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, high_R) res = cv2.bitwise_and (marco, marco, máscara = máscara) cv2.imshow ('imagen', res) k = cv2.waitKey (1) & 0xFF si k == 27: romper cv2.destroyAllWindows ()
Paso 6: PARTE DE PROCESAMIENTO:
Bueno, tenemos la forma geométrica de una mano, ahora es el momento de explotarla y utilizarla para descubrir el gesto de la mano.
Casco convexo:
A través de un casco convexo, intentamos ajustar un polígono aproximado a través de puntos extremos presentes en la forma. La imagen presente a la izquierda muestra el polígono aproximado que se le había asignado a la forma con los puntos convexos marcados en rojo.
Los puntos convexos son aquellos puntos de la forma que están más alejados de un lado de este polígono aproximado. Pero, el problema con el casco convexo es que durante su cálculo, obtendremos una matriz de todos los puntos convexos, pero lo que necesitamos es el punto convexo de punta azul. Le diremos por qué es necesario.
Para encontrar este punto convexo, necesitamos aplicar la fórmula de la distancia perpendicular para encontrar la distancia del punto convexo con el lado más cercano. Observamos que el punto puntiagudo azul posee la distancia máxima desde el lado y así obtenemos este punto.
Paso 7:
Paso 8:
A continuación, necesitamos encontrar la inclinación de la línea que une la punta del pulgar (o el punto extremo) a este punto convexo con la horizontal.
Paso 9:
En el caso anterior, el ángulo α debe estar entre 0 y 90 grados si el gesto es para girar a la izquierda. Eso es tan (α) debería ser positivo.
Paso 10:
En el caso anterior, el ángulo α debe estar entre 180 y 90 grados si el gesto es para girar a la derecha. Eso es tan (α) debería ser negativo.
Por lo tanto, si Tan α es positivo, girar a la izquierda. Si Tan α es negativo, entonces gire a la derecha. Ahora es el momento de ver cómo detectar el comando de parada más importante.
Aquí, se examina una proporción específica (encontrada por acierto y ensayo) y, en casos máximos, esta proporción de distancias permanece en este rango particular.
Paso 11:
Por último, el gesto de movimiento hacia adelante se analiza mediante la función matchShape () en OpenCV. Esta función compara la forma de dos contadores, en este caso, entre el ejemplo de entrenamiento en la derecha en la imagen de arriba con el contorno en el lado izquierdo de la imagen de arriba. Devuelve un valor que va de 0 a 2 o 3, según la variación presente en la forma de dos contornos. Para el mismo contorno idéntico, devuelve 0.
ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)
Aquí, cn1 y cnt2 son los dos contornos que se van a comparar.
Paso 12: CONTROL DE MOVIMIENTO:
PySerial:
Usamos la biblioteca PySerial de python para convertir los datos procesados en datos en serie para comunicarlos a Arduino Uno a través del cable USB Arduino. Una vez que opencv detectó un gesto en particular, creamos una variable temporal, digamos "x", le asignamos un valor único y lo convertimos en una entrada en serie usando la siguiente línea de comando: -
importar número de serie para importar la biblioteca Pyserial
serial. Serial ('', baudrate = '9600', timeout = '0') # configurando la salida serial.. PORT NAME es el nombre del puerto por el cual ocurrirá la transmisión de datos.
serial.write (b'x ') # x es el alfabeto enviado al puerto … b es convertir esta cadena en bytes.
Procesamiento Arduino:
Ahora arduino está codificado de tal manera que cada serie x diferente se asigna linealmente a cierta acción responsable de un movimiento suave del robot (digamos que la detección del gesto izquierdo activará los motores de la derecha para girar a la izquierda). Podemos controlar el movimiento de cada rueda tanto de traslación como de rotación cambiando el código correctamente.
Controlador de motor L298N: -
El controlador de motor se utiliza como mediador entre el motor y la fuente de alimentación, ya que los motores no se pueden alimentar directamente debido a las clasificaciones de bajo voltaje. La batería Li-Po está conectada a su terminal de entrada de 12 V y conectamos la toma de 5 V de arduino a la toma de entrada de 5 V del controlador del motor, finalmente conectando la tierra de Li-Po y el arduino en una toma de tierra común del controlador del motor.
Ahora los terminales de los motores están conectados en los enchufes dados. Finalmente, conectamos los terminales de entrada para el motor a los enchufes de salida PWM de arduino, lo que nos permite decidir con precisión los aspectos de rotación y traslación del movimiento.
Recomendado:
Ratón controlado por gestos: 6 pasos (con imágenes)
Ratón controlado por gestos: estás viendo una película con tus amigos en una computadora portátil y uno de los chicos recibe una llamada. Ahh … tienes que salir de tu casa para pausar la película. Está dando una presentación en un proyector y necesita cambiar entre aplicaciones. Tienes que moverte ac
Robot SCARA: ¡Aprendiendo sobre cinemática inversa e inversa! (Plot Twist Aprenda a hacer una interfaz en tiempo real en ARDUINO usando PROCESAMIENTO !!!!): 5 pasos (con imágenes)
Robot SCARA: ¡Aprendiendo sobre cinemática inversa e inversa! (Plot Twist Aprenda a hacer una interfaz en tiempo real en ARDUINO usando PROCESAMIENTO !!!!): Un robot SCARA es una máquina muy popular en el mundo de la industria. El nombre significa Brazo robótico de ensamblaje compatible selectivo o Brazo robótico articulado compatible selectivo. Básicamente es un robot de tres grados de libertad, siendo los dos primeros visualiz
Coche controlado por gestos: 5 pasos (con imágenes)
Coche controlado por gestos: los robots están desempeñando un papel importante en la automatización en todos los sectores, como la construcción, militar, médico, de fabricación, etc. Después de hacer algunos robots básicos como el coche controlado mediante Bluetooth, he desarrollado este ges basado en acelerómetros
Construya un robot controlado por gestos: 4 pasos (con imágenes)
Construye un robot controlado por gestos: en este Instructable construimos un robot Arcbotics Sparki que se puede controlar con gestos 3D. Una característica interesante de este proyecto es que no se necesita ningún dispositivo adicional, como un teléfono inteligente o un guante, para controlar el robot. Solo mueve tu mano sobre el ele
Mano robótica inalámbrica controlada por gestos y voz: 7 pasos (con imágenes)
Mano robótica inalámbrica controlada por gestos y voz: Básicamente este era nuestro proyecto universitario y debido a la falta de tiempo para enviar este proyecto nos olvidamos de tomar fotografías de algunos pasos. También diseñamos un código con el que se puede controlar esta mano robótica con gestos y voz al mismo tiempo, pero debido a