You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hunjianghu/gzy/人脸识别/getface.py

66 lines
1.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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()