近期完成了一个人脸识别门禁系统的项目,这个项目是今年学校科技立项的题目,到期末了应该结题了,所以上两周就赶紧的搞了一下,做出了原型系统。
项目最终的效果图如下:
效果视频:B站地址
项目需求:
搭建一个门禁系统,用户可以使用密码或者人脸进行开门操作,在LCD上显示信息,同时开门的数据要进行记录,可以发送到上位机。此外,应添加一些让系统更可靠的功能,比如密码输入错误后的报警,添加新的用户等。
项目分析:
首先关于系统的流程控制,因为这是一个规模还比较大的系统,要实现的功能不少,同时要兼顾识别、显示以及信息的录入,所以我选择使用UCOS操作系统来进行流程控制。
接下来关于人脸识别,这个功能我一开始想的是使用OpenMv来进行人脸的追踪与识别,但是转念一想,我手上的OpenMv3是F7的主控,虽然已经是单片机中性能顶尖的那一部分,但是对于像人脸识别这种高复杂度图像处理来说还是不太能胜任的,而且单个模块400+的价格实在是有些贵,这个项目可能会卖给别人所以不想把自己的模块用进去,在我尝试人脸追踪的例程仅仅能跑出1-3帧的帧率后我就彻底放弃了它,当然OpenMv不失是一个优秀的机器视觉模块,在色块追踪、寻线、简单物体识别等用途上大大降低了开发的难度,但是对于人脸识别,我们需要更好的。
我想到了当前最火爆的卡片电脑-树莓派,在俩三年间树莓派嫣然已经和Arduino一起成为了开源硬件和创客的代名词,不仅仅是嵌入式开发人员和智能硬件玩家,我们实验室的软件的同学们都知道这个小玩意,我也是好久以前就想玩,但是一直没入手。树莓派和我长久以来接触的单片机就是有相当大的不同了,虽然同为ARM架构的芯片,但是STM32是基于Cortex-M架构,它的定位的小体积、高性能、低成本、低功耗,它主要是用来和市面上的8位、16位单片机来抢夺市场的,而树莓派的芯片是Cortex-A架构,这样架构的芯片主频高、带有内存管理单元(MMU)可以运行Linux甚至是Windows10 On Arm,当然它们的开发难度和开发成本会上升。
树莓派搭载的是博通的的BCM2835处理器(3代和3B+是新的版本),当然在树莓派上就可以运行Linux操作系统,既然这样那我们就可以在树莓派上搭建Opencv开发环境,用Opencv来进行人脸追踪和识别的操作,而树莓派提供了GPIO、USART、IIC、SPI等等的接口,可以进行控制以及信号的传输。
超强的处理性能(高达1GHz的主频,1G的RAM)以及便捷的接口,所以说我们完全可以把树莓派当做一个“加强版的OpenMv”来对待。
解决了人脸识别的难题接下来就是些琐碎的小问题的,我们选用STM32F103C8T6的核心板(这简直是我的最爱,便宜高效),因为它的IO口数量少所以选用IIC接口的2004LCD屏幕,仅仅使用俩个IO口就可以完成对屏幕的控制;至于密码的输入,我们可以使用一个矩阵键盘,这是很简单的;还有一个难题是数据的存储,由于要实现数据的存储和查询功能,存在内存中是不现实的,每次关机数据就会被冲洗掉,而F103C8T6没有SDIO,虽然可以使用外加模块且采用SPI的方式来驱动SD卡,但是这样麻烦而且SD卡即使是最小的16G也得几十块钱,而最最重要的一点,我存储的只是一些时间、开门方式、ID等信息,数据量极少完全没有必要存到SD卡中,所以我使用了用片上FLASH来模拟EEPROM的方法,将片上FLASH作为存储空间。
我还想要实现用云台来调节摄像头,让人脸尽量放在视野的中心位置,所以说需要舵机云台以及PID控制;至于门锁,作为一个原型系统我们完全没有必要去真的驱动一个门锁,所以说我用继电器以及一个LED来替代,当然以后如果是驱动电磁门锁或者电机门锁的话将继电器的输出端改变即可。
所以我项目的系统结构就如下: