news 2026/4/23 11:21:57

基于Python进行人脸识别控制小灯闪烁(识别到指定人脸)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Python进行人脸识别控制小灯闪烁(识别到指定人脸)

这里我没有给 ESP8266 刷入 MicroPython 固件,而是用的Python和Mixly(在Mixly上写的代码,这个是一个可以图形化的软件,也可以进行部分代码编写,当然复杂程序还是用Arduino IDE,这边两者都可实现,以下仅展示用Mixly2.0进行的操作),且是HTTP服务器版本,非MQTT版本。

此篇是在该篇基础上进行了优化可点此处直接跳转,引入了人脸识别(即校验到指定人脸才亮灯)

用了face_recognition人脸识别库,需要先进行安装:

pipinstallface_recognition

注意如果安装过程中如果有报错类似:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!You must use Visual Studio to build a python extension on windows. If you are getting this error it means you have not installed Visual C++. Note that there are many flavors of Visual Studio, like Visual StudioforC#development. You need toinstallVisual StudioforC++.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

可以先安装Visual Studio的C++构建工具
或者直接下载dlib库,然后再pip install face_recognition。
dlib包链接:dlib包链接

以下是代码:

importrequestsimportcv2importface_recognitionimportosimporttimeimportthreading# 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"classFaceRecognitionSystem:def__init__(self):"""初始化人脸识别系统"""self.known_faces_dir=r"D:\PythonProject\known_faces"# 图片存放地址self.known_face_encodings=[]self.known_face_names=[]self.last_trigger_time=0self.led_cooldown=3# LED冷却时间(秒)self.led_is_on=False# 加载已知人脸self.load_known_faces()defload_known_faces(self):"""加载已知人脸图片"""ifnotos.path.exists(self.known_faces_dir):print(f"已知人脸目录不存在:{self.known_faces_dir}")returnall_files=os.listdir(self.known_faces_dir)forfilenameinall_files:# 检查文件后缀(兼容大小写)iffilename.lower().endswith(('.jpg','.jpeg','.png')):image_path=os.path.join(self.known_faces_dir,filename)print(f"图片路径:{image_path}")# 检查文件是否为有效图片try:image=face_recognition.load_image_file(image_path)exceptExceptionase:print(f"图片加载失败:{e}")continue# 获取人脸编码face_encodings=face_recognition.face_encodings(image)iflen(face_encodings)>0:self.known_face_encodings.append(face_encodings[0])self.known_face_names.append(os.path.splitext(filename)[0])print(f"已加载人脸:{filename}")else:print(f"未在图片中检测到人脸:{filename}")else:print(f"非支持的图片格式:{filename}")print(f"最终加载人脸数量:{len(self.known_face_encodings)}")defrecognize_faces(self,frame):"""识别人脸并返回是否匹配已知人脸"""ifnotself.known_face_encodings:returnFalse# 调整图像大小以加快处理速度small_frame=cv2.resize(frame,(0,0),fx=0.25,fy=0.25)# 转换颜色空间 BGR->RGBrgb_small_frame=cv2.cvtColor(small_frame,cv2.COLOR_BGR2RGB)# 检测所有人脸位置face_locations=face_recognition.face_locations(rgb_small_frame)ifnotface_locations:returnFalse# 获取所有人脸编码face_encodings=face_recognition.face_encodings(rgb_small_frame,face_locations)# 与已知人脸比较forface_encodinginface_encodings:matches=face_recognition.compare_faces(self.known_face_encodings,face_encoding,tolerance=0.4)# 如果匹配到任意已知人脸ifTrueinmatches:print("匹配到已知人脸")returnTrueelse:print("未匹配到已知人脸")returnFalsedefcontrol_led(self,should_turn_on):"""控制LED开关"""current_time=time.time()ifshould_turn_onandnotself.led_is_on:# 检查冷却时间ifcurrent_time-self.last_trigger_time>=self.led_cooldown:print("检测到已知人脸,正在打开LED...")response=requests.get(LED_ON_URL,timeout=3)ifresponse.status_code==200:print("LED已打开")self.led_is_on=Trueself.last_trigger_time=current_time# 设置3秒后关闭的计时器defturn_off_led():time.sleep(3)response=requests.get(LED_OFF_URL,timeout=3)ifresponse.status_code==200:print("✓ LED已关闭")self.led_is_on=Falsetimer=threading.Thread(target=turn_off_led)timer.daemon=Truetimer.start()else:print(f"无法打开LED:{response.status_code}")deftest_esp8266_connection():"""测试ESP8266连接"""print("测试ESP8266连接...")try:response=requests.get(f"{BASE_URL}/",timeout=3)ifresponse.status_code==200:print(f"ESP8266连接成功 (IP:{ESP8266_IP})")returnTrueexcept:print(f"无法连接到ESP8266 (IP:{ESP8266_IP})")returnFalsedefmain():"""主函数"""# 测试ESP8266连接ifnottest_esp8266_connection():print("连接测试失败,请检查配置")return# 初始化人脸识别系统face_system=FaceRecognitionSystem()ifnotface_system.known_face_encodings:print("未找到已知人脸,请将人脸图片放入 'known_faces' 文件夹")return# 打开摄像头print("正在打开摄像头...")cap=cv2.VideoCapture(0)ifnotcap.isOpened():print("无法打开摄像头")returnprint("摄像头已打开,退出请按 'q' 键退出程序")try:whileTrue:# 读取摄像头画面ret,frame=cap.read()ifnotret:print("无法读取摄像头画面")break# 识别人脸face_detected=face_system.recognize_faces(frame)# 控制LEDface_system.control_led(face_detected)# 在画面上显示状态status_text="已知人脸"ifface_detectedelse"未知人脸"color=(0,255,0)ifface_detectedelse(0,0,255)cv2.putText(frame,f"status:{status_text}",(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,color,2)cv2.putText(frame,"LED: ON"ifface_system.led_is_onelse"LED: OFF",(10,70),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,255)ifface_system.led_is_onelse(128,128,128),2)cv2.putText(frame,"Press 'q' to quit",(10,frame.shape[0]-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,255,255),2)# 显示画面cv2.imshow('FaceRecognition',frame)# 按'q'退出ifcv2.waitKey(1)&0xFF==ord('q'):break# 控制处理频率,避免过于频繁time.sleep(0.1)exceptExceptionase:print(f"\n程序出错:{e}")finally:# 释放资源cap.release()cv2.destroyAllWindows()# 确保LED关闭try:ifface_system.led_is_on:requests.get(LED_OFF_URL,timeout=2)print("程序退出,LED已关闭")except:passprint("程序已结束")if__name__=="__main__":main()

