Rastreamento facial usando Arduino
Componentes e suprimentos
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
![]() |
| × | 1 |
Aplicativos e serviços online
| ||||
![]() |
|
Sobre este projeto
Em um tutorial anterior, compartilhei como você pode se comunicar entre o Arduino e o Python usando o módulo 'pyserial' e controlar um LED. Se você ainda não viu, confira aqui:COMUNICAÇÃO ENTRE ARDUINO E PYTHON!
E como você pode detectar a cor de um objeto e rastreá-lo na tela, verifique aqui:DETECÇÃO DE COR USANDO OPENCV E PYTHON.
Neste tutorial, mostrarei como rastrear faces usando Arduino e Python e fazer a câmera seguir o rosto. Isso pode parecer difícil, mas acredite em mim, não é. Tudo que você precisa é um conhecimento básico de Arduino e Python.
Então vamos começar...
Etapa 1:Coisas de que você vai precisar
Os requisitos são mínimos. Aqui, forneci uma lista de partes de tudo que você precisa:
Requisitos de hardware:
- Arduino UNO (você pode usar outras placas)
- Web Cam (Mini Web Cam)
- Servos x 2 (estarei usando micro servos, mas você pode usar Servos padrão)
- Breadboard (para prototipagem)
- Kit Servo Pan Tilt (você pode construir um se quiser)
Requisitos de software:
- Python 2.7 (deve ser instalado, o sistema operacional Linux geralmente o tem pré-instalado)
- OpenCV (você pode baixá-lo separadamente ou instalar usando 'pip install' explicado mais adiante)
- pyserial (pode ser instalado com pip)
- entorpecido.
- Haarcascade.
Depois que tudo estiver reunido, podemos prosseguir para a Etapa de Instalação ...
Etapa 2:Configurando o ambiente Python
Instalando Python:



Portanto, primeiro precisamos do Python 2.7 instalado e funcionando. Para fazer isso, primeiro baixe e instale o python 2.7.14. Para verificar se ele está instalado corretamente, vá para: Pesquisa do Windows>> Digite "IDLE">> Pressione Enter. Um Python Shell deve aparecer.
OU
Na pesquisa, digite 'CMD' e pressione Enter para abrir o Prompt de Comando. No CMD, digite >> python e pressione Enter, A interface Python deve ser exibida.
Se você vir um erro no CMD, não entre em pânico, você provavelmente precisará definir a variável de ambiente. Você pode seguir este tutorial Aqui para configurar a variável de ambiente.
Instalação de 'pyserial', 'OpenCV "e" numpy "em Python:
Para instalar esses módulos, usaremos o pip install,
Primeiro abra o CMD e digite os seguintes códigos:-
> pip install serial
> pip install opencv-python
> pip install numpy
esses comandos irão instalar os módulos necessários. Agora podemos passar para a parte de codificação ...
Etapa 3:Script Python

Antes de começar a escrever o código, a primeira coisa a fazer é criar uma nova pasta, pois todo o código precisa ser armazenado na mesma pasta. Portanto, crie uma nova pasta com o nome que desejar. e baixe o 'Haarcascade' abaixo e cole na pasta.
Agora abra o bloco de notas e escreva o script abaixo, salve-o como 'face.py' na mesma pasta do haarcascade. (Você pode baixar o código que forneci no arquivo abaixo):
#importar todos os módulos necessários
importar numpy como np
importar serial
importar tempo
importar sys
importar cv2
#Setup Caminho de comunicação para o arduino (no lugar de 'COM5' coloque a porta à qual seu arduino está conectado)
arduino =serial.Serial ('COM5', 9600)
time.sleep (2)
print ("Conectado ao arduino ...")
#importando o Haarcascade para detecção de rosto
face_cascade =cv2.CascadeClassifier ('haarcascade_frontalface_default.xml')
#Para capturar o fluxo de vídeo de webcam.
cap =cv2.VideoCapture (0)
#Leia a imagem capturada, converta-a para imagem cinza e encontre rostos
enquanto 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)
cinza =cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
faces =face_cascade.detectMultiScale (cinza, 1.3)
#detectar o rosto e faça um retângulo ao redor dele.
para (x, y, w, h) nas faces:
cv2.rectangle (img, (x, y), (x + w, y + h), ( 0,255,0), 5)
roi_gray =cinza [y:y + h, x:x + w]
roi_color =img [y:y + h, x:x + w]
arr ={y:y + h, x:x + w}
imprimir (arr)
imprimir ('X:' + str (x))
imprimir ( 'Y:' + str (y))
print ('x + w:' + str (x + w))
print ('y + h:' + str (y + h))
# Centro de roi (retângulo)
xx =int (x + (x + h)) / 2
yy =int (y + (y + w)) / 2
imprimir (xx)
print (yy)
center =(xx, yy)
# enviando dados para o arduino
print ("Center of Rectangle is:", center)
dados ="X {0:d} Y {1:d} Z" .format (xx, yy)
print ("output ='" + data + "'")
arduino.write ( dados)
#Exibe o fluxo.
cv2.imshow ('img', img)
#Pressione 'Esc' para encerrar a execução
k =cv2.waitKey (30) &0xff
se k ==27:
quebrar
Depois de fazer isso, prossiga para escrever o código para o Arduino ...
haarcascade_frontalface_default.xml face.py
Etapa 4:Código Arduino

Depois que o script python estiver pronto, precisamos do esboço do arduino para controlar o servo. Consulte o código abaixo, cole-o no Arduino IDE e salve-o como 'servo.ino' na mesma pasta que face.py e haarcascade. carregue o código e passe para a próxima etapa para fazer as conexões.
(Arquivo para download fornecido abaixo.)
#include
Servo servoVer; // Servo vertical
Servo servoHor; // Servo horizontal
int x;
int y;
int prevX;
int prevY;
configuração vazia ()
{
Serial .begin (9600);
servoVer.attach (5); // Anexe o servo vertical ao pino 5
servoHor.attach (6); // Anexe o servo horizontal ao pino 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);
}
}
void loop ()
{
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
Etapa 5:Mecanismo de Pan-Tilt:-

Usei um kit já disponível para o Pan-Tilt. Se quiser, pode fazer você mesmo usando madeira / plástico ou até mesmo imprimir em 3D.
O que usei é muito barato e muito fácil de montar. No entanto, se quiser instruções sobre como fazer isso, você pode encontrá-las aqui.
Etapa 6:Fazendo conexões


O circuito é muito simples. Basta conectar dois servos ao Arduino.
- Vertical para pino 5
- horizontal para pino 6
- Potência para + 5V
- Terra para GND
Verifique o diagrama do circuito para referência.
Etapa 7:Teste
- Depois que tudo é feito, a última coisa a fazer é testar se funciona. Para testar primeiro, certifique-se de que os servos estão conectados corretamente ao arduino e que o sketch foi carregado.
- Após o upload do esboço, certifique-se de fechar o IDE para que a porta esteja livre para se conectar ao python.
- Agora abra 'face.py' com Python IDLE e pressione 'F5' para executar o código. A conexão com o arduino levará alguns segundos e você deverá ver uma janela transmitindo a webcam. Agora o código detectará seu rosto e os servos o rastrearão.
- O servo deve se mover conforme você move o objeto. Agora, basta conectar a câmera aos servos para que ela se mova junto com os servos.
Espero que você goste. e aprender algo novo.
Obrigada!
Código
- servo.ino
- Snippet de código # 2
- Snippet de código # 3
servo.ino Arduino
Erro ao abrir o arquivo.Snippet de código # 2 Texto simples
#importar todos os módulos necessáriosimportar numpy como npimport serialimport timeimport sysimport cv2 # Configurar caminho de comunicação para arduino (no lugar de 'COM5' coloque a porta à qual seu arduino está conectado) arduino =serial.Serial ('COM5', 9600 ) time.sleep (2) print ("Conectado ao arduino ...") # importando o Haarcascade para detecção de rostoface_cascade =cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') # Para capturar o fluxo de vídeo de webcam.cap =cv2.VideoCapture (0) #Leia a imagem capturada, converta-a para imagem cinza e encontre faces enquanto 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) cinza =cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) faces =face_cascade.detectMultiScale (cinza, 1.3) #detecte a face e faça um retângulo ao redor dela. para (x, y, w, h) nas faces:cv2.rectangle (img, (x, y), (x + w, y + h), (0,255,0), 5) roi_gray =cinza [y:y + h, x:x + w] cor_roi =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 (Retângulo) xx =int (x + (x + h)) / 2 yy =int (y + (y + w)) / 2 imprimir (xx) imprimir (yy) centro =(xx, yy) # envio dados para arduino print ("Centro do retângulo é:", centro) data ="X {0:d} Y {1:d} Z" .format (xx, yy) print ("output ='" + data + "' ") arduino.write (data) #Exibe o stream. cv2.imshow ('img', img) #Hit 'Esc' para encerrar a execução k =cv2.waitKey (30) &0xff if k ==27:break
Snippet de código # 3 Texto simples
#includeServo servoVer; // ServoServo vertical servoHor; // Servoint horizontal x; int y; int prevX; int prevY; void setup () {Serial.begin (9600); servoVer.attach (5); // Anexe o servo vertical ao pino 5 servoHor.attach (6); // Anexe o servo horizontal ao pino 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); }} void loop () {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 (); }}}
Processo de manufatura
- Sensor de temperatura Python e Raspberry Pi
- Reconhecimento facial em tempo real:um projeto de ponta a ponta
- Rastreamento automático de objetos de visão
- Decodificador DTMF usando apenas Arduino
- Faça Monitor Ambilight usando Arduino
- Sistema de atendimento usando Arduino e RFID com Python
- Máquina de LEVITAÇÃO ULTRASÔNICA Usando ARDUINO
- Faça você mesmo voltímetro usando Arduino e Smartphone
- Monitor de freqüência cardíaca usando IoT
- WebServerBlink usando Arduino Uno WiFi