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

人脸追踪摄像头

组件和用品

Arduino UNO
× 1
网络摄像头
× 1
橡皮筋
× 1
9V 1A 开关电源
× 1
MG-90s 舵机
× 2
2.1*5.5mm 插头
× 1
线性调节器 (7805)
× 1
M2*10mm 自攻螺丝
× 15
回形针
× 1
连接线套件,22 AWG
× 1
pin header
× 1
5 毫米 LED:红色
× 1
5 毫米 LED:绿色
× 1
5 毫米 LED:黄色
× 1
电阻 220 ohm
× 3
热缩管
× 1

必要的工具和机器

剥线钳和切割机,18-10 AWG / 0.75-4mm²容量线
钳子,长鼻子
烙铁(通用)
万用表
螺丝刀
3D 打印机(通用)

应用和在线服务

Microsoft Windows 10

关于这个项目


几个月前,为了好玩,我建模并打印了我同事的一个头像。我认为推这个笑话并为这个头部建立一个机制会很有趣,它可以检测到人并在他们在房间里走动时一直盯着他们。

我努力使机制足够小以适合我的 3D 打印,所以我决定制作一个易于组装的模型和易于使用的软件,让每个人都可以享受和构建.

................. https://www.littlefrenchkev.com/face-tracking-camera-mini..................

它是如何工作的?

相机使用由 Arduino Uno 驱动的两个伺服系统移动。将相机插入计算机,计算机上的软件会尝试在从相机接收到的图像中查找人脸。

如果找到人脸,软件会向Arduino发送消息,让相机移动,以使检测到的人脸位于图像的中心。

如果没有找到人脸,软件会向Arduino发送一条消息,让它移动到一个随机位置。

我试图通过以下选项使软件非常灵活:

  • 可修改的伺服范围
  • 可以反转舵机旋转
  • 手动控制

希望这将使其易于用于其他目的。

我还添加了 3 个 LED 来显示检测状态,红色表示未检测到,黄色表示检测到面部但不在图像中央,绿色表示检测到面部且位于图像中央。

LED 本身并不是很有趣,但应该很容易修改设备以执行有用的操作,而不仅仅是打开和关闭一些灯。

Arduino 和软件之间的通信是通过串行通信(通过 USB)完成的。

人脸检测软件是用 Python 编写的。我将所有 Python 文件留在 GitHub 上,以防您想查看代码(警告:它可能不是很好,我正在自己学习)或将它们重用于您自己的项目。

如果您不喜欢 Python,您也可以在我的网站上下载可执行版本。

如果您想构建自己的,请查看以下视频。我试图让它们尽可能容易理解,我希望我在这方面做得很好。

您需要的一切

组装

接线

软件和设置


代码

  • Arduino 代码
