演示视频:
【人脸识别】没想到自己做个人脸识别软件居然这么简单!
树莓派人脸识别代码:
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import base64
from aip import AipFace
import Adafruit_SSD1306
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
class Display:
def __init__(self):
self.display = Adafruit_SSD1306.SSD1306_128_64(rst=None)
self.display.begin()
self.display.clear()
width = self.display.width
height = self.display.height
self.display_draw = Image.new('1', (width, height))
self.draw_board = ImageDraw.Draw(self.display_draw)
self.draw_board.rectangle((0, 0, width, height), outline=0, fill=0)
def DrawBoard(self, x, y, size, text):
font = ImageFont.truetype(
"simsun.ttc", size, encoding="utf-8")
self.draw_board.rectangle((x, y, 128, y + size), fill=0)
self.draw_board.text((x, y), text, font=font, fill=255)
self.display.image(self.display_draw)
self.display.display()
class Camera:
def __init__(self):
self.camera = PiCamera()
self.camera.resolution = (640, 480)
self.camera.framerate = 32
def TakePhoto(self):
raw_capture = PiRGBArray(self.camera, size=(640, 480))
for frame in self.camera.capture_continuous(raw_capture, format="bgr", use_video_port=True):
image = frame.array
_, buffer = cv2.imencode('.jpg', image)
jpg_as_text = base64.b64encode(buffer)
return jpg_as_text
class FaceRecognition:
def __init__(self):
app_id = '19501875'
api_key = 'OyFeS0pmGq0Vo2khsaf0nNC7'
secret_key = 'PGeTHZ8cQG22uuWx5D3F0v1SGHjGj4PS'
self.client = AipFace(app_id, api_key, secret_key)
self.img_type = 'BASE64'
self.group = '01'
def Recognition(self, img):
result = self.client.search(str(img, 'utf-8'), self.img_type, self.group)
msg = result['error_msg']
if msg == 'SUCCESS':
name = result['result']['user_list'][0]['user_id']
name = bytes().fromhex(name).decode('gbk')
score = result['result']['user_list'][0]['score']
else:
name = ''
score = 0
return msg, name, score
def main():
display = Display()
camera = Camera()
face_recognition = FaceRecognition()
display.DrawBoard(0, 0, 20, '人脸识别系统!')
time.sleep(0.1)
while True:
img = camera.TakePhoto()
msg, name, score = face_recognition.Recognition(img)
if msg == 'SUCCESS':
# print(name,score)
if score >= 80:
print('你好 %s !' % name)
display.DrawBoard(0, 23, 16, '你好%s!' % name)
else:
print('我不认识你!')
display.DrawBoard(0, 23, 16, '我不认识你!')
if msg == 'pic not has face':
print('未识别到人脸!')
display.DrawBoard(0, 23, 16, '未识别到人脸!')
if __name__ == '__main__':
main()
人脸录入系统:
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.Qt import QThread, QImage, QPixmap, pyqtSignal, QIcon
import sys
from GUI import Ui_MainWindow
import cv2
import base64
from aip import AipFace
import binascii
image = None
flag = left = top = width = height = 0
name = list_text = ''
class Video(QThread):
signal = pyqtSignal()
def __init__(self):
super().__init__()
self.cap = cv2.VideoCapture(0)
self.qImg = None
self.img = None
def run(self):
global image, left, top, width, height
while True:
_, self.img = self.cap.read()
img2 = self.img.copy()
cv2.rectangle(img2, (left, top), (left+width, top+height), (255, 255, 255), 2)
image = self.img
h, w, c = img2.shape
self.qImg = QImage(img2.data, w, h, w * 3, QImage.Format_RGB888).rgbSwapped()
self.signal.emit()
class FaceDetection(QThread):
flag1 = pyqtSignal()
flag2 = pyqtSignal(list)
flag3 = pyqtSignal(str)
def __init__(self):
super().__init__()
app_id = '19501875'
api_key = 'OyFeS0pmGq0Vo2khsaf0nNC7'
secret_key = 'PGeTHZ8cQG22uuWx5D3F0v1SGHjGj4PS'
self.client = AipFace(app_id, api_key, secret_key)
self.img_type = 'BASE64'
self.group = '01'
self.buffer = None
self.video = Video()
self.img = None
def face_detection(self, img):
face = self.client.detect(img, self.img_type)
if face['error_msg'] == 'SUCCESS':
x = int(face['result']['face_list'][0]['location']['left'])
y = int(face['result']['face_list'][0]['location']['top'])
w = int(face['result']['face_list'][0]['location']['width'])
h = int(face['result']['face_list'][0]['location']['height'])
else:
x, y, w, h = left, top, width, height
return x, y, w, h
def cv2_base64(self, img):
_, self.buffer = cv2.imencode('.jpg', img)
base64_s = base64.b64encode(self.buffer)
base64_st = str(base64_s, 'utf-8')
return base64_st
def face_enter(self, img, text):
texts = str(binascii.b2a_hex(text.encode('GBK')))[2:-1]
self.client.addUser(img, self.img_type, self.group, texts)
self.flag1.emit()
def face_list(self):
global flag
names = []
lists = self.client.getGroupUsers(self.group)
for li in lists['result']['user_id_list']:
names.append(bytes().fromhex(li).decode('gbk'))
self.flag2.emit(names)
flag = 0
def face_test(self, img):
result = self.client.search(img, self.img_type, self.group)
msg = result['error_msg']
if msg == 'SUCCESS':
names = result['result']['user_list'][0]['user_id']
names = bytes().fromhex(names).decode('gbk')
score = result['result']['user_list'][0]['score']
else:
names = ''
score = 0
return msg, names, score
def delete_face(self, text):
texts = str(binascii.b2a_hex(text.encode('GBK')))[2:-1]
self.client.deleteUser(self.group, texts)
def run(self):
global image, left, top, width, height, flag, name
while True:
base64_str = self.cv2_base64(image)
x, y, w, h = left, top, width, height
left, top, width, height = self.face_detection(base64_str)
if flag == 1:
if x != left or y != top or w != width or h != height:
self.face_enter(base64_str, name)
elif flag == 2:
self.face_list()
elif flag == 3:
msg, names, score = self.face_test(base64_str)
if msg == 'SUCCESS':
if score >= 70:
self.flag3.emit('你好 %s !' % names)
else:
self.flag3.emit('我不认识你!')
if msg == 'pic not has face':
self.flag3.emit('未识别到人脸!')
elif flag == 4:
self.delete_face(list_text)
class MainWin(Ui_MainWindow):
def __init__(self):
self.video = Video()
self.video.start()
self.detection = FaceDetection()
self.detection.start()
self.progress = 0
def setupUi(self, MainWindow):
Ui_MainWindow.setupUi(self, MainWindow)
self.video.signal.connect(self.Video)
self.pushButton.clicked.connect(self.button1)
self.detection.flag1.connect(self.progress_bar)
self.pushButton_2.clicked.connect(self.button2)
self.detection.flag2.connect(self.face_list)
self.pushButton_3.clicked.connect(self.button3)
self.detection.flag3.connect(self.face_test)
self.pushButton_4.clicked.connect(self.button4)
def face_test(self, text):
self.label_5.setText(text)
def face_list(self, lists):
self.comboBox.addItems(lists)
def progress_bar(self):
global flag
self.progress += 5
if self.progress == 100:
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True)
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.label_5.setText('录入完成!')
self.progress = 0
flag = 0
self.progressBar.setProperty("value", self.progress)
def button1(self):
global flag, name
if self.lineEdit.text() + 'None' != 'None':
name = self.lineEdit.text()
flag = 1
self.pushButton.setEnabled(False)
self.pushButton_2.setEnabled(False)
self.pushButton_3.setEnabled(False)
self.pushButton_4.setEnabled(False)
self.label_5.setText('人脸信息录入中!')
else:
self.label_5.setText('请输入名字!')
def button2(self):
global flag
flag = 2
self.comboBox.clear()
self.label_5.setText('获取成功!')
def button3(self):
global flag
if flag == 0:
flag = 3
self.pushButton.setEnabled(False)
self.pushButton_2.setEnabled(False)
self.pushButton_4.setEnabled(False)
self.pushButton_3.setText('停止测试')
else:
flag = 0
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton_3.setText('测试')
self.label_5.setText('')
def button4(self):
global flag, list_text
flag = 4
list_text = self.comboBox.currentText()
self.comboBox.clear()
self.label_5.setText('删除成功!')
def Video(self):
self.label.setPixmap(QPixmap(self.video.qImg))
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('./icon.ico'))
main = QMainWindow()
ui = MainWin()
ui.setupUi(main)
main.show()
sys.exit(app.exec_())
QT生成代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(803, 531)
MainWindow.setMinimumSize(QtCore.QSize(803, 531))
MainWindow.setMaximumSize(QtCore.QSize(803, 531))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(10, 500, 641, 23))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 10, 640, 480))
self.label.setMinimumSize(QtCore.QSize(640, 480))
self.label.setMaximumSize(QtCore.QSize(639, 480))
self.label.setText("")
self.label.setPixmap(QtGui.QPixmap("C:/Users/wangxin/Desktop/未标题-1.jpg"))
self.label.setScaledContents(False)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(660, 30, 41, 16))
self.label_2.setObjectName("label_2")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(700, 30, 91, 21))
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(660, 60, 131, 31))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(660, 140, 131, 31))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(660, 100, 131, 31))
self.pushButton_3.setObjectName("pushButton_3")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(660, 180, 131, 22))
self.comboBox.setObjectName("comboBox")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(660, 210, 131, 28))
self.pushButton_4.setObjectName("pushButton_4")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(660, 250, 72, 15))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(660, 270, 121, 21))
self.label_5.setText("")
self.label_5.setObjectName("label_5")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "人脸录入系统"))
self.label_2.setText(_translate("MainWindow", "姓名:"))
self.pushButton.setText(_translate("MainWindow", "录入人脸数据"))
self.pushButton_2.setText(_translate("MainWindow", "获取人脸列表"))
self.pushButton_3.setText(_translate("MainWindow", "测试"))
self.pushButton_4.setText(_translate("MainWindow", "删除"))
self.label_4.setText(_translate("MainWindow", "信息:"))