Construisez un Système de Suivi Visage en Temps Réel avec Arduino et OpenCV
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Webcam (mini USB) | 1 |
| Micro-servomoteurs | 2 |
| Kit Pan-Tilt (support orientable) | 1 |
| Plaque d'essai (breadboard) | 1 |
Applications et services en ligne
- Python 2.7
- OpenCV (via
pip install opencv-python) - pyserial (
pip install pyserial) - numpy (
pip install numpy) - Haarcascade (classifieur visage)
À propos du projet
Dans un tutoriel précédent, j'ai montré la communication Arduino-Python via pyserial pour piloter une LED. Ensuite, la détection de couleur et suivi d'objet avec OpenCV. Ici, nous allons détecter et suivre un visage : la caméra (montée sur le Pan-Tilt) suivra automatiquement votre visage. Plus simple qu'il n'y paraît !
Étape 1 : Prérequis
Matériel : Arduino UNO, Webcam, 2 microservos, Breadboard, Kit Pan-Tilt.
Logiciel : Python 2.7, OpenCV, pyserial, numpy, fichier haarcascade_frontalface_default.xml.
Étape 2 : Installation environnement Python
- Installez Python 2.7.14. Vérifiez :
pythondans l'invite de commande. - Si erreur, configurez la variable d'environnement PATH.
- Installez les modules :
> pip install pyserial
> pip install opencv-python
> pip install numpy
Étape 3 : Script Python (face.py)
Créez un dossier, placez-y haarcascade_frontalface_default.xml et le script ci-dessous :
import numpy as np
import serial
import time
import sys
import cv2
# Port série Arduino (adaptez 'COM5')
arduino = serial.Serial('COM5', 9600)
time.sleep(2)
print("Connecte a l'Arduino...")
# Classifieur Haar Cascade
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Capture vidéo
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.resizeWindow('img', 500, 500)
# Repères visuels
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)
# Centre du rectangle détecté
xx = int(x + w/2)
yy = int(y + h/2)
center = (xx, yy)
print("Centre du rectangle :", center)
# Envoi vers Arduino : format "XYZ"
data = "X{0:d}Y{1:d}Z".format(xx, yy)
print("Output = '" + data + "'")
arduino.write(data.encode())
cv2.imshow('img', img)
# Échap pour quitter
if cv2.waitKey(30) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
Étape 4 : Code Arduino (servo.ino)
#include <Servo.h>
Servo servoVer; // Vertical (tilt)
Servo servoHor; // Horizontal (pan)
int x, y;
int prevX, prevY;
void setup() {
Serial.begin(9600);
servoVer.attach(5); // Broche 5
servoHor.attach(6); // Broche 6
servoVer.write(90); // Position centrale
servoHor.write(90);
}
void Pos() {
if (prevX != x || prevY != y) {
// Mapping coordonnées image (600x450) -> angles servo
int servoX = map(x, 600, 0, 70, 179);
int servoY = map(y, 450, 0, 179, 95);
// Limites mécaniques
servoX = constrain(servoX, 70, 179);
servoY = constrain(servoY, 95, 179);
servoHor.write(servoX);
servoVer.write(servoY);
}
}
void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 'X') {
x = Serial.parseInt();
if (Serial.read() == 'Y') {
y = Serial.parseInt();
Pos();
}
}
// Vide le buffer
while (Serial.available() > 0) Serial.read();
}
}
Étape 5 : Mécanisme Pan-Tilt
Kit prêt à l'emploi utilisé (peu cher, facile à monter). Vous pouvez aussi le fabriquer (bois, plastique, impression 3D).
Étape 6 : Connexions
Câblage simple :
- Servo vertical → Broche 5
- Servo horizontal → Broche 6
- Alimentation servos → +5V et GND Arduino
Étape 7 : Test
- Vérifiez le câblage et téléversez le sketch Arduino.
- Fermez l'IDE Arduino (libère le port COM).
- Lancez
face.pyavec IDLE (F5). - La fenêtre vidéo s'ouvre, le visage est détecté, les servos le suivent.
- Fixez la webcam sur le Pan-Tilt pour qu'elle bouge avec les servos.
J'espère que vous avez aimé et appris quelque chose de nouveau. Merci !
Fichiers joints
haarcascade_frontalface_default.xmlface.pyservo.ino
Processus de fabrication
- Construire un capteur de température distant avec Raspberry Pi et Python – Guide étape par étape
- Reconnaissance faciale en temps réel sur Raspberry Pi – Guide complet
- Suivi d'objets automatisé par vision avec Raspberry Pi et OpenCV
- Construire un décodeur DTMF avec un Arduino seul – Aucun CI supplémentaire nécessaire
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100