人脸识别门锁实现
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 # 人臉識別部分注意事項:
舵機最好額外供電
總結
- 上一篇: 爱 尔 兰 D e c a W a v
- 下一篇: opencv--读取摄像头识别人脸并跟踪