# -*- coding: utf-8 -*-
"""
Created on Tue Jan 23 13:40:37 2018
@author: sczjwjh
"""
from PIL import Image
import face_recognition
import sys
import numpy as np
import cv2
import threading
#import time
global_encoding_dict = {}
encodings= []
face2 = []
num_jitters = 1
rect = []
def faceencoding1(img):
haar = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
global global_encoding_dict
boxes = []
# img = cv2.imread(imgfile)
img[:,:,0] = cv2.equalizeHist(img[:,:,0])
img[:,:,1] = cv2.equalizeHist(img[:,:,1])
img[:,:,2] = cv2.equalizeHist(img[:,:,2])
image_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# image_gray = cv2.equalizeHist(image_gray)
faces = haar.detectMultiScale(img, 1.3, 3)
if len(faces)==0 :
return False
f_x,f_y,f_w,f_h= faces[0]
face_image = img[f_y:f_y+f_h, f_x:f_x+f_w]
boxes.append([0,f_w,f_h,0])
faces = face_recognition.face_locations(img)
face_encoding = face_recognition.face_encodings(face_image,faces, num_jitters)
if len(face_encoding)==0 :
return False
global_encoding_dict[0] = face_encoding[0]
def face_enconde(img,boxes):
global encodings
global face2
global num_jitters
face_encoding = face_recognition.face_encodings(img,boxes,num_jitters)
if len(face_encoding) > 0:
encodings.append(face_encoding[0])
face2.append(img)
def faceencoding(img):
haar = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
global global_encoding_dict
global encodings
threads= []
boxes = []
global rect
# encodings=[]
# img = cv2.imread(imgfile)
# image_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# faces = haar.detectMultiScale(img, 1.3, 5)
img[:,:,0] = cv2.equalizeHist(img[:,:,0])
img[:,:,1] = cv2.equalizeHist(img[:,:,1])
img[:,:,2] = cv2.equalizeHist(img[:,:,2])
faces = face_recognition.face_locations(img)
if len(faces)==0 :
print('second img no face detected')
return False
for f_x, f_y, f_w, f_h in faces:
face_image = img[f_y:f_y+f_h, f_x:f_x+f_w]
rect.append([f_x, f_y, f_w, f_h])
boxes.append([0,f_w,f_h,0])
t = threading.Thread(target=face_enconde, args=(face_image,boxes,))
t.start()
threads.append(t)
# print('Num of Thread = {}'.format(len(threads)))
for t in threads:
t.join()
# encodings.append(face_recognition.face_encodings(face_image)[0])
global_encoding_dict[1] = encodings
def facecognition(img1,img2):
#处理第一张图片
# face1_encoding = face_recognition.face_encodings(face_image1)[0]
#处理第二张图片
#haar = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
image1 = cv2.imread(img1)
image2 = cv2.imread(img2)
global rect
t1 = threading.Thread(target=faceencoding1, args=(image1,))
t2 = threading.Thread(target=faceencoding, args=(image2,))
t1.start()
t2.start()
t1.join()
t2.join()
# face2_encoding = face_recognition.face_encodings(face_image2)
if len(global_encoding_dict) < 2:
# print('no face detected',len(global_encoding_dict))
return False
face_distances = face_recognition.face_distance(global_encoding_dict[1], global_encoding_dict[0])
for index, distance in enumerate(face_distances):
print(distance)
if distance < 0.55:
f_x, f_y, f_w, f_h = rect[index]
# cv2.rectangle(image2, (f_x - 5, f_y - 5), (f_x + f_w + 5, f_y + f_h+5), (0, 255, 0), 10)
# cv2.imwrite(img2,image2)
# print(distance)
return True
return False
if __name__ == '__main__':
# start_time = time.clock()
img1 = sys.argv[1]
img2 = sys.argv[2]
try:
print(facecognition(img1,img2))
except:
print(False)
# print("run time:{}".format(time.clock() - start_time))
评论0