news 2026/6/10 12:38:49

基于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/6/10 12:00:29

超越边缘检测:OpenCV中结构张量的深度解析与应用实战

好的,遵照您的要求,我将以独特的视角和深度,为您撰写一篇关于OpenCV图像处理API的技术文章,聚焦于一个高级但至关重要的概念——结构张量及其在纹理分析与各向异性滤波中的应用。 随机种子 1769558400058 已就绪,文章…

作者头像 李华
网站建设 2026/6/10 11:58:06

该如何选择深圳进行算力服务器托管

在数字经济高速迭代的当下,算力已成为企业核心竞争力,而服务器托管作为保障算力稳定输出的关键载体,其选址与服务商选择直接影响业务连续性。深圳作为全球互联网骨干网核心节点、粤港澳大湾区数字枢纽,凭借得天独厚的网络资源、完…

作者头像 李华
网站建设 2026/6/9 20:15:00

i386 CPU页式存储管理深度解析

深入理解i386 CPU页式存储管理:原理、实现与核心思路 在x86架构的发展历程中,i386 CPU首次引入了完整的32位页式存储管理机制,为现代操作系统的虚拟内存、进程隔离、内存保护等核心功能奠定了硬件基础。与早期实模式的内存管理及286的段式保…

作者头像 李华
网站建设 2026/6/9 22:29:47

我的思维模型 -- 6.生物学篇

生物学自然选择 - 适者生存能活下来的,不是最聪明的,而是最能适应环境变化的《自私的基因》最好不要把自然选择的基本单位看作物种或者种群,甚至个体;最好把它看作遗传物质的某种小单位。为方便起见,简称为基因世界运行…

作者头像 李华
网站建设 2026/6/2 8:37:44

PyTorch torch.optim 优化器介绍与论文

目录概述常用优化器1. **SGD** (Stochastic Gradient Descent) - 随机梯度下降2. **Adam** (Adaptive Moment Estimation) ⭐ 最常用3. **AdamW** (Adam with Weight Decay) ⭐ PI0.5 使用4. **RMSprop** (Root Mean Square Propagation)5. **Adagrad** (Adaptive Gradient)6. …

作者头像 李华
网站建设 2026/6/10 12:00:04

2026现在这个时代,C语言真的不行了吗?

C语言在2026年(以及可预见的未来)绝对没有“不行了”,它依然至关重要且不可替代。 那些宣称C语言“不行”或“过时”的说法,往往忽略了它在现代计算基础设施中扮演的核心、底层、高性能角色。C语言在2026年依然强大且不可或缺的原…

作者头像 李华