人脸识别门锁实现

news/2024/10/23 18:26:50/

python实现人脸识别并进行比对串口反馈至51单片机控制舵机

C语言库:CORE\STC8Ax_REG.H

python库:

from multiprocessing.connection import wait
from time import sleep
import cv2
import numpy as np
from PIL import Image
from functools import reduce
from PIL import Image
import math,operator
import pyttsx3
import serial

51单片机程序

接受串口数据,并控制舵机转动


#include ".\CORE\STC8Ax_REG.H"
sbit PWM=P2^1;  //定义给舵机信号线接的I/O口
void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x40;		//定时器时钟1T模式AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//设置定时器模式TL1 = 0xE0;		//设置定时初始值TH1 = 0xFE;		//设置定时初始值ET1 = 0;		//禁止定时器%d中断TR1 = 1;		//定时器1开始计时
}
void send(char dat){
SBUF=dat;
while(!TI){TI=0;
}
}void dalay(int ms){int i=0,j=0;for (i=0;i<5000;i++){for (j=0;j<ms;j++);}
}
void Delay(unsigned char i)   //12MHz 延时函数  
{unsigned char a,b;        //该段延时函数Delay(1)=0.5msfor(;i>0;i--)for(b=71;b>0;b--)for(a=2;a>0;a--);
}
void zero(void) //0度 子程序
{   PWM=1;Delay(1);       //高电平 Delay(1)=0.5ms。因为周期为20ms,所以低电平就是19.5ms PWM=0;Delay(39);      //低电平 Delay(39)=19.5ms
}
void three(void) //135度 子程序
{PWM=1;Delay(4);       //高电平 Delay(4)=2msPWM=0;Delay(36);      //低电平 18ms
}sbit l1=P0^4;
sbit l2=P0^5;
sbit l3=P0^6;
sbit l4=P0^7;
sbit k1=P1^0;
sbit key=P5^1;
int flag=1;
void main(){//	P_SW1 &=0x0f;
//	P_SW1 |=0x80;P0M0=0;P0M1=0;
P2M0=0;
P2M1=0; UartInit();if(SBUF=='1')   //按键接P3^1口。如果按键按下{Delay(20);   if(SBUF=='1'){three();  //如果按键按下,调用舵机90度子程序,实现转动90度。
l2=0;			 }    }else         //否则zero();   //舵机为0度}//	
//RI = 0;//清除接收中断标志位	
//	SBUF = '6';//将接收到的数据放回发送缓存器
//	while(!TI);//等待发送数据完成
//	TI = 0;//清除发送中断标志位
//

python程序

程序运行

打开摄像头,不断进行人脸识别,当按下A键,保存当前时刻摄像头捕捉到的图像并进行裁剪

当按下S键,保存当前时刻摄像头捕捉到的图像并进行裁剪后与先前保存的人脸进行特征比对

若比配成功,则语言提示“匹配成功”,“欢迎xxx进入”,同时serial向发送串口数据至单片机,延迟2秒,serial向发送串口数据至单片机,舵机复位,则语言提示“重新上锁”,若匹配失败则语言提示“匹配失败”

com端的串口号需要通过设备管理器设置

from email.mime import image
from multiprocessing.connection import wait
from time import sleep
import cv2
import numpy as np
from PIL import Image
from functools import reduce
from PIL import Image
import math,operator
import pyttsx3import serialcom = serial.Serial('COM7', 9600)
print (com)def led1():success_bytes = com.write('1'.encode())print (success_bytes)
def led2():success_bytes = com.write('2'.encode())print (success_bytes)  
# import serial
# 库
# 人脸识别部分
# 串口
# com = serial.Serial('COM6', 9600)
# 串口
# 变量
flag=6
engine = pyttsx3.init()
# 变量
face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)
cap.open(0)
while cap.isOpened():flag,frame=cap.read()frame = cv2.flip(frame, 1)faces=face_cascade.detectMultiScale(frame,1.3,2)img=frameflag=6for(x,y,w,h)in faces:img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,247,181),2)face_area=img[y:y+h,x:x+w]# print(x)# print(y)# if(x>0 and y>0 and w>0 and h>0):#   flag=1 # if(flag==1):#     success_bytes = com.write('1'.encode())#     print (success_bytes)#     print("open")    #     print("open")  cv2.putText(img,'people',(x,y-7),3,1.2,(255,0,251),2,cv2.LINE_AA)key_pressed=cv2.waitKey(60)# print(flag)# if(flag==6):#         success_bytes = com.write('5'.encode())#         print (success_bytes)#  success_bytes = com.write('1'.encode())#         print (success_bytes)#         print("open")# print("123",key_pressed)if key_pressed==48:img=cv2.Canny(img,100,200)img=np.dstack((img,img,img))if key_pressed==ord("a"):cv2.imwrite("photo.jpg",img)mying=Image.open("photo.jpg")imgcrop=mying.crop((x,y,x+w,y+h))mying= imgcrop.resize((150,150),Image.ANTIALIAS)mying.save("faceout.jpg")print("555555555555555555555555")cv2.imshow('rlsb_tool',img)if key_pressed==ord("s"):cv2.imwrite("photo.jpg",img)mying=Image.open("photo.jpg")imgcrop=mying.crop((x,y,x+w+10,y+h+10))mying= imgcrop.resize((150,150),Image.ANTIALIAS)mying.save("faceout2.jpg")print("555555555555555555555555")h1=Image.open("faceout2.jpg").histogram()h2=Image.open("faceout.jpg").histogram()RMS=math.sqrt(reduce(operator.add,list(map(lambda a,b:(a-b)**2,h1,h2)))/len(h1))print("RMS= ",RMS)if(RMS>0):if(RMS<70):print("匹配成功")led1()engine.say("匹配成功")engine.say("ysw欢迎进入寝室")engine.runAndWait()sleep(2)engine.say("重新上锁")engine.runAndWait()led2()else:print("匹配失败")engine.say("匹配失败")engine.runAndWait()if key_pressed==27:breakx=0y=0cap.release()
cv2.destroyAllWindows
# 人脸识别部分

