跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 人脸识别控制 ESP8266 LED 灯实战

本方案利用 Python 的 face_recognition 库实现本地人脸检测,通过 HTTP 协议控制 ESP8266 硬件 LED 灯开关。代码涵盖环境配置、人脸编码加载、实时视频流处理及线程安全控制逻辑,解决了 Windows 下 dlib 编译依赖问题,并提供了摄像头画面状态反馈。适合 IoT 与计算机视觉入门参考。

随缘发布于 2026/2/25更新于 2026/6/1545 浏览

Python 人脸识别控制 ESP8266 LED 灯实战

本项目演示了如何利用 Python 脚本结合 face_recognition 库实现本地人脸检测,并通过 HTTP 协议控制 ESP8266 模块上的 LED 灯。相比直接刷入固件,这种方式更便于在 PC 端进行复杂的图像处理与逻辑调试。

环境准备

核心依赖是 face_recognition 库,它封装了 dlib 等底层算法。安装前请注意以下事项:

pip install face_recognition

如果在 Windows 下遇到编译错误(提示需要 Visual Studio C++ 构建工具),通常是因为缺少 dlib 的预编译包。建议先手动下载并安装 dlib 的 wheel 包,或者安装 Visual Studio Build Tools 后再重试。

核心逻辑说明

代码主要包含三个部分:

  1. 人脸加载:从指定目录读取图片,提取特征编码并缓存到内存中,避免重复计算。
  2. 实时检测:调用摄像头获取视频流,缩小图像尺寸以提升处理速度,再与已知编码比对。
  3. 硬件控制:匹配成功后发送 HTTP 请求开启 LED,并利用线程设置延时关闭,防止频繁触发。

这里特别加入了冷却时间(cooldown)机制,避免同一张脸连续触发导致 LED 状态混乱。

完整代码实现

将已知人脸图片放入 known_faces 文件夹后,运行以下脚本即可。

import requests
import cv2
import face_recognition
import os
import time
import threading

# ESP8266 的 IP 地址配置
ESP8266_IP = "192.168.1.12"
BASE_URL = f"http://{ESP8266_IP}"
TEST_URL = f"{BASE_URL}/text/plain"
LED_ON_URL = f"{BASE_URL}/led/on"
LED_OFF_URL = f"{BASE_URL}/led/off"

class FaceRecognitionSystem:
    def __init__(self):
        """初始化人脸识别系统"""
        self.known_faces_dir = r"D:\PythonProject\known_faces"  # 图片存放地址
        self.known_face_encodings = []
        .known_face_names = []
        .last_trigger_time = 
        .led_cooldown =   
        .led_is_on = 
        
        
        .load_known_faces()

     ():
        
          os.path.exists(.known_faces_dir):
            ()
            
        
        all_files = os.listdir(.known_faces_dir)
         filename  all_files:
            
             filename.lower().endswith((, , )):
                image_path = os.path.join(.known_faces_dir, filename)
                ()
                
                
                :
                    image = face_recognition.load_image_file(image_path)
                 Exception  e:
                    ()
                    
                
                
                face_encodings = face_recognition.face_encodings(image)
                 (face_encodings) > :
                    .known_face_encodings.append(face_encodings[])
                    .known_face_names.append(os.path.splitext(filename)[])
                    ()
                :
                    ()
            :
                ()
        
        ()

     ():
        
          .known_face_encodings:
             
        
        
        small_frame = cv2.resize(frame, (, ), fx=, fy=)
        
        rgb_small_frame = cv2.cvtColor(small_frame, cv2.COLOR_BGR2RGB)
        
        
        face_locations = face_recognition.face_locations(rgb_small_frame)
          face_locations:
             
        
        
        face_encodings = face_recognition.face_encodings(
            rgb_small_frame, face_locations
        )
        
        
         face_encoding  face_encodings:
            matches = face_recognition.compare_faces(
                .known_face_encodings, face_encoding, tolerance=
            )
            
               matches:
                ()
                 
            :
                ()
         

     ():
        
        current_time = time.time()
         should_turn_on   .led_is_on:
            
             current_time - .last_trigger_time >= .led_cooldown:
                ()
                response = requests.get(LED_ON_URL, timeout=)
                 response.status_code == :
                    ()
                    .led_is_on = 
                    .last_trigger_time = current_time
                    
                    
                     ():
                        time.sleep()
                        response = requests.get(LED_OFF_URL, timeout=)
                         response.status_code == :
                            ()
                            .led_is_on = 
                    
                    timer = threading.Thread(target=turn_off_led)
                    timer.daemon = 
                    timer.start()
                :
                    ()

     ():
        
        ()
        :
            response = requests.get(, timeout=)
             response.status_code == :
                ()
                 
        :
            ()
         

 ():
    
    
      test_esp8266_connection():
        ()
        
    
    
    face_system = FaceRecognitionSystem()
      face_system.known_face_encodings:
        ()
        
    
    
    ()
    cap = cv2.VideoCapture()
      cap.isOpened():
        ()
        
    
    ()
    :
         :
            
            ret, frame = cap.read()
              ret:
                ()
                
            
            
            face_detected = face_system.recognize_faces(frame)
            
            
            face_system.control_led(face_detected)
            
            
            status_text =   face_detected  
            color = (, , )  face_detected  (, , )
            cv2.putText(frame, , (, ), 
                        cv2.FONT_HERSHEY_SIMPLEX, , color, )
            cv2.putText(frame,   face_system.led_is_on  ,
                        (, ), cv2.FONT_HERSHEY_SIMPLEX, ,
                        (, , )  face_system.led_is_on  (, , ), )
            cv2.putText(frame, , (, frame.shape[]-), 
                        cv2.FONT_HERSHEY_SIMPLEX, , (, , ), )
            
            
            cv2.imshow(, frame)
            
            
             cv2.waitKey() &  == ():
                
            
            
            time.sleep()
     Exception  e:
        ()
    :
        
        cap.release()
        cv2.destroyAllWindows()
        
        :
             face_system.led_is_on:
                requests.get(LED_OFF_URL, timeout=)
                ()
        :
            
        ()

 __name__ == :
    main()
