调用opencv模块实现人脸识别
注:为更清楚的讲解,没有对方法进行封装,在生产环境中请按策略进行封装
import WosLikeMe
Similarity = WosLikeMe.main(1308002****, 'https://****.oss-cn-beijing.aliyuncs.com/temp/faceTest/3.jpg')
print(Similarity)
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import numpy as np
from PIL import Image
import os
import cv2
import config
import WosDownload
import WosGetFace
def main(userId, image):
src = cv2.__file__
src = src.replace('__init__.py', '', 1) + 'data/'
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 加载训练模型
recognizer.read(config.__trainer__path + '/' + str(userId) + '.yml')
face_detector = cv2.CascadeClassifier(src + 'haarcascade_frontalface_default.xml')
# 下载image
face = WosDownload.main(image)[0]
# 读取新人脸
newFace = cv2.imread(face)
gray = cv2.cvtColor(newFace, cv2.COLOR_RGB2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
faceCount = format(len(faces))
if faceCount == 0:
print("ERR: This Image not face", userId)
return False
resultArray = [] # 如果在图片中识别很多个人脸,检测结果都存到数组中
maxResult = 0 # 最终数组中最大数为检测结果
for (x, y, w, h) in faces:
idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w])
if confidence < 100:
resultArray.append(confidence)
else:
resultArray.append(0)
print(resultArray)
for r in resultArray:
if r > 0:
maxResult = int(r)
# 如果有大于80的人脸信息,进行二次训练
# 保存头像
if maxResult > 80 : # 80建议在config中设置,或者根据用户头像图片数量适当提升这个值
WosGetFace(userId, image)
# 进行训练
return maxResult