人脸追踪摄像头
组件和用品
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 2 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 15 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 3 | |||
| × | 1 |
必要的工具和机器
![]() |
| |||
![]() |
| |||
![]() |
| |||
| ||||
| ||||
![]() |
|
应用和在线服务
![]() |
|
关于这个项目

几个月前,为了好玩,我建模并打印了我同事的一个头像。我认为推这个笑话并为这个头部建立一个机制会很有趣,它可以检测到人并在他们在房间里走动时一直盯着他们。
我努力使机制足够小以适合我的 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示意图

制造工艺