self
self
0
self
3
# LED 冷却时间(秒)
self
False
# 加载已知人脸
self
def
load_known_faces
self
"""加载已知人脸图片"""
if
not
self
print
f"已知人脸目录不存在:{self.known_faces_dir}"
return
self
for
in
# 检查文件后缀(兼容大小写)
if
'.jpg'
'.jpeg'
'.png'
self
print
f"图片路径:{image_path}"
# 检查文件是否为有效图片
try
except
as
print
f"图片加载失败:{e}"
continue
# 获取人脸编码
if
len
0
self
0
self
0
print
f"已加载人脸:{filename}"
else
print
f"未在图片中检测到人脸:{filename}"
else
print
f"非支持的图片格式:{filename}"
print
f"最终加载人脸数量:{len(self.known_face_encodings)}"
def
recognize_faces
self, frame
"""识别人脸并返回是否匹配已知人脸"""
if
not
self
return
False
# 调整图像大小以加快处理速度
0
0
0.25
0.25
# 转换颜色空间 BGR->RGB
# 检测所有人脸位置
if
not
return
False
# 获取所有人脸编码
# 与已知人脸比较
for
in
self
0.4
# 如果匹配到任意已知人脸
if
True
in
print
"匹配到已知人脸"
return
True
else
print
"未匹配到已知人脸"
return
False
def
control_led
self, should_turn_on
"""控制 LED 开关"""
if
and
not
self
# 检查冷却时间
if
self
self
print
"检测到已知人脸,正在打开 LED..."
3
if
200
print
"LED 已打开"
self
True
self
# 设置 3 秒后关闭的计时器
def
turn_off_led
3
3
if
200
print
"✓ LED 已关闭"
self
False
True
else
print
f"无法打开 LED: {response.status_code}"
def
test_esp8266_connection
self
"""测试 ESP8266 连接"""
print
"测试 ESP8266 连接..."
try
f"{BASE_URL}/"
3
if
200
print
f"ESP8266 连接成功 (IP: {ESP8266_IP})"
return
True
except
print
f"无法连接到 ESP8266 (IP: {ESP8266_IP})"
return
False
def
main
"""主函数"""
# 测试 ESP8266 连接
if
not
print
"连接测试失败,请检查配置"
return
# 初始化人脸识别系统
if
not
print
"未找到已知人脸,请将人脸图片放入 'known_faces' 文件夹"
return
# 打开摄像头
print
"正在打开摄像头..."
0
if
not
print
"无法打开摄像头"
return
print
"摄像头已打开,退出请按 'q' 键退出程序"
try
while
True
# 读取摄像头画面
if
not
print
"无法读取摄像头画面"
break
# 识别人脸
# 控制 LED
# 在画面上显示状态
"已知人脸"
if
else
"未知人脸"
0
255
0
if
else
0
0
255
f"status: {status_text}"
10
30
1
2
"LED: ON"
if
else
"LED: OFF"
10
70
1
0
255
255
if
else
128
128
128
2
"Press 'q' to quit"
10
0
10
0.6
255
255
255
2
# 显示画面
'FaceRecognition'
# 按'q'退出
if
1
0xFF
ord
'q'
break
# 控制处理频率,避免过于频繁
0.1
except
as
print
f"\n程序出错:{e}"
finally
# 释放资源
# 确保 LED 关闭
try
if
2
print
"程序退出,LED 已关闭"
except
pass
print
"程序已结束"
if
"__main__"

后续优化方向

当前方案依赖本地存储和局域网通信,适合演示或内网环境。若需扩展,可考虑将人脸图片上传至云端服务器,预先完成编码计算。识别时仅传输特征值或调用 API,这样能大幅降低本地算力需求,同时支持多设备协同管理。

目录

  1. Python 人脸识别控制 ESP8266 LED 灯实战
  2. 环境准备
  3. 核心逻辑说明
  4. 完整代码实现
  5. ESP8266 的 IP 地址配置
  6. 后续优化方向
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 DeepSeek 与 Cursor 构建智能代码审查工具实战
  • IT 行业转行指南:零基础如何判断自己是否适合?
  • DevOps、Git 与 GitLab 核心概念及实践
  • AIGC 时代产品经理角色定位与核心能力模型解析
  • 工程项目管理系统技术架构与核心功能梳理
  • tavily_dart 在鸿蒙平台适配及 AI 搜索引擎集成实战
  • 美国签证预约自动化监控工具搭建指南
  • Python 安装与环境配置详细教程
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • 别让 AI 越权!OpenClaw 权限配置完全指南
  • 新版 PyCharm 远程连接 SSH 配置指南
  • FPGA 核心概念解析:FMC、VITA、UltraScale、MPSoC 及接口标准
  • Vary-toy:轻量级多模态大模型与消费级显卡部署实践
  • Python 对接微信 API 开发智能客服机器人:从接入到优化
  • 腿式移动机器人:构造、稳定性与生物启发设计
  • OpenClaw 权限配置完全指南
  • 资深程序员分享的 20 条 Python 编程与学习经验
  • 告别 MobaXterm:开源终端模拟器 Tabby 深度对比与迁移指南
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • 基于 Python 与 OpenCV 的自动扫雷程序实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online