毕业设计 stm32人脸识别门禁系统(源码+硬件+论文)

您所在的位置:网站首页 人脸识别门禁默认密码 毕业设计 stm32人脸识别门禁系统(源码+硬件+论文)

毕业设计 stm32人脸识别门禁系统(源码+硬件+论文)

2024-07-10 14:34| 来源: 网络整理| 查看: 265

文章目录 0 前言1 主要功能2 硬件设计(原理图)3 核心软件设计4 实现效果5 最后

0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 stm32人脸识别门禁系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

难度系数:3分工作量:3分创新点:4分

🧿 项目分享:见文末!

在这里插入图片描述

实物演示效果

毕业设计 stm32人脸识别门禁系统 - 单片机 嵌入式 物联网

1 主要功能

本系统设计了一种由下位机的摄像头采集人脸图像数据,再经过无线传输模块传输给上位机识别并且返回识别结果的人脸识别门禁系统,可以实现人脸录入、人脸检测、人脸识别、人员访问响应策略。下位机部分主要由主控模块、摄像头模块、显示器、无线传输模块、模拟门禁模块组成,下位机负责人脸图像的采集与发送,并且根据上位机返回的识别结果执行相应的动作。上位机由一台基于Python操作环境的PC机组成成,负责保存人脸图像、识别人脸并且返回识别结果。

在这里插入图片描述

2 硬件设计(原理图)

在这里插入图片描述

在这里插入图片描述

3 核心软件设计

主程序流程

在这里插入图片描述

系统软硬件配置好以后,首先对系统进行初始化,确定整个系统正常运行。打开人脸门禁,当摄像头检测到人脸时,会通过WIFI上传至上位机,在上位机中再将采集到的人脸信息与本地已录入的人脸信息进行匹配,在信息匹配完成后再将结果通过WIFI上传给单片机,由单片机控制继电器模拟门禁的打开和关闭。

上位机部分设计

上位机需要实现的功能为与下位机建立TCP连接以接收下位机上传的人脸图像数据,再利用人脸识别技术完成识别任务。本文选用了基于Python的OpenCV开源计算机视觉库、Dlib开源机器学习库、Numpy开源数值计算库、Pillow开源图像处理库、Pandas开源数据分析库进行上位机软件程序的设计

在这里插入图片描述

篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。

部分关键代码

