Sistema de Seguimiento Facial en Tiempo Real con Arduino y OpenCV
Componentes y suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| Webcam (mini USB) | 1 |
| Micro servos (SG90 o similar) | 2 |
| Kit Pan-Tilt (soporte para 2 servos) | 1 |
| Protoboard | 1 |
Aplicaciones y servicios online
- Python 2.7 (o 3.x con ajustes)
- OpenCV (cv2)
- pyserial
- numpy
- Haarcascade frontal face (XML incluido)
Sobre el proyecto
En tutoriales previos vimos comunicación Arduino-Python con pyserial y detección de color con OpenCV. Ahora integramos detección facial Haar Cascade para mover una cámara montada en pan-tilt y que siga tu rostro.
Requisitos mínimos: conocimientos básicos de Arduino y Python.
Paso 1: Hardware necesario
- Arduino UNO (u otra placa)
- Webcam USB
- 2 micro servos + kit pan-tilt (o imprimir en 3D)
- Protoboard
Paso 2: Entorno Python
- Instala Python 2.7.14 (verificar con
pythonen CMD o IDLE). - Configura variable de entorno PATH si falla.
- Instala módulos:
pip install pyserial opencv-python numpy - Descarga
haarcascade_frontalface_default.xmly ponlo en la carpeta del proyecto.
Paso 3: Script Python (face.py)
import numpy as np
import serial, time, sys, cv2
# Puerto serie Arduino (cambia 'COM5' al tuyo)
arduino = serial.Serial('COM5', 9600)
time.sleep(2)
print("Conectado a Arduino...")
# Clasificador Haar
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Captura vídeo
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.resizeWindow('img', 500, 500)
# Cruces de referencia en centro (250,250)
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)
for (x, y, w, h) in faces:
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]
# Centro del rectángulo
xx = int(x + (x + w)) // 2
yy = int(y + (y + h)) // 2
center = (xx, yy)
print("Centro:", center)
# Enviar a Arduino: formato "X{xx}Y{yy}Z"
data = "X{0:d}Y{1:d}Z".format(xx, yy)
print("Output:", data)
arduino.write(data.encode())
cv2.imshow('img', img)
if cv2.waitKey(30) & 0xFF == 27: # ESC para salir
break
cap.release()
cv2.destroyAllWindows()
Paso 4: Código Arduino (servo.ino)
#include <Servo.h>
Servo servoVer; // Vertical (pin 5)
Servo servoHor; // Horizontal (pin 6)
int x, y, prevX, prevY;
void setup() {
Serial.begin(9600);
servoVer.attach(5);
servoHor.attach(6);
servoVer.write(90); // Centro
servoHor.write(90);
}
void updatePosition() {
if (prevX != x || prevY != y) {
// Mapear coordenadas imagen (0-600, 0-450) a ángulos servo
int servoX = map(x, 600, 0, 70, 179); // Invertido horizontal
int servoY = map(y, 450, 0, 179, 95); // Rango vertical limitado
servoX = constrain(servoX, 70, 179);
servoY = constrain(servoY, 95, 179);
servoHor.write(servoX);
servoVer.write(servoY);
prevX = x; prevY = y;
}
}
void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'X') {
x = Serial.parseInt();
if (Serial.read() == 'Y') {
y = Serial.parseInt();
updatePosition();
}
}
// Limpiar buffer
while (Serial.available() > 0) Serial.read();
}
}
Paso 5: Mecanismo Pan-Tilt
Kit comercial barato y fácil de montar. Instrucciones en el enlace del proyecto original.
Paso 6: Conexiones
- Servo vertical → Pin 5
- Servo horizontal → Pin 6
- VCC servos → 5V (fuente externa si consumen mucho)
- GND → GND común
Ver diagrama de circuito adjunto.
Paso 7: Pruebas
- Sube sketch a Arduino, cierra IDE (libera puerto COM).
- Ejecuta
face.pycon Python IDLE (F5). - Ventana OpenCV muestra vídeo con detección facial.
- Los servos mueven la cámara siguiendo tu rostro.
- Monta la webcam en el pan-tilt para que se mueva con los servos.
Archivos adjuntos
haarcascade_frontalface_default.xml- Clasificador Haarface.py- Script Python completoservo.ino- Sketch Arduino
Proceso de manufactura
- Construya un sensor de temperatura remoto con Raspberry Pi y Python – Guía paso a paso
- Reconocimiento Facial en Tiempo Real en Raspberry Pi – Guía Completa
- Seguimiento Automático de Objetos por Visión Artificial con Raspberry Pi y OpenCV
- Construye un Decodificador DTMF Solo con Arduino – Sin CI Externos
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Sistema de Asistencia RFID Fiable con Arduino y Python
- Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Servidor Web Arduino Uno WiFi: Controla un LED desde el Navegador
- Construir un termómetro IoT con Python: Guía completa