基于树莓派的人脸识别门禁系统(python+OpenCV+PyQt)
技术难点:
实现人脸和姓名一一对应
最终实现的是人脸识别门禁,只有录入的人脸才有权限打开门,这就要让树莓派知道识别的是哪张人脸,要将人脸和姓名一一对应起来。在训练的过程中,获取到了人脸和 id,整理成 list 并返回,因此每个人脸都对应一个id,使用 recognizer.predict()函数将其返回,可以将id和人脸对应起来,并可以对置信度进行判断,从而控制继电器的开关,并显示相关提示信息
# faces中的四个量分别为左上角的横坐标、纵坐标、宽度、长度
for(x,y,w,h) in faces:
# 围绕脸的框
cv2.rectangle(self.image, (x,y), (x+w,y+h), (0,255,0), 2)
# 把要分析的面部的捕获部分作为参数,并将返回其可能的所有者,指示其ID以及识别器与该匹配相关的置信度
id, confidence = self.recognizer.predict(gray[y:y+h,x:x+w])
# 对置信度进行判断,高于预定值显示出提示信息,并控制GPIO输出高低电平来控制门的开关
if (confidence < 90):
id = names[id]
confidence = " {0}%".format(round(100 - confidence))
GPIO.output(25, GPIO.HIGH) #GPIO25 输出3.3V
self.lab_T_F.setText( "成功!")
self.lab_ID_E.setText(str(id))
else:
id = "unknown"
GPIO.output(25, GPIO.LOW) #GPIO25 输出0.0V
confidence = " {0}%".format(round(100 - confidence))
self.lab_T_F.setText( "失败!")
self.lab_ID_E.setText("无法识别")
# 给图片添加文本 图片矩阵, 添加文本名称, 设置文本显示位置,
# 字体样式, 字体大小, 字体颜色, 字体粗细
cv2.putText(self.image, str(id), (x+5,y-5), self.font, 1, (255,255,255), 2)
cv2.putText(self.image, str(confidence), (x+5,y+h-5), self.font, 1, (255,255,0), 1)