Bootstrap

K210人脸识别+人脸信息断电存储

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卡时要进行一个字节数组–>字符串的转换。

至此,人脸特征断电存储的功能就实现了,如果有疑问的地方,欢迎大家在评论区评论,或者也可以私信我。

;