Arduino 代码C/C++
这是将上传到arduino的代码
//Sketch基于Robin2在arduino论坛上所做的工作//更多信息在这里//https://forum.arduino.cc/index.php?topic=225329.msg1810764#msg1810764#include 伺服平移伺服;伺服倾斜伺服; byte redledPin =2;byte yellowledPin =3;byte greenledPin =4;const byte buffSize =40;char inputBuffer[buffSize];const char startMarker ='<';const char endMarker ='>';byte bytesRecvd =0;boolean readInProgress =false;boolean newDataFromPC =false;float panServoAngle =90.0;floattiltServoAngle =90.0;int LED_state =0;//8=============Dvoid setup() { Serial.begin(115200); panServo.attach(8);倾斜伺服.attach(9); pinMode(redledPin,输出); pinMode(yellowledPin, OUTPUT); pinMode(greenledPin,输出); //移动伺服();开始序列();延迟(200); Serial.println(""); // 向计算机发送消息}//8============Dvoid loop() { getDataFromPC();回复ToPC();移动伺服(); setLED();}//8============Dvoid getDataFromPC() { // 从 PC 接收数据并将其保存到 inputBuffer if(Serial.available()> 0) { char x =Serial.read(); // 从串行读取字符 if (x ==endMarker) { // 寻找结束标记 readInProgress =false; //如果找到,设置read in progress true(将停止向缓冲区添加新字节) newDataFromPC =true; //让arduino知道有新数据可用 inputBuffer[bytesRecvd] =0; //清除输入缓冲区 processData(); // 处理缓冲区中的数据 } if(readInProgress) { inputBuffer[bytesRecvd] =x; //用字节bytesRecvd ++填充输入缓冲区; //增加索引 if (bytesRecvd ==buffSize) { //当缓冲区已满 bytesRecvd =buffSize - 1; // 为结束标记保留空间 } } if (x ==startMarker) { // 寻找开始标记 bytesRecvd =0; // 如果找到,将接收到的字节设置为 0 readInProgress =true; // 设置读取进行中为真 } }}//8============Dvoid processData() // 对于数据类型“” { char * strtokIndx; // 这被 strtok() 用作索引 strtokIndx =strtok(inputBuffer,","); // 获取第一部分 panServoAngle =atof(strtokIndx); // 将此部分转换为浮点数 strtokIndx =strtok(NULL,","); // 获取第二部分(从前一个调用停止的地方继续)tiltServoAngle =atof(strtokIndx); // 将此部分转换为浮点数 strtokIndx =strtok(NULL, ","); // 得到最后一部分 LED_state =atoi(strtokIndx); // 将此部分转换为整数(字符串到整数)}//8============Dvoid replyToPC() { if (newDataFromPC) { newDataFromPC =false; Serial.print("<"); Serial.print(panServo.read()); Serial.print(","); Serial.print(tiltServo.read()); Serial.println(">"); }}//8============Dvoid moveServo() { panServo.write(panServoAngle); tiltServo.write(tiltServoAngle);}void setLED(){ if(LED_state ==2){ digitalWrite(redledPin, LOW);数字写入(yellowledPin,高);数字写入(greenledPin,低); } else if(LED_state ==1){ digitalWrite(redledPin, LOW);数字写入(黄色引脚,低);数字写入(greenledPin,高); } else if(LED_state ==0){ digitalWrite(redledPin, HIGH);数字写入(黄色引脚,低);数字写入(greenledPin,低); } else if(LED_state ==3){ digitalWrite(redledPin, HIGH);数字写入(yellowledPin,高);数字写入(greenledPin,高); } else{ digitalWrite(redledPin, LOW);数字写入(黄色引脚,低);数字写入(greenledPin,低); } //8============D void start_sequence() { panServo.write(90);倾斜伺服.写(90);延迟(300);数字写入(redledPin,高);延迟(100);数字写入(redledPin,低);数字写入(yellowledPin,高);延迟(100);数字写入(黄色引脚,低);数字写入(greenledPin,高);延迟(100);数字写入(redledPin,低);数字写入(黄色引脚,低);数字写入(greenledPin,低);延迟(100);数字写入(redledPin,高);数字写入(yellowledPin,高);数字写入(greenledPin,高);延迟(100);数字写入(redledPin,低);数字写入(黄色引脚,低);数字写入(greenledPin,低); }
人脸检测软件
这是您可以找到人脸检测软件文件的存储库。您也可以在我的网站上找到可执行版本。https://github.com/LittleFrenchKev/face_tracking_camera

定制零件和外壳

人脸追踪摄像头部件
构建面部跟踪相机 mini 所需的所有部件。您也可以在这里找到它们:https://www.littlefrenchkev.com/downloadCAD 文件在 thingiverse.com

示意图


制造工艺

  1. 使用树莓派进行平移/倾斜面部跟踪
  2. 井字游戏名片
  3. 多温度传感器
  4. 862D+的DIY烙铁控制
  5. MotionSense
  6. 3D 打印机消防安全
  7. 带有 Arduino、Yaler 和 IFTTT 的物联网仪表
  8. Arduino 排斥电磁悬浮
  9. 遥控夹爪机器人
  10. Arduino Powered Weather Balloon Datalogger
  11. 智能人脸追踪机器人车
  12. CoroFence - 热探测器🖖