//#include "usart.h" #include "delay.h" #include "spi.h" #include "usart.h" #include "string.h" #include "includes.h" #include "led.h" #include "GUI.h" #include "Picture.h" #include "dht11.h" #include "adc.h" #include "light.h" #include "font.h" //LCD的画笔颜色和背景色 u16 POINT_COLOR=0x0000; //画笔颜色 u16 BACK_COLOR=0xFFFF; //背景色 //管理LCD重要参数 //_lcd_dev lcddev; //写寄存器函数 //regval:寄存器值 void LCD_WR_REG(u16 regval) { SPILCD_CS_RESET; //LCD_CS=0 SPILCD_RS_RESET; SPI_WriteByte(SPI2,regval&0x00FF); SPILCD_CS_SET; //LCD_CS=1 } //写LCD数据 //data:要写入的值 void LCD_WR_DATA(u16 data) { SPILCD_CS_RESET; //LCD_CS=0 SPILCD_RS_SET; SPI_WriteByte(SPI2,data>>8); SPI_WriteByte(SPI2,data); SPILCD_CS_SET; //LCD_CS=1 } void LCD_WR_DATA8(u8 da) //写8位数据 { SPILCD_CS_RESET; //LCD_CS=0 SPILCD_RS_SET; SPI_WriteByte(SPI2,da); SPILCD_CS_SET; //LCD_CS=1 } //写寄存器 //LCD_Reg:寄存器地址 //LCD_RegValue:要写入的数据 void LCD_WR_REG_DATA(u8 LCD_Reg, u16 LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } //开始写GRAM void LCD_WriteRAM_Prepare(void) { LCD_WR_REG(0x2c); } //当mdk -O1时间优化时需要设置 //延时i //设置光标位置 //Xpos:横坐标 //Ypos:纵坐标 void LCD_SetCursor(u16 Xpos, u16 Ypos) { LCD_WR_REG(0x2a); LCD_WR_DATA8(Xpos>>8); LCD_WR_DATA8(Xpos&0XFF); LCD_WR_REG(0x2b); LCD_WR_DATA8(Ypos>>8); LCD_WR_DATA8(Ypos&0XFF); } /************************************************* 函数名:LCD_Set_Region 功能:设置lcd显示区域,在此区域写点数据自动换行 入口参数:xy起点和终点 返回值:无 *************************************************/ void Lcd_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end) { LCD_WR_REG(0x2a); LCD_WR_DATA8(x_start>>8); LCD_WR_DATA8(0x00FF&x_start+2);; LCD_WR_DATA8(x_end>>8); LCD_WR_DATA8(0x00FF&x_end+2); LCD_WR_REG(0x2b); LCD_WR_DATA8(y_start>>8); LCD_WR_DATA8(0x00FF&y_start+3); LCD_WR_DATA8(y_end>>8); LCD_WR_DATA8(0x00FF&y_end+3); LCD_WR_REG(0x2c); } //画点 //x,y:坐标 //POINT_COLOR:此点的颜色 void LCD_DrawPoint(u16 x,u16 y) { LCD_SetCursor(x,y); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM LCD_WR_DATA(POINT_COLOR); } /************************************************* 函数名:LCD_Set_XY 功能:设置lcd显示起始点 入口参数:xy坐标 返回值:无 *************************************************/ void Lcd_SetXY(u16 x,u16 y) { Lcd_SetRegion(x,y,x,y); } /************************************************* 函数名:LCD_DrawPoint 功能:画一个点 入口参数:无 返回值:无 *************************************************/ void Gui_DrawPoint(u16 x,u16 y,u16 Data) { Lcd_SetRegion(x,y,x+1,y+1); LCD_WR_DATA(Data); } void Lcd_Reset(void) { // LCD_RST_CLR; delay_ms(100); // LCD_RST_SET; delay_ms(50); } //初始化lcd void LCD_Init(void) { Lcd_Reset(); //LCD Init For 1.44Inch LCD Panel with ST7735R. LCD_WR_REG(0x11);//Sleep exit delay_ms (120); //ST7735R Frame Rate LCD_WR_REG(0xB1); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB3); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB4); //Column inversion LCD_WR_DATA8(0x07); //ST7735R Power Sequence LCD_WR_REG(0xC0); LCD_WR_DATA8(0xA2); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x84); LCD_WR_REG(0xC1); LCD_WR_DATA8(0xC5); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x00); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0xEE); LCD_WR_REG(0xC5); //VCOM LCD_WR_DATA8(0x0E); LCD_WR_REG(0x36); //MX, MY, RGB mode LCD_WR_DATA8(0xC8); //ST7735R Gamma Sequence LCD_WR_REG(0xe0); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1a); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x2f); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x22); LCD_WR_DATA8(0x1f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x10); LCD_WR_REG(0xe1); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x17); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x2c); LCD_WR_DATA8(0x29); LCD_WR_DATA8(0x2e); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x3f); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x10); LCD_WR_REG(0x2a); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x7f); LCD_WR_REG(0x2b); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x9f); LCD_WR_REG(0xF0); //Enable test command LCD_WR_DATA8(0x01); LCD_WR_REG(0xF6); //Disable ram power save mode LCD_WR_DATA8(0x00); LCD_WR_REG(0x3A); //65k mode LCD_WR_DATA8(0x05); LCD_WR_REG(0x29);//Display on } //清屏函数 //color:要清屏的填充色 void Lcd_Clear(u16 Color) { unsigned int i,m; Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1); //Lcd_WriteIndex(0x2C); for(i=0;idistance) { yerr-=distance; uCol+=incy; } } } //画矩形 //(x1,y1),(x2,y2):矩形的对角坐标 void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) { LCD_DrawLine(x1,y1,x2,y1); LCD_DrawLine(x1,y1,x1,y2); LCD_DrawLine(x1,y2,x2,y2); LCD_DrawLine(x2,y1,x2,y2); } //在指定位置显示一个汉字(16*16大小) void showhanzi16(unsigned int x,unsigned int y,unsigned char index) { unsigned char i,j,k; const unsigned char *temp=hanzi16; temp+=index*32; for(j=0;j


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3