仍有可优化地方:比如将图片上传到云,从云获取,然后上传时候就进行图片人脸编码,摄像头识别到时可以直接获取。

以上是所有内容,感谢观看。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:21:56

【毕设项目计算机毕设】基于springboot+vue实现的在线考试系统

一、前言 在当今数字化转型的时代背景下,教育行业也在积极探索利用信息技术提升教学质量和效率的方式。在线考试系统作为教育信息化的重要组成部分,正逐渐成为学校、培训机构乃至企业进行考核评价的首选工具。它不仅能够有效解决传统纸质考试的诸多局限…

作者头像 李华
网站建设 2026/4/23 11:20:26

px4+ubuntu22.04+ros2开发记录

1.环境搭建中遇到的问题 安装ros2:参考小鱼的一键安装 安装px4:参考: PX4 自动驾驶仪用户指南 | PX4 Guide (main) 最新PX4xROS2保姆级仿真部署教程来了!_ros2 px4-CSDN博客 1.1 问题一:gazebo sim仿真没有模型 描述…

作者头像 李华
网站建设 2026/4/17 16:13:38

Cursor Agent Skill 原理及LLM , Agent, MCP ,Skill区别

//////////////////////////////////////////////////////////////////原理与核心概念Agent 定义:Cursor 内置的“自主任务执行器”。你给出目标,它会自主规划步骤、调用文件读取、搜索、编辑、运行命令等能力完成任务,并把状态同步给你。Ski…

作者头像 李华
网站建设 2026/4/23 11:18:50

Yjs 前端实时协作库学习笔记

核心定位 纯前端 / Node.js 通用的实时协作数据一致性库,基于 CRDT(无冲突复制数据类型)实现,核心解决「多人同时修改数据、断网离线修改数据」后的数据自动统一问题,是前端开发在线文档、白板、表格等协作类应用的核…

作者头像 李华
网站建设 2026/4/19 21:44:39

STM32(7)--FPU(TODO)

1 简介2 实现1--数字低通滤波器需求: 滤掉音频里的高频刺耳噪声。 公式: $y[n] \alpha \cdot x[n] (1 - \alpha) \cdot y[n-1]$ 这就是一个最基础的差分方程,也是《信号与系统》的第一课。

作者头像 李华