基于百度智能云的人脸识别系统

演示视频:

【人脸识别】没想到自己做个人脸识别软件居然这么简单!

树莓派人脸识别代码:

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", "信息:"))

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值