亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

使用 Arduino 进行面部跟踪

组件和用品

Arduino UNO
× 1
网络摄像头
× 1
微型舵机
× 2
平移-倾斜
× 1
面包板(通用)
× 1

应用和在线服务

Python 2.7
OpenCV

关于这个项目

在之前的教程中,我分享了如何使用“pyserial”模块在 Arduino 和 Python 之间进行通信并控制 LED。如果您还没有看过,请在此处查看:ARDUINO 与 PYTHON 之间的通信!

以及如何检测对象的颜色并在屏幕上对其进行跟踪,请在此处查看:使用 OpenCV 和 PYTHON 的颜色检测。

在本教程中,我将向您展示如何使用 Arduino 和 Python 跟踪面部并使相机跟随面部。这听起来可能很困难,但相信我,事实并非如此,您只需要了解 Arduino 和 Python 的基本知识。

那么让我们开始吧...

第 1 步:您需要的东西

要求是最低的。在这里,我提供了您需要的所有物品的零件清单:

硬件要求:

  • Arduino UNO(您可以使用其他板)
  • 网络摄像头(迷你网络摄像头)
  • 舵机 x 2(我将使用微型舵机,但您可以使用标准舵机)
  • 面包板(用于原型制作)
  • 伺服平移倾斜套件(如果需要,您可以构建一个)

软件要求:

  • Python 2.7(应安装,Linux 操作系统通常已预装)
  • OpenCV(您可以单独下载或使用 'pip install' 安装 进一步解释)
  • pyserial(可以用pip安装)
  • 麻木。
  • Haarcascade。

收集完所有东西后,我们可以继续进行安装步骤...

第 2 步:设置 Python 环境

安装 Python:

所以首先我们需要启动并运行 Python 2.7。为此,请先下载并安装 python 2.7.14。要检查它是否安装正确,请转到:Windows Search>> 输入“IDLE”>> 按 Enter。 应该会弹出一个 Python Shell。

在搜索中输入“CMD”并按回车键打开命令提示符。在 CMD 中输入 >> python 并回车, 应显示 Python 界面。

如果您在 CMD 中看到错误,请不要惊慌,您可能需要设置环境变量。您可以按照本教程这里 设置环境变量。

在 Python 中安装“pyserial”、“OpenCV”和“numpy”:

要安装这些模块,我们将使用 pip install,

首先打开CMD,输入以下代码:-

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

这些命令将安装必要的模块。现在我们可以转到编码部分了...

第 3 步:Python 脚本

在开始编写代码之前,首先要做的是创建一个新文件夹,因为所有代码都需要存储在同一个文件夹中。因此,创建一个新文件夹,将其命名为您想要的任何名称。并从下面下载“Haarcascade”并将其粘贴到文件夹中。

现在打开记事本并编写下面给出的脚本,在与 haarcascade 相同的文件夹中将其另存为“face.py”。 (您可以下载我在下面提供的文件的代码):

#import 所有需要的模块
import numpy as np
import serial
import time
import sys
import cv2
#Setup arduino 的通信路径(代替 'COM5' 放置您的 arduino 连接的端口)
arduino =serial.Serial('COM5', 9600)
time.sleep(2)
print("Connected to arduino...")
#导入Haarcascade进行人脸检测
face_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#从webcam.
cap =cv2.VideoCapture(0)
#读取捕获的图像,将其转换为灰度图像并找到人脸
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)
#检测人脸和围绕它做一个矩形。
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),( 0,255,0),5)
roi_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))
打印('x+w :' +str(x+w))
打印('y+h :' +str(y+h))
# roi 的中心(矩形)
xx =int(x+(x+h))/2
yy =int(y+(y+w))/2
print (xx)
print (yy)
center =(xx,yy)
# 发送数据到arduino
print("矩形的中心是:", center)
data ="X{0:d}Y{1:d}Z".format(xx, yy)
print ("output ='" +data+ "'")
arduino.write( data)
#显示流
cv2.imshow('img',img)
#Hit 'Esc' 终止执行
k =cv2.waitKey(30) &0xff
如果 k ==27:
中断

完成后,继续为 Arduino 编写代码...

haarcascade_frontalface_default.xml 人脸.py

第 4 步:Arduino 代码

在 python 脚本准备好后,我们需要 arduino 草图来控制伺服。请参考以下代码,将其粘贴到 Arduino IDE 中,并将其另存为“servo.ino”与 face.py 和 haarcascade 相同的文件夹中。上传代码并继续下一步以建立连接。

(下面给出了可下载的文件。)

