一.前言
项目设计主要是对于所学知识的整体回顾,需要结合各个学科,才能做出达到符合标准的设计。
文章的目的在分享优质的项目以及项目经验,提供设计思路,欢迎交流与指正不足之处。
二.简介
由于人脸识别技术具有无需接触、安全性高、可靠性高等优点,在身份认证领域具有广阔的应用前景。目前,市场中的门禁系统大多采取离线加传统人脸识别算法的方式,无法实时记录访客信息,并存在识别准确率低、容错率较低、只针对特定场景等缺点。该设计主要目的在于解决上述的问题,采用深度学习人脸识别算法与在线,计算的门禁系统解决方案。
三.主要器件
STM32F407ZGT6芯片主控芯片
OV2640摄像头模块
ESP8266无线通信模块
语音播报电路
自动开关门电路(舵机驱动)
IIC驱动型OLED屏幕
按键电路
电源电路
四.系统整体方案
下位机采集人脸图像数据,经无线通信模块传输至上位机识别并返回识别结果的人脸识别门禁系统方案。下位机主要由微控制器模块、摄像头模块、无线传输模块组成,负责图像采集与传输,并根据上位机返回识别结果并做出相应的动作。
上位机则由安装Tensorflow深度学习运行环境的PC构成,负责图片接收、人脸识别和返回识别结果。
下位机软件的设计流程图如下图所示:
文章内容将在后续逐步完善,需要相关实物,亦或是任何技术问题。欢迎私信本人,CSDN@风雨同舟1
五. 部分核心代码
主函数部分:
```cpp
```c
int main(void)
{
/*--------------变量声明--------------------*/
u8 limt,left,right,chang=0,start,display,display1;
float temp;
/*--------------配置初始化--------------------*/
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
USART1_Init(115200); //串口初始化为115200
OLED_Init();
SMBus_Init();
KEY_Init();
LED_Init();
BEEP_Init();
// OLED_Refresh_Gram(); //更新显示到OLED
while(1)
{
/*start=1(测温开始),start=2(人脸识别开始),start=3(口罩识别开始)*/
switch (duli_key(1))
{
//case 0: start=0;break;
case 1: {start=1;break;}
case 2: {start=2;break;}
case 3: {start=3;break;}
case 4: {start=4;break;}
}
//--------------测温部分------------------------------------
if(start==1)
{
if(start_stop(Key_Scan()))
{
if(display==2)
{
OLED_Clear();
OLED_ShowString(25,0,"temp test",16);
OLED_ShowString(0,25,"temp:",16);
OLED_ShowChar(60,25,'.',16,1);
delay_ms(10);
OLED_ShowString(0,40,"temp_limit:37",16);
display=1;
}
if(temp_target(Key_Scan()))//测温:1--测量液体温度 0--测量人体温度
{
temp=SMBus_ReadTemp(0);
}
else
temp=SMBus_ReadTemp(1);
/*------------温度阈值设定------------------*/
while(set_templimt(Key_Scan()))
{
LED0=1;
if(Key_Scan()==10)
{
while(Key_Scan()==10);
chang=1;
}
else if(Key_Scan()==11)
{
while(Key_Scan()==11);
chang=2;
}
switch(chang)
{
case 0: {left=3;right=7;break;}
case 1: if(Key_Scan()5) left=Key_Scan();break;
case 2: if(Key_Scan()10) right=Key_Scan();;break;
}
limt=left*10+right;
OLED_ShowNum(90,40,limt,2,16);
OLED_Refresh_Gram(); //更新显示到OLED
}/*结束while阈值设定*/
/*---------温度范围报警--------------*/
warning(temp);//温度范围检测与报警
prompt_warning(temp,limt);
LED0=0; //GPIOB.5
temp_display(temp);//温度显示函数
OLED_Refresh_Gram(); //更新显示到OLED
}
else
{
if(display2)
{
OLED_Clear();
display=2;
}
LED0=1;
OLED_ShowString(0,0,"please key temp .....",16);
}
}
//----------------人脸识别-------------------//
if(start==2)
{
static display1=2;
if(display1==2)
{
OLED_Clear();
display1=1;
}
OLED_ShowString(0,0,"Please click reset...",16);
delay_ms(4000);
OLED_ShowString(0,40,"Identify in the face....",16);
delay_ms(10);
if((boll_x==1)||(boll_y==2)||(boll_z==3)||(boll_b==4))
{
OLED_ShowString(10,0,"identification ",16);
delay_ms(2);
if(boll_x==1)
{
OLED_ShowString(0,25,"name:xiaokangsong",16);
OLED_Refresh_Gram();
}
else if(boll_y==2)
{
OLED_ShowString(0,25,"name:chengrujia ",16);
OLED_Refresh_Gram();
}
else if(boll_z==3)
{
OLED_ShowString(0,25,"name:mayumao ",16);
OLED_Refresh_Gram();
}
else if(boll_b==4)
{
OLED_ShowString(0,0,"error2",16);
OLED_Refresh_Gram();
}
}
else
{
OLED_ShowString(0,0,"Identification failure ",16);
display1=1;
}
}
OLED_Refresh_Gram(); //更新显示到OLED
}
}
按键部分代码:
void Key_assignment(unsigned char z) //按键赋值
{
Key_Data=0x00; //清零
if(z==0)
{
key1_0; key2_0; key3_0; key4_0;
key5_1; key6_1; key7_1; key8_1; //使用的方法是反转法
}
else
{
key1_1; key2_1; key3_1; key4_1;
key5_0; key6_0; key7_0; key8_0; //使用的方法是反转法
}
delay_us(222); //短延时一下
if(key1==1) Key_Data=Key_Data|0x80;
else Key_Data=Key_Data|0x00;
if(key2==1) Key_Data=Key_Data|0x40;
else Key_Data=Key_Data|0x00;
if(key3==1) Key_Data=Key_Data|0x20;
else Key_Data=Key_Data|0x00;
if(key4==1) Key_Data=Key_Data|0x10;
else Key_Data=Key_Data|0x00;
if(key5==1) Key_Data=Key_Data|0x08;
else Key_Data=Key_Data|0x00;
if(key6==1) Key_Data=Key_Data|0x04;
else Key_Data=Key_Data|0x00;
if(key7==1) Key_Data=Key_Data|0x02;
else Key_Data=Key_Data|0x00;
if(key8==1) Key_Data=Key_Data|0x01;
else Key_Data=Key_Data|0x00; //把这八个IO拼成一个数,也就是当成51里面的一组IO
}