草庐IT

【项目设计】基于STM32人脸识别系统 - 单片机 物联网 嵌入式

风雨同舟1 2024-07-10 原文

文章目录

一.前言

项目设计主要是对于所学知识的整体回顾,需要结合各个学科,才能做出达到符合标准的设计。
文章的目的在分享优质的项目以及项目经验,提供设计思路,欢迎交流与指正不足之处。

二.简介

由于人脸识别技术具有无需接触、安全性高、可靠性高等优点,在身份认证领域具有广阔的应用前景。目前,市场中的门禁系统大多采取离线加传统人脸识别算法的方式,无法实时记录访客信息,并存在识别准确率低、容错率较低、只针对特定场景等缺点。该设计主要目的在于解决上述的问题,采用深度学习人脸识别算法与在线,计算的门禁系统解决方案。

三.主要器件

STM32F407ZGT6芯片主控芯片
OV2640摄像头模块
ESP8266无线通信模块
语音播报电路
自动开关门电路(舵机驱动)
IIC驱动型OLED屏幕
按键电路
电源电路

技术交流,调试帮助,技术V:anwarmaries Q:1083091092

四.系统整体方案

下位机采集人脸图像数据,经无线通信模块传输至上位机识别并返回识别结果的人脸识别门禁系统方案。下位机主要由微控制器模块、摄像头模块、无线传输模块组成,负责图像采集与传输,并根据上位机返回识别结果并做出相应的动作。
上位机则由安装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(display<2)
				{
					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
	
}

有关【项目设计】基于STM32人脸识别系统 - 单片机 物联网 嵌入式的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  6. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  7. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