# coding = utf-8
# 圈出图片中所有的人脸
import numpy as np
import math
import cv2
import dlib

path = '/Users/yanshao/Desktop/img/timg.jpeg'
Model = '/Users/yanshao/dlib/shape_predictor_5_face_landmarks.dat'

# 首先把图片转化为方形

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(Model)


def preprocess():
    image = cv2.imread(path)
    height, width, chl = image.shape[0], image.shape[1], image.shape[2]
    rec = int(max(height, width) * 1.5)
    pic = np.zeros((rec, rec, chl), np.uint8)
    baseh, basew = (rec - height) // 2, (rec - width) // 2
    pic[baseh:height + baseh, basew:width + basew] = image
    return pic, rec


# 为了检测出图片中的所有人脸，我们每次把图片翻转45度
def get_dist(point1, point2):
    return math.sqrt((point1[0]-point2[0])*(point1[0]-point2[0]) +
                     (point1[1]-point2[1])*(point1[1]-point2[1]))


def get_pos(point, M):
    return np.linalg.solve([[M[0][0], M[0][1]],
                            [M[1][0], M[1][1]]],
                            [point[0]-M[0][2], point[1]-M[1][2]]).astype(np.int32)


pic, rec = preprocess()
center = (rec//2,rec//2)
list = []
for ang in range(0, 8):
    M = cv2.getRotationMatrix2D(center, 45*ang, 1)
    pic2 = cv2.warpAffine(pic, M, (rec, rec))
    dets = detector(pic2, 1)
    print(len(dets))
    for face in dets:
        left, right, top, bot = face.left(), face.right(), face.top(), face.bottom()
        LT, RB = get_pos((left, top), M), get_pos((right, bot), M)
        list.append(((LT[0]+RB[0])//2, (LT[1]+RB[1])//2, (right-left)//2))

    cv2.destroyAllWindows()

length = len(list)
for i in range(0, length):
    flag = False
    for j in range(0, i):
        if get_dist(list[i], list[j]) < list[i][2]+list[j][2]:
            flag = True
    if not flag:
        cv2.circle(pic, (list[i][0], list[i][1]), list[i][2], (0, 255, 0))

cv2.imshow("img", pic)
cv2.waitKey(0)
cv2.destroyAllWindows()
