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) //[email protected]
{
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;j0;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)=2ms
PWM=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 pyttsx3
import serial
com = 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=frame
flag=6
for(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:
break
x=0
y=0
cap.release()
cv2.destroyAllWindows
# 人脸识别部分
注意事项:
舵机最好额外供电