Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Suivi du visage à l'aide d'Arduino

Composants et fournitures

Arduino UNO
× 1
webcam
× 1
Micro servos
× 2
Pan-Tilt
× 1
Planche à pain (générique)
× 1

Applications et services en ligne

Python 2.7
OpenCV

À propos de ce projet

Dans un tutoriel précédent, j'ai expliqué comment vous pouvez communiquer entre Arduino et Python à l'aide du module 'pyserial' et contrôler une LED. Si vous ne l'avez pas vu, regardez ici :COMMUNICATION ENTRE ARDUINO ET PYTHON !

Et comment vous pouvez détecter la couleur d'un objet et le suivre à l'écran, vérifiez-le ici :DÉTECTION DE COULEUR À L'AIDE D'OPENCV ET DE PYTHON.

Dans ce tutoriel, je vais vous montrer comment suivre les visages à l'aide d'Arduino et Python et faire en sorte que la caméra suive le visage. Cela peut sembler difficile, mais croyez-moi, ce n'est pas le cas, tout ce dont vous avez besoin est une connaissance de base d'Arduino et de Python.

Alors commençons...

Étape 1 : choses dont vous aurez besoin

Les exigences sont minimales. Ici, j'ai fourni une liste de pièces de tout ce dont vous avez besoin :

Configuration matérielle requise :

  • Arduino UNO (Vous pouvez utiliser d'autres cartes)
  • Web Cam (Mini Web Cam)
  • Servos x 2 (j'utiliserai des micro-servos mais vous pouvez utiliser des servos standard)
  • Planche à pain (pour le prototypage)
  • Kit Servo Pan Tilt (Vous pouvez en construire un si vous le souhaitez)

Configuration logicielle requise :

  • Python 2.7 (doit être installé, le système d'exploitation Linux l'a généralement pré-installé)
  • OpenCV (vous pouvez le télécharger séparément ou l'installer en utilisant 'pip install' expliqué plus loin)
  • pyserial (peut être installé avec pip)
  • numpy.
  • Haarcascade.

Une fois que tout est rassemblé, nous pouvons passer à l'étape d'installation...

Étape 2 :Configuration de l'environnement Python

Installation de Python :

Nous avons donc d'abord besoin de Python 2.7 opérationnel. Pour ce faire, téléchargez et installez python 2.7.14. Pour vérifier s'il est correctement installé, allez à :Recherche Windows>> Tapez "IDLE">> Appuyez sur Entrée. Un shell Python devrait apparaître.

OU

Dans la recherche, tapez « CMD » et appuyez sur Entrée pour ouvrir l'invite de commande. Dans CMD, tapez >> python et appuyez sur Entrée, L'interface Python devrait s'afficher.

Si vous voyez une erreur dans CMD, ne paniquez pas, vous devrez probablement définir une variable d'environnement. Vous pouvez suivre ce tutorielIci pour configurer la variable d'environnement.

Installation de 'pyserial', 'OpenCV" et "numpy" en Python :

Pour installer ces modules, nous utiliserons pip install,

Ouvrez d'abord CMD et tapez les codes suivants :-

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

ces commandes installeront les modules nécessaires. Passons maintenant à la partie codage...

Étape 3 : Script Python

Avant de commencer à écrire du code, la première chose à faire est de créer un nouveau dossier car tout le code doit être stocké dans le même dossier. Alors créez un nouveau dossier, nommez-le comme vous voulez. et téléchargez le 'Haarcascade' ci-dessous et collez-le dans le dossier.

Maintenant, ouvrez le bloc-notes et écrivez le script ci-dessous, enregistrez-le sous le nom 'face.py' dans le même dossier que haarcascade. (Vous pouvez télécharger le code que j'ai fourni le fichier ci-dessous) :

#importer tous les modules requis
importer numpy en tant que np
importer serial
import time
import sys
import cv2
#Setup Chemin de communication pour arduino (à la place de 'COM5' placez le port auquel votre arduino est connecté)
arduino =serial.Serial('COM5', 9600)
time.sleep(2)
print("Connecté à arduino...")
#Importation de Haarcascade pour la détection de visage
face_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#Pour capturer le flux vidéo de webcam.
cap =cv2.VideoCapture(0)
#Lire l'image capturée, la convertir en image grise et trouver des visages
pendant 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)
#détecter le visage et faire un rectangle autour.
pour (x,y,w,h) dans les 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]
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))
# Centre du roi (Rectangle)
xx =int(x+(x+h))/2
yy =int(y+(y+w))/2
print (xx)
print (yy)
center =(xx,yy)
# envoi de données à arduino
print("Center of Rectangle is :", center)
data ="X{0:d}Y{1:d}Z".format(xx, yy)
print ("output ='" +data+ "'")
arduino.write( data)
#Afficher le flux.
cv2.imshow('img',img)
#Appuyez sur 'Esc' pour terminer l'exécution
k =cv2.waitKey(30) &0xff
si k ==27 :
rupture

