K210系列教程
使用MaixPy IDE开发K210
K210实现人脸识别(附代码解读)
K210人脸识别+人脸信息存储
K210人脸识别+RFID录入信息
在我的上一篇博客中已经介绍了如何使用K210实现基本的人脸识别功能
https://blog.csdn.net/HuangChen666/article/details/113995079?spm=1001.2014.3001.5501
今天和大家分享我是如何实现人脸特征值的断电存储的。
一、学会读写SD卡
首先确保SD卡是fat16或fat32格式(某些厂家的SD卡不适配k210的板子,这里请去官网查询),由于MaixPy是基于micorpython开发的,所以一些文件系统的操作都相差无几,下面给出一个读写SD卡的代码
import uos #文件操作需要导入uos这个包
#读操作
with open("/sd/recordftr3.txt", "r") as f:
while(1):
line = f.readline()
if not line:
break
print(line)
#写操作
with open("/sd/recordftr3.txt", "a") as f:
f.write("aaaaaaaaa\n")
二、断电存储人脸特征的原理
所谓断电存储人脸特征,其实就是将人脸特征和人的信息(例如学号、姓名等)想办法关联起来,我这里用的方法比较容易想到,也比较普遍直接。
原理: 官网提供的源码中,是按下按键时将当前的特征值保存到record_ftrs列表中,这里注意的是record_ftrs列表是在代码中定义的,所以掉电会丢失,那么保存特征值的操作必在这里实现,看一下源码:
if key_pressed == 1: #如果检测到按键
key_pressed = 0 #重置按键状态
record_ftr = feature
record_ftrs.append(record_ftr) #将当前特征添加到已知特征列表
如果你仔细阅读源码(结合注释)就会发现循环中的人脸特征赋给了feature变量,那么我们要做的就是加上一个把feature的值写入SD卡的代码。
但是单单写入特征值还不能够实现人脸的识别功能,所以我的做法是把学号姓名和特征值一起按行写入SD卡,然后读出的时候按行读出,再把姓名append到names列表,特征值append到record_ftrs列表,这样两者的下标是对应的了,即可实现人脸识别也可以断电存储。
三、断电存储人脸特征的具体操作
直接上代码
#写入SD卡
with open("/sd/recordftr3.txt", "a") as f:
f.write(strnum+'#'+strname+'#'+str(feature)) #信息写入SD卡
record_ftrs.append(feature) #人脸特征追加到record_ftrs列表
names.append(stu_num+'#'+stu_name) #追加到姓名列表
f.write("\n")
f.close()
代码说明:
strnum:表示学号
strname:表示姓名
一定有同学好奇我这个学号和姓名是哪里来的,我其实是用的RFID射频识别,从事先准备好的IC卡中读取学号和姓名的信息,这一块如果有同学想要了解的可以评论区告诉我, 我会再写一期博客。
当然你们也可以取巧,事先在代码里拟定好一些伪姓名;或者使用其他方法,动动自己的小脑筋哦!
PS: 这里要注意的是写入后一定要再写入一个 “\n” ,因为我们以后要按行读出的学号姓名和特征值之所以能关联,是因为他们在同一行上。
#读取人脸信息和特征值
i = 0
temp_num = ''
with open("/sd/recordftr3.txt", "r") as f:
while(1):
line = f.readline()
if not line:
break
stu_num = line[0:line.index('#')] #获取学号
line = line[line.index('#')+1:] #截取除了学号以外的字符串
stu_name = line[0:line.index('#')] #获取姓名
names.append(stu_num+'#'+stu_name) #追加到姓名列表
line = line[line.index('#')+1:] #截取人脸特征
record_ftrs.append(eval(line)) #向人脸特征列表中添加已存特征
if stu_num != temp_num:
temp_num = stu_num
i = i + 1
print("%d:%s%s" % (i,stu_num,stu_name),line)
代码说明: 我保存人脸特征的格式是:学号#姓名#特征值,即以#隔开,所以读取的时候运用python独有的分割字符串的方法即可。
PS: 这里有个比较细节的地方,也算是个比较头疼的地方,已经有几个小伙伴被这个问题困扰,在这里一起说明一下。
如果你将人脸特征打印出来会发现它的类型是字节数组,但是你写入SD卡后再读出来它是字符串类型,这个时候还不能把它直接append到record_ftrs列表里,需要进行字符串–>字节数组的转换,我本人也是试了很多方法,最后发现使用eval方法即可。
当然写入的时候要以字符串格式写入,使用str方法即可,因为我是把它们拼接成了一个大的字符串,所以写入SD卡时要进行一个字节数组–>字符串的转换。
至此,人脸特征断电存储的功能就实现了,如果有疑问的地方,欢迎大家在评论区评论,或者也可以私信我。