多线程处理客户端连接
客户端负责人脸采集和人脸注册功能;
服务器负责人脸数据集训练和人脸识别功能。
信息交互采用字节形式。
【后期可加入数据库、客户端收发线程实现多平台操作】
fs_server.py
import cv2
import json
import time
import os,sys
import socket
import pyttsx3
import threading
import numpy as np
from PIL import Image
#服务器端负责实际的训练人脸集以及识别任务
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定端口号
s.bind(('127.0.0.1', 3333))
#首次启动环境创建
def makeDir(engine):
flag= 0
if not os.path.exists("face_trainer"):
print("创建预训练环境")
engine.say('检测到第一次启动,未检测到环境,正在创建环境')
engine.say('正在创建预训练环境')
os.mkdir("face_trainer")
engine.say('创建成功')
engine.runAndWait()
flag=1
if not os.path.exists("Facedata"):
print("创建训练环境")
engine.say('正在创建训练环境')
os.mkdir("Facedata")
engine.say('创建成功')
engine.runAndWait()
flag=1
return flag
#语音模块
def say(engine,str):
engine.say(str)
engine.runAndWait()
#初始化
names = []
if os.path.exists("name.txt"):
with open("name.txt") as f:
names = json.loads(f.read())
# print(names)
engine = pyttsx3.init()
rate = engine.getProperty('rate')
engine.setProperty('rate', rate - 20)
#是否首次启动,若首次启动则直接提示录入人脸或退出
flag = makeDir(engine)
# 监听端口:
s.listen(5)
print('Waiting for connection...')
def getImagesAndLabels(path, detector):
imagePaths = [os.path.join(path, f) for f in os.listdir(path)] # join函数的作用?
faceSamples = []
ids = []
for imagePath in imagePaths:
PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
img_numpy = np.array(PIL_img, 'uint8')
id = int(os.path.split(imagePath)[-1].split(".")[1])
faces = detector.detectMulti