Une fois cela fait, passez à l'écriture du code pour Arduino...

haarcascade_frontalface_default.xml face.py

Étape 4 : Code Arduino

Une fois le script python prêt, nous avons besoin d'un croquis arduino pour contrôler le servo. Référez-vous au code ci-dessous, collez-le dans Arduino IDE et enregistrez-le sous le nom « servo.ino » dans le même dossier que face.py et haarcascade. téléchargez le code et passez à l'étape suivante pour établir les connexions.

(Fichier téléchargeable ci-dessous.)

#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); //Fixer le servo vertical à la broche 5
servoHor.attach(6); //Fixer le servo horizontal à la broche 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);
}
}
boucle vide()
{
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

Étape 5 :Mécanisme Pan-Tilt :-

J'ai utilisé un kit facilement disponible pour le Pan-Tilt. Si vous le souhaitez, vous pouvez en fabriquer un vous-même en utilisant du bois/plastique ou même en imprimer un en 3D.

Celui que j'ai utilisé est assez bon marché et très facile à assembler. Pourtant, si vous voulez des instructions sur la façon de procéder, vous pouvez les trouver ici.

Étape 6 :établir des connexions

Le circuit est assez simple. Attachez simplement deux servos à l'arduino.

  • Vertical à la broche 5
  • Horizontale à la broche 6
  • Alimentation jusqu'à +5 V
  • Terre à GND

Consultez le schéma de circuit pour référence.

Étape 7 :Tests

  • Une fois que tout est terminé, la dernière chose à faire est de tester si cela fonctionne. Pour tester d'abord, assurez-vous que les servos sont correctement connectés à l'arduino et que le croquis est téléchargé.
  • Une fois le sketch téléchargé, assurez-vous de fermer l'IDE afin que le port soit libre de se connecter à python.
  • Ouvrez maintenant « face.py » avec Python IDLE et appuyez sur « F5 » pour exécuter le code. Il faudra quelques secondes pour se connecter à arduino, puis vous devriez pouvoir voir une fenêtre diffusant la webcam en streaming. Maintenant, le code détectera votre visage et les servos le suivront.
  • Le servo doit bouger lorsque vous déplacez l'objet. Maintenant, fixez simplement la caméra aux servos pour qu'elle se déplace avec les servos.

J'espère que vous aimez. et apprenez quelque chose de nouveau.

Merci !

Code

  • servo.ino
  • Extrait de code 2
  • Extrait de code 3
servo.inoArduino
Erreur lors de l'ouverture du fichier.
Extrait de code #2Texte brut
#importer tous les modules requisimport numpy en tant que npimport serialimport timeimport sysimport cv2#Setup Chemin de communication pour arduino (à la place de 'COM5' placez le port auquel votre arduino est connecté)arduino =serial.Serial('COM5', 9600 ) time.sleep(2)print("Connecté à arduino...")#Importation de Haarcascade pour la détection de visageface_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#Pour capturer le flux vidéo de webcam.cap =cv2.VideoCapture (0)#Lire l'image capturée, la convertir en image grise et trouver des visages pendant 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)#détecter le visage et faire un rectangle autour de lui. pour (x,y,w,h) dans les 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] 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)) # Centre du retour (Rectangle) xx =int(x+(x+h))/2 yy =int(y+(y+w))/2 print (xx) print (yy) center =(xx,yy)# envoi data vers arduino print("Center of Rectangle is :", center) data ="X{0:d}Y{1:d}Z".format(xx, yy) print ("output ='" +data+ "' ") arduino.write(data)#Afficher le flux. cv2.imshow('img',img)#Appuyez sur 'Esc' pour terminer l'exécution k =cv2.waitKey(30) &0xff if k ==27 :break
Extrait de code n°3Texte brut
#includeServo ServoVer ; //ServoServo ServoHor vertical ; //Servoint horizontal x;int y;int prevX;int prevY;void setup(){ Serial.begin(9600); servoVer.attach(5) ; // Attachez le servo vertical à la broche 5 servoHor.attach (6); // Attacher le servo horizontal à la broche 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); }}boucle vide(){ 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(); } }}

Processus de fabrication

  1. Capteur de température Python et Raspberry Pi
  2. Reconnaissance faciale en temps réel :un projet de bout en bout
  3. Suivi automatique des objets de vision
  4. Décodeur DTMF utilisant uniquement Arduino
  5. Créer un moniteur Ambilight à l'aide d'Arduino
  6. Système de présence utilisant Arduino et RFID avec Python
  7. Machine à LÉVITATION ULTRASONIQUE utilisant ARDUINO
  8. Voltmètre DIY utilisant Arduino et Smartphone
  9. Moniteur de fréquence cardiaque utilisant l'IoT