注意事项:

舵机最好额外供电


http://www.ppmy.cn/news/212891.html

相关文章

离线语音远程遥控车控门制作教程(二)

离线语音远程遥控车控门制作教&#xff08;二&#xff09; 序言 接 离线语音远程遥控车控门制作教程&#xff08;一&#xff09;&#xff0c;本篇为自己动手画PCB,功能和一是一样。 功能&#xff1a; 1、遥控器端可以用按钮控制。 2、用离线语音模块语音控制。 3、车库门接收…

iOS - 蓝牙开门智能门锁

蓝牙的实现原理网上很多 在此就不一一描述了 有需要的可以看以下的文章学习 在ios 的开发中iBeacon和BLE的区别 iBeacon介绍 iOS蓝牙空中升级&#xff08;固件升级&#xff09; 本文主要是写实现过程&#xff1a; github 上完整Demo地址&#xff0c;大家可以下载看看&…

什么叫做车联网手机远程控制汽车

车联网系统智能硬件、操作系统、通过OBD盒子读取车辆信息&#xff0c;传送至云平台&#xff0c;通过运算&#xff0c;将信息或诊断结果、解决方法建议发送至手机APP等操作系统&#xff0c;使车辆和APP形成连接&#xff0c;用户可随时进行自检读取汽车信息。 俗话说“好马配好鞍…

离线语音远程遥控车控门制作教程(一)

离线语音远程遥控车控门制作教程&#xff08;一&#xff09; 序言面包板玩法接线图遥控器接收端接线图需要购买哪些模块固件下载 序言 当你开着车回家的时候&#xff0c;车快到家时&#xff0c;你是不是想车库门能自动打车&#xff0c;怎么打开呢&#xff0c;在车上放一个语音…

电子门锁模拟

文章目录 前言一、设计规范&#xff08;需求&#xff09;二、原理图三、设计输入四、电子门锁仿真五、运行效果总结 前言 密码解锁的过程也是一个有限状态机&#xff0c;只有按正确密码的顺序输入密码&#xff0c;才能打开电子锁。本次课程就用开发板模拟这一过程。 一、设计…

老式门锁改wifi遥控开门

我家的门是老式门锁&#xff0c;见下图&#xff1a; 说实话&#xff0c;是有点老&#xff0c;但不想换&#xff0c;居说很安全&#xff0c;记得有一次我一个人喝醉在家睡着了&#xff0c;家里人在外面怎么敲门也没听到&#xff0c;结果叫来开锁的&#xff0c;外面的防盗门不用…

远程空调遥控

这两天做了一个非常简单的远程格力空调遥控&#xff0c;真的很简单&#xff0c;但是基本功能满足了。可以开关&#xff0c;改变温度。手机连接服务器&#xff0c;输入宿舍号和温度&#xff0c;然后你在图书馆就可以把空调开到23&#xff0c;回到宿舍直接吹凉风。过程中有一些小…

一文浅析智能门锁

智能门锁是门禁系统中重要的组成部分&#xff0c;区别于传统的机械锁&#xff0c;智能门锁可同时兼具密码、指纹、NFC、机械钥匙、远程联网等功能&#xff0c;在用户安全性、识别性、管理性方面更加智能化、简便化。 常见智能门锁的物理组成部分有前面板、锁体、后面板&#xf…