【2024 DigiKey 创意大赛】人脸识别门禁系统设计与实现
本帖最后由 Juggernaut 于 2024-11-3 23:22 编辑<h3> </h3>
<h2>一、作品简介</h2>
<div>随着科技的不断发展,人们的生活水平得到了极大的提升,与此同时人们对安全的要求也越来越高,门锁一直是一个家庭安全保障的关键性物件,门锁的发展更是经历了从普通物理门锁到密码锁、指纹锁到其它更高级利用生物特征识别技术的门锁,其中人脸识别技术为主的多功能的智能门锁成为智慧家居领域发展中极为重要一环。</div>
<div></div>
<div>本项目主要设计一个人脸识别门禁系统系统,采用星瞳科技的OpenMV4 H7 R2既承担主控功能,也承担摄像头主体,同时外接MG90S舵机用于模拟门锁打开和关闭,通过OpenMV4摄像头进行人脸识别,并检查是否为特定人员,如果是则打开门禁并亮绿灯,相反则红灯闪烁,提示非法用户。</div>
<p><span style="font-size:24px;"><strong>二、系统设计</strong></span><br />
OpenMV4摄像头承担2个功能,主控和摄像头。首先循环采集图像,比对OpenMV4中已经保存的人脸特征,找出最匹配的人脸,如果是则通知舵机运转,同时打开绿色LED提示开门,否则打开红色LED告警,具体业务流程图如下。<br />
</p>
<p><span style="font-size:24px;"><strong>三、项目硬件</strong></span></p>
<ol>
<li><strong>OpenMV4摄像头</strong><br />
OpenMV4摄像头是一款小巧,低功耗,低成本的电路板,可以很轻松的完成机器视觉(machine vision)应用。可以通过高级语言Python脚本(准确的说是MicroPython),而不是C/C++。Python的高级数据结构使得很容易在机器视觉算法中处理复杂的输出。<br />
<br />
OpenMV4搭载<a href="https://dl.singtown.com/datasheet/STM32H743VI.pdf">STM32H743VI</a> ARM Cortex M7 处理器,480 MHz,内置1MB RAM和2 MB flash。</li>
<li><strong>MG90S舵机</strong></li>
</ol>
<div>MG90S是一个360度舵机,本质上都是通过输出pwm波来控制的,舵机的工作原理非常简单,就是通过单片机输出的pwm波来控制,舵机会根据信号的占空比来计算需要转动的角度,而MG90S是不能控制转动的角度,因此它的占空比是用来控制舵机转动的速度和方向。</div>
<div></div>
<p><span style="font-size:24px;"><strong>四、具体实现</strong></span></p>
<ol>
<li><strong>本地样本图像库</strong><br />
在OpenMV4摄像头的TF卡中新建singtown文件夹,其中再新建10个人员文件夹,按照序号,第一个人的图片保存到s1文件夹,第二个人的图片保存到s2文件夹…,即可,用于人脸检测比对。</li>
<li><strong>人脸检测</strong><br />
<br />
因为OpenMV4性能有限,没法通过nn库使用mobilenet库进行推理,只能使用LBP特征分辨人脸,具体源码如下:
<pre>
<code class="language-python">import sensor, time, image
from pyb import Servo
from pyb import LED
sensor.reset() # Initialize the camera sensor.
s1 = Servo(1) # P7
red_led = LED(1)
green_led = LED(2)
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.HQVGA)
sensor.set_windowing((92,112))
sensor.skip_frames(10) # Let new settings take affect.
sensor.skip_frames(time = 5000) #等待5s
NUM_SUBJECTS = 2
NUM_SUBJECTS_IMGS = 20
img = sensor.snapshot()
d0 = img.find_lbp((0, 0, img.width(), img.height()))
#d0为当前人脸的lbp特征
img = None
pmin = 999999
num=0
def min(pmin, a, s):
global num
if a<pmin:
pmin=a
num=s
return pmin
for s in range(1, NUM_SUBJECTS+1):
dist = 0
for i in range(2, NUM_SUBJECTS_IMGS+1):
img = image.Image("singtown/s%d/%d.pgm"%(s, i))
d1 = img.find_lbp((0, 0, img.width(), img.height()))
#d1为第s文件夹中的第i张图片的lbp特征
dist += image.match_descriptor(d0, d1)
pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s)
print(pmin)
print(num)
if num == 2:
img.draw_rectangle(r)
s1.angle(100) # 控制舵机旋转到100度
green_led.on()
time.sleep(3) # 等待3秒钟
s1.angle(0) # 将舵机归位到0度
green_led.off()
else:
red_led .on()
time.sleep(3) # 等待3秒钟
red_led .off()</code></pre>
</li>
<li><strong>舵机控制</strong><br />
直接用OPENMV的Servo库,人脸识别准确的时候旋转100度,然后等3秒再转回去。
<pre>
<code>s1.angle(100) # 控制舵机旋转到100度
time.sleep(3) # 等待3秒钟
s1.angle(0) # 将舵机归位到0度</code></pre>
</li>
<li><strong>LED控制</strong></li>
</ol>
<div>直接用OPENMV的LED库,人脸识别准确的时候绿灯亮3秒,错误的时候红灯亮3秒。</div>
<div>
<pre>
<code class="language-python">red_led .on()
time.sleep(3) # 等待3秒钟
red_led .off()</code></pre>
<span style="font-size:24px;">五、<strong>运行测试</strong></span></div>
<div>先来张全家福,因为M90S需要单独5V供电,只能外接电源,PWM控制线接OPENMV4即可。</div>
<div></div>
<div>来个人脸测试,可以看出已经识别特定人脸,同时舵机控制门开,具体看视频。</div>
<div></div>
<div>视频在此:</div>
<div>dad2bc73f78df1b1e3c129dc569e2032<br />
</div>
<div>附件(word+源码):</div>
<div></div>
<div></div>
<div> </div>
<div>最后,感谢DigiKey&eeworld组织的活动。</div>
<p><!--importdoc--></p>
页:
[1]