Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Seguimiento facial con Arduino

Componentes y suministros

Arduino UNO
× 1
cámara web
× 1
Micro servos
× 2
Pan-Tilt
× 1
Breadboard (genérico)
× 1

Aplicaciones y servicios en línea

Python 2.7
OpenCV

Acerca de este proyecto

En un tutorial anterior, compartí cómo puede comunicarse entre Arduino y Python usando el módulo 'pyserial' y controlar un LED. Si no lo ha visto, compruébelo aquí:¡COMUNICACIÓN ENTRE ARDUINO Y PYTHON!

Y cómo puedes detectar el color de un objeto y rastrearlo en la pantalla, compruébalo aquí:DETECCIÓN DE COLOR USANDO OPENCV Y PYTHON.

En este tutorial, le mostraré cómo rastrear caras usando Arduino y Python y hacer que la cámara siga la cara. Esto puede parecer difícil, pero créame que no lo es. Todo lo que necesita es un conocimiento básico de Arduino y Python.

Así que comencemos ...

Paso 1:Cosas que necesitará

Los requisitos son mínimos. Aquí he proporcionado una lista parcial de todo lo que necesita:

Requisitos de hardware:

  • Arduino UNO (puede usar otras placas)
  • Web Cam (Mini Web Cam)
  • Servos x 2 (usaré micro servos pero tú puedes usar servos estándar)
  • Protoboard (para la creación de prototipos)
  • Servo Pan Tilt Kit (puede construir uno si lo desea)

Requisitos de software:

  • Python 2.7 (debe instalarse, el sistema operativo Linux generalmente lo tiene preinstalado)
  • OpenCV (puede descargarlo por separado o instalarlo usando 'pip install' explicado con más detalle)
  • pyserial (se puede instalar con pip)
  • numpy.
  • Haarcascade.

Una vez recopilado todo, podemos pasar al paso de instalación ...

Paso 2:Configurar el entorno Python

Instalación de Python:

Entonces, primero necesitamos Python 2.7 en funcionamiento. Para hacer esto, primero descargue e instale python 2.7.14. Para comprobar si está instalado correctamente, vaya a: Búsqueda de Windows>> Escriba "IDLE">> Presione Enter. Debería aparecer un Python Shell.

O

En la búsqueda, escriba 'CMD' y presione enter para abrir el símbolo del sistema. En CMD, escriba >> python y presione enter, Debería mostrarse la interfaz de Python.

Si ve un error en CMD, no se preocupe, probablemente necesite establecer la variable de entorno. Puedes seguir este tutorial aquí para configurar la variable de entorno.

Instalando 'pyserial', 'OpenCV "y" numpy "en Python:

Para instalar estos módulos usaremos use pip install,

Primero abra CMD y escriba los siguientes códigos:-

 > pip install serial 
> pip install opencv-python
> pip install numpy

estos comandos instalarán los módulos necesarios. Ahora podemos pasar a la parte de codificación ...

Paso 3:secuencia de comandos de Python

Antes de comenzar a escribir código, lo primero que debe hacer es crear una nueva carpeta, ya que todo el código debe almacenarse en la misma carpeta. Así que cree una nueva carpeta, asígnele el nombre que desee. y descargue el 'Haarcascade' desde abajo y péguelo en la carpeta.

Ahora abra el bloc de notas y escriba el script que se muestra a continuación, guárdelo como 'face.py' en la misma carpeta que haarcascade. (Puede descargar el código que he proporcionado en el archivo a continuación):

  #importar todos los módulos requeridos 
import numpy as np
import serial
import time
import sys
import cv2
#Setup Ruta de comunicación para arduino (en lugar de 'COM5' coloque el puerto al que está conectado su arduino)
arduino =serial.Serial ('COM5', 9600)
time.sleep (2)
print ("Conectado a arduino ...")
#importando Haarcascade para la detección de rostros
face_cascade =cv2.CascadeClassifier ('haarcascade_frontalface_default.xml')
#Para capturar el flujo de video desde cámara web.
cap =cv2.VideoCapture (0)
# Lee la imagen capturada, conviértela a imagen gris y encuentra caras
while 1:
ret, img =cap.read ()
cv2.resizeWindow ('img', 500,500)
cv2.line (img, (500,250), (0,250), (0,255,0), 1)
cv2.line ( img, (250,0), (250,500), (0,255,0), 1)
cv2.circle (img, (250, 250), 5, (255, 255, 255), -1)
gray =cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
faces =face_cascade.detectMultiScale (gray, 1.3)
#detectar la cara y haz un rectángulo alrededor.
para (x, y, w, h) en caras:
cv2.rectangle (img, (x, y), (x + w, y + h), ( 0,255,0), 5)
roi_gray =gris [y:y + h, x:x + w]
roi_color =img [y:y + h, x:x + w]
arr ={y:y + h, x:x + w}
print (arr)

print ('X:' + str (x))
print ( 'Y:' + str (y))
print ('x + w:' + str (x + w))
print ('y + h:' + str (y + h))
# Centro de roi (Rectángulo)
xx =int (x + (x + h)) / 2
yy =int (y + (y + w)) / 2
imprimir (xx)
print (yy)
center =(xx, yy)
# enviando datos a arduino
print ("Center of Rectangle is:", center)
datos ="X {0:d} Y {1:d} Z" .format (xx, yy)
print ("salida ='" + datos + "'")
arduino.write ( data)
#Muestra la secuencia.
cv2.imshow ('img', img)
#Pulsa 'Esc' para finalizar la ejecución
k =cv2.waitKey (30) &0xff
si k ==27:
romper

Una vez hecho esto, continúe escribiendo el código para Arduino ...

haarcascade_frontalface_default.xml face.py

Paso 4:Código Arduino

Una vez que el script de Python está listo, necesitamos un boceto de arduino para controlar el servo. Consulte el código a continuación, péguelo en Arduino IDE y guárdelo como 'servo.ino' en la misma carpeta que face.py y haarcascade. cargue el código y continúe con el siguiente paso para realizar las conexiones.

(Archivo descargable que se muestra a continuación).

  #include  
Servo servoVer; // Servo vertical
Servo servoHor; // Servo horizontal
int x;
int y;
int prevX;
int prevY;
void setup ()
{
Serial .begin (9600);
servoVer.attach (5); // Conecte el servo vertical al pin 5
servoHor.attach (6); // Conecte el servo horizontal al pin 6
servoVer.write (90);
servoHor.write (90);
}
void Pos ()
{
if (prevX! =x || prevY! =y)
{
int servoX =map (x, 600, 0, 70, 179);
int servoY =map (y , 450, 0, 179, 95);
servoX =min (servoX, 179);
servoX =max (servoX, 70);
servoY =min (servoY, 179);
servoY =max (servoY, 95);

servoHor.write (servoX);
servoVer.write (servoY);
}
}
bucle void ()
{
if (Serial.available ()> 0)
{
if (Serial.read () =='X')
{
x =Serial.parseInt ();
if (Serial.read () =='Y')
{
y =Serial.parseInt ();
Pos ();
}
}
while (Serial.available ()> 0)
{
Serial.read ();
}
}
}
servo.ino

Paso 5:Mecanismo de giro e inclinación:-

He utilizado un kit disponible para Pan-Tilt. Si lo desea, puede hacer uno usted mismo utilizando madera / plástico o incluso imprimir uno en 3D.

El que utilicé es bastante barato y muy fácil de montar. Sin embargo, si desea instrucciones sobre cómo hacerlo, puede encontrarlas aquí.

Paso 6:hacer conexiones

El circuito es bastante simple. Simplemente conecte dos servos a arduino.

  • Vertical al Pin 5
  • Horizontal al Pin 6
  • Potencia a + 5V
  • Tierra a GND

Consulte el diagrama del circuito como referencia.

Paso 7:prueba

  • Una vez hecho todo, lo último que debe hacer es probar si funciona. Para probar primero, asegúrese de que los servos estén conectados correctamente a arduino y que el boceto esté cargado.
  • Después de cargar el boceto, asegúrese de cerrar el IDE para que el puerto esté libre para conectarse a Python.
  • Ahora abra 'face.py' con Python IDLE y presione 'F5' para ejecutar el código. Tomará unos segundos conectarse a arduino y luego debería poder ver una ventana que transmite la cámara web. Ahora el código detectará tu rostro y los servos lo rastrearán.
  • El servo debe moverse a medida que mueve el objeto. Ahora simplemente conecte la cámara a los servos para que se mueva junto con los servos.

Espero que te guste. y aprende algo nuevo.

¡Gracias!

Código

  • servo.ino
  • Fragmento de código n. ° 2
  • Fragmento de código n. ° 3
servo.ino Arduino
Error al abrir el archivo.
Fragmento de código n. ° 2 Texto sin formato
 #importar todos los módulos requeridosimport numpy as npimport serialimport timeimport sysimport cv2 # Configurar ruta de comunicación para arduino (en lugar de 'COM5', coloque el puerto al que está conectado su arduino) arduino =serial.Serial ('COM5', 9600 ) time.sleep (2) print ("Conectado a arduino ...") # importando el Haarcascade para la detección de rostrosface_cascade =cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') # Para capturar el flujo de video desde webcam.cap =cv2.VideoCapture (0) # Lee la imagen capturada, conviértela a imagen gris y busca caras mientras 1:ret, img =cap.read () cv2.resizeWindow ('img', 500,500) cv2.line (img, (500,250), (0,250 ), (0,255,0), 1) cv2.line (img, (250,0), (250,500), (0,255,0), 1) cv2.circle (img, (250, 250), 5, (255 , 255, 255), -1) gray =cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) faces =face_cascade.detectMultiScale (gray, 1.3) #detecta la cara y haz un rectángulo alrededor de ella. para (x, y, w, h) en caras:cv2.rectangle (img, (x, y), (x + w, y + h), (0,255,0), 5) roi_gray =gray [y:y + h, x:x + w] roi_color =img [y:y + h, x:x + w] arr ={y:y + h, x:x + w} print (arr) print ('X:' + str (x)) print ('Y:' + str (y)) print ('x + w:' + str (x + w)) print ('y + h:' + str (y + h)) # Centro de roi (Rectángulo) xx =int (x + (x + h)) / 2 yy =int (y + (y + w)) / 2 print (xx) print (yy) center =(xx, yy) # enviando datos a arduino imprimir ("El centro del rectángulo es:", centro) datos ="X {0:d} Y {1:d} Z" .format (xx, yy) print ("salida ='" + datos + "' ") arduino.write (data) #Muestra la secuencia. cv2.imshow ('img', img) # Pulse 'Esc' para finalizar la ejecución k =cv2.waitKey (30) &0xff si k ==27:break 
Fragmento de código n. ° 3 Texto sin formato
 #include  Servo servoVer; // Vertical ServoServo servoHor; // Horizontal Servoint x; int y; int prevX; int prevY; void setup () {Serial.begin (9600); servoVer.attach (5); // Conecte el servo vertical al pin 5 servoHor.attach (6); // Conecte el servo horizontal al pin 6 servoVer.write (90); servoHor.write (90);} void Pos () {if (prevX! =x || prevY! =y) {int servoX =map (x, 600, 0, 70, 179); int servoY =map (y, 450, 0, 179, 95); servoX =min (servoX, 179); servoX =max (servoX, 70); servoY =min (servoY, 179); servoY =max (servoY, 95); servoHor.write (servoX); servoVer.write (servoY); }} bucle vacío () {if (Serial.available ()> 0) {if (Serial.read () =='X') {x =Serial.parseInt (); if (Serial.read () =='Y') {y =Serial.parseInt (); Pos (); }} while (Serial.available ()> 0) {Serial.read (); }}} 

Proceso de manufactura

  1. Sensor de temperatura Python y Raspberry Pi
  2. Reconocimiento facial en tiempo real:un proyecto de principio a fin
  3. Seguimiento automático de objetos por visión
  4. Decodificador DTMF usando solo Arduino
  5. Hacer Monitor Ambilight usando Arduino
  6. Sistema de asistencia que usa Arduino y RFID con Python
  7. Máquina de LEVITACIÓN ULTRASÓNICA usando ARDUINO
  8. Voltímetro de bricolaje con Arduino y un teléfono inteligente
  9. Monitor de frecuencia cardíaca con IoT
  10. WebServerBlink usando Arduino Uno WiFi
  11. Termómetro de IoT con Python