12. 指纹识别模块
12.1. 应用编程接口说明
'''
导入 fingerprint_sensor 模块
'''
from openaie import fingerprint_sensor
'''
类:指纹识别模块
参数:
port: 端口号 -- 1或7
'''
class fingerprint_sensor(port)
'''
方法:获取指纹图像 (有手指按下时,可以成功获取指纹图像)
@return fingerprint.FINGERPRINT_OK 获取指纹图像成功
'''
fingerprint_sensor.get_image()
# example:
fingerprint = fingerprint_sensor(1)
while True: # 等待手指按下
r = fingerprint.get_image()
if r == fingerprint.FINGERPRINT_OK:
print("获取指纹图像")
break
time.sleep_ms(100)
'''
方法:生成指纹特征
@num: 1, 2 生成指纹 特征1 或 特征2
@return fingerprint.FINGERPRINT_OK 生成指纹特征成功
'''
fingerprint_sensor.gen_char(num)
'''
方法:生成指纹模板
@return
fingerprint.FINGERPRINT_OK 两次录入指纹特征匹配,生成指纹模板成功
fingerprint.FINGERPRINT_ENROLLMISMATCH 两次录入指纹特征不匹配,生成指纹模板失败
'''
fingerprint.create_model()
'''
方法:存储指纹模板
@return ingerprint.FINGERPRINT_OK 存储指纹模板成功
@id: 指纹存储位置 1~60
'''
fingerprint.store_model(id)
'''
方法:搜索指纹(检测到的指纹与已保存的数据搜索匹配)
@return:fingerprint.FINGERPRINT_OK 指纹匹配成功
@ps:
若指纹匹配成功,可以获取下列数据:
fingerprint.verify_id 匹配到的指纹 ID
fingerprint.verify_score 匹配到的指纹 相似度得分
'''
fingerprint.search()
'''
方法:删除指纹
@id: 要删除的指纹ID
'''
fingerprint_sensor.delete(id)
'''
方法:录入指纹
@id: 指纹存储位置 1~60
@note: 此方法是上述部分API的封装
录入指纹基本流程:
读入指纹图像,生成指纹特征1
再次读入指纹图像,生成指纹特征2
若 特征1 与 特征2 匹配,则生成指纹模板并保存
'''
fingerprint_sensor.enroll(id)
'''
方法:验证(识别)指纹
@return: 验证成功返回 True
@note: 此方法是上述部分API的封装
验证(识别)指纹指纹基本流程:
读入指纹图像
生成指纹特征
搜索匹配指纹(是否为已保存的指纹)
'''
fingerprint_sensor.verify()
12.2. 案例
1. 指纹录入与识别
import time
from openaie import button1, button2, fingerprint_sensor
fingerprint = fingerprint_sensor(1)
id_num = 1
while (True):
if button1.is_press(): # 检测到按键按下
time.sleep_ms(10) # 延时消抖
if button1.is_press():
print("\n===============")
print(" 准备录入指纹 ")
print("===============")
fingerprint.enroll(id_num)
id_num+=1
while (button1.is_press()) : # 等待按键释放
pass
if button2.is_press(): # 检测到按键按下
time.sleep_ms(10) # 延时消抖
if button2.is_press():
print("\n===============")
print(" 开始指纹识别 ")
print("===============")
fingerprint.verify()
while (button2.is_press()) : # 等待按键释放
pass
2. 指纹锁
# 指纹 录入与验证(识别)
import time
import lcd
from openaie import button_group, fingerprint_sensor, servo
'''
录入指纹
流程:
读入指纹图像,生成指纹特征1
再次读入指纹图像,生成指纹特征2
若 特征1 与 特征2 匹配,则生成指纹模板并保存
'''
def enroll(id):
lcd.draw_string(10, 100, "录入指纹...", fc=(0,0,255), bc=(0,0,0))
for i in range(2):
if i == 0:
print("请按手指")
lcd.draw_string(10, 120, "请按手指 ", fc=(0,0,255), bc=(0,0,0))
else:
print("请重按手指")
lcd.draw_string(10, 120, "请重按手指 ", fc=(0,0,255), bc=(0,0,0))
lcd.display()
# 1. 获取指纹图像
while True: # 等待手指按下
r = fingerprint.get_image()
if r == fingerprint.FINGERPRINT_OK:
print("获取指纹图像")
break
# 2. 根据录入图像生成指纹特征
r = fingerprint.gen_char(i+1)
if r == fingerprint.FINGERPRINT_OK:
print("生成指纹特征", i+1)
if i < 1:
print("请移开手指")
lcd.draw_string(10, 120, "请移开手指 ", fc=(0,0,255), bc=(0,0,0))
lcd.display()
time.sleep_ms(800)
# 3. 合并指纹特征,生成指纹模板
print("生成指纹模板")
r = fingerprint.create_model()
if r == fingerprint.FINGERPRINT_OK:
print("两次录入指纹特征匹配,生成指纹模板成功")
elif r == fingerprint.FINGERPRINT_ENROLLMISMATCH:
print("两次录入指纹特征不匹配,生成指纹模板失败")
# 4. 存储指纹模板
print("存储指纹模板到位置: %d"%id)
r = fingerprint.store_model(id)
if r == fingerprint.FINGERPRINT_OK:
print("录入指纹成功")
lcd.draw_string(10, 120, "录入指纹成功", fc=(0,255,0), bc=(0,0,0))
lcd.display()
'''
验证指纹
读入指纹图像
生成指纹特征
搜索匹配指纹(是否为已保存的指纹)
'''
def verify():
lcd.draw_string(10, 100, "验证指纹... ", fc=(0,0,255), bc=(0,0,0))
# 1. 等待手指放置
print("请按手指")
lcd.draw_string(10, 120, "请按手指 ", fc=(0,0,255), bc=(0,0,0))
lcd.display()
while True: # 等待手指按下
r = fingerprint.get_image()
if r == fingerprint.FINGERPRINT_OK:
print("获取指纹图像")
break
time.sleep_ms(100)
# 2. 根据录入图像生成指纹特征
r = fingerprint.gen_char(1)
if r == fingerprint.FINGERPRINT_OK:
print("生成指纹特征1")
elif r == fingerprint.FINGERPRINT_IMAGEMESS:
print("指纹不清晰")
# 3. 搜索指纹
r = fingerprint.search()
if r == fingerprint.FINGERPRINT_OK:
print("匹配成功")
lcd.draw_string(10, 120, "匹配成功 ID:%d"%fingerprint.verify_id, fc=(0,255,0), bc=(0,0,0))
print("score: %d"%fingerprint.verify_score)
lcd.display()
return 0
elif r == 0x09:
print("没有搜索到")
lcd.draw_string(10, 120, "未识别指纹 ", fc=(255,0,0), bc=(0,0,0))
lcd.display()
return -1
# 初始显示界面
lcd.rotation(0)
lcd.clear(color=0)
lcd.draw_string(72, 10, "指纹识别测试", fc=(0,0,255), bc=(0,0,0))
lcd.draw_string(10, 50, "按 按键1 录入指纹", fc=(0,0,255), bc=(0,0,0))
lcd.draw_string(10, 70, "按 按键2 识别指纹", fc=(0,0,255), bc=(0,0,0))
lcd.display()
bt2 = button_group(2) # 按键模块连接到 -- 端口1
fingerprint = fingerprint_sensor(7) # 指纹识别传感器 -- 端口7
s = servo(5) # 舵机 -- 端口5
s.write(0)
id_num = 1
deadline = 0
while True:
if bt2.is_press(1): # 检测到按键按下
time.sleep_ms(10) # 延时消抖
if bt2.is_press(1):
print("\n===============")
print(" 准备录入指纹 ")
print("===============")
enroll(id_num)
id_num += 1
while (bt2.is_press(1)) : # 等待按键释放
pass
if bt2.is_press(2): # 检测到按键按下
time.sleep_ms(10) # 延时消抖
if bt2.is_press(2):
print("\n===============")
print(" 开始指纹识别 ")
print("===============")
if verify() == 0:
deadline = time.ticks_add(time.ticks_ms(), 3000)
print("success")
s.write(90) # 打开
else:
pass
while (bt2.is_press(2)) : # 等待按键释放
pass
if time.ticks_diff(deadline, time.ticks_ms()) < 0: # 超时自动关闭
s.write(0)
time.sleep_ms(10)