#include
ServoservoVer; //垂直伺服
伺服舵机Hor; //水平伺服
int x;
int y;
int prevX;
int prevY;
void setup()
{
串行.begin(9600);
servoVer.attach(5); //将垂直伺服连接到引脚 5
servoHor.attach(6); //将水平伺服附加到引脚 6
servoVer.write(90);
servoHor.write(90);
}
void Pos()
{
if(prevX !=x || prevY !=y)
{
int伺服X =map(x, 600, 0, 70, 179);
int伺服Y =map(y , 450, 0, 179, 95);
servoX =min(servoX, 179);
servoX =max(servoX, 70);
servoY =min(servoY, 179);
伺服Y =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();
}
}
}
伺服文件

第 5 步:平移-倾斜机制:-

我为 Pan-Tilt 使用了现成的套件。如果你愿意,你可以用木头/塑料甚至 3D 打印一个。

我用的那个很便宜,而且很容易组装。但是,如果您需要有关如何执行此操作的说明,可以在此处找到。

第 6 步:建立联系

电路非常简单。只需将两个伺服器连接到 arduino。

  • 垂直到 Pin 5
  • 水平到引脚 6
  • 电源至 +5V
  • 接地到 GND

检查电路图以供参考。

第 7 步:测试

  • 一切都完成后,最后要做的就是测试它是否有效。首先要进行测试,确保舵机正确连接到 arduino 并上传了草图。
  • 上传 Sketch 后,请确保关闭 IDE,以便端口可以自由连接到 python。
  • 现在使用 Python IDLE 打开“face.py”并按“F5”运行代码。连接到 arduino 需要几秒钟,然后您应该能够看到一个窗口正在传输网络摄像头。现在代码将检测您的脸,伺服系统将跟踪它并跟踪它。
  • 伺服应该随着您移动物体而移动。现在只需将相机连接到伺服系统,它就会与伺服系统一起移动。

希望你喜欢。并学习新的东西。

谢谢!

代码

  • servo.ino
  • 代码片段#2
  • 代码片段 #3
servo.inoArduino
打开文件时出错。
代码片段#2纯文本
#import all the required modulesimport numpy as npimport serialimport timeimport sysimport cv2#Setup arduino的通信路径(代替'COM5'放置你的arduino连接的端口)arduino =serial.Serial('COM5', 9600 ) time.sleep(2)print("Connected to arduino...")#导入Haarcascade进行人脸检测face_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#从webcam.cap中捕获视频流=cv2.VideoCapture (0)#读取捕获的图像,将其转换为灰度图像并找到人脸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)#检测人脸并在其周围画一个矩形。对于 (x,y,w,h) 在面孔: 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)) 打印 ('Y :'+str(y)) 打印 ('x+w :' +str(x+w)) 打印 ('y+h :' +str(y+h)) # roi 的中心(矩形) xx =int(x+(x+h))/2 yy =int(y+(y+w))/2 print (xx) print (yy) center =(xx,yy)# sent data to arduino print("矩形的中心是:", center) data ="X{0:d}Y{1:d}Z".format(xx, yy) print ("output ='" +data+ "' ") arduino.write(data)#显示流。 cv2.imshow('img',img)#Hit 'Esc' 终止执行 k =cv2.waitKey(30) &0xff if k ==27:break
代码片段 #3纯文本
#include伺服servoVer; //立式伺服伺服舵机Hor; //水平伺服x;int y;int prevX;int prevY;void setup(){ Serial.begin(9600);伺服Ver.attach(5); //将垂直伺服连接到引脚5伺服Hor.attach(6); //将水平伺服附加到引脚6servoVer.write(90);伺服Hor.write(90);}void Pos(){ if(prevX !=x || prevY !=y) { intservoX =map(x, 600, 0, 70, 179); int伺服Y =map(y, 450, 0, 179, 95);伺服 X =分钟(伺服 X,179);伺服X =最大值(伺服X,70);伺服Y =分钟(伺服Y,179);伺服Y =max(伺服Y,95);伺服Hor.write(servoX);伺服器.write(servoY); }}void loop(){ if(Serial.available()> 0) { if(Serial.read() =='X') { x =Serial.parseInt(); if(Serial.read() =='Y') { y =Serial.parseInt();位置(); } } while(Serial.available()> 0) { Serial.read(); } }}

制造工艺

  1. Python 和 Raspberry Pi 温度传感器
  2. 实时人脸识别:端到端项目
  3. 自动视觉对象跟踪
  4. 仅使用 Arduino 的 DTMF 解码器
  5. 使用 Arduino 制作流光溢彩监视器
  6. 使用 Arduino 和 RFID 和 Python 的考勤系统
  7. 使用 ARDUINO 的超声波悬浮机器
  8. 使用 Arduino 和智能手机的 DIY 电压表
  9. 使用物联网的心率监测器
  10. WebServerBlink 使用 Arduino Uno WiFi
  11. 使用 Python 的物联网温度计
  12. 使用 arduino 的自动化恐龙游戏