All
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import face_recognition
|
||||
import cv2
|
||||
import numpy as np
|
||||
import skimage
|
||||
import skimage.transform
|
||||
import warnings
|
||||
|
||||
def detect_faces(img):
|
||||
'''
|
||||
Detect faces in image
|
||||
:param img: cv::mat HxWx3 RGB
|
||||
:return: yield 4 <x,y,w,h>
|
||||
'''
|
||||
# detect faces
|
||||
bbs = face_recognition.face_locations(img)
|
||||
|
||||
for y, right, bottom, x in bbs:
|
||||
# Scale back up face bb
|
||||
yield x, y, (right - x), (bottom - y)
|
||||
|
||||
def detect_biggest_face(img):
|
||||
'''
|
||||
Detect biggest face in image
|
||||
:param img: cv::mat HxWx3 RGB
|
||||
:return: 4 <x,y,w,h>
|
||||
'''
|
||||
# detect faces
|
||||
bbs = face_recognition.face_locations(img)
|
||||
|
||||
max_area = float('-inf')
|
||||
max_area_i = 0
|
||||
for i, (y, right, bottom, x) in enumerate(bbs):
|
||||
area = (right - x) * (bottom - y)
|
||||
if max_area < area:
|
||||
max_area = area
|
||||
max_area_i = i
|
||||
|
||||
if max_area != float('-inf'):
|
||||
y, right, bottom, x = bbs[max_area_i]
|
||||
return x, y, (right - x), (bottom - y)
|
||||
|
||||
return None
|
||||
|
||||
def crop_face_with_bb(img, bb):
|
||||
'''
|
||||
Crop face in image given bb
|
||||
:param img: cv::mat HxWx3
|
||||
:param bb: 4 (<x,y,w,h>)
|
||||
:return: HxWx3
|
||||
'''
|
||||
x, y, w, h = bb
|
||||
return img[y:y+h, x:x+w, :]
|
||||
|
||||
def place_face(img, face, bb):
|
||||
x, y, w, h = bb
|
||||
face = resize_face(face, size=(w, h))
|
||||
img[y:y+h, x:x+w] = face
|
||||
return img
|
||||
|
||||
def resize_face(face_img, size=(128, 128)):
|
||||
'''
|
||||
Resize face to a given size
|
||||
:param face_img: cv::mat HxWx3
|
||||
:param size: new H and W (size x size). 128 by default.
|
||||
:return: cv::mat size x size x 3
|
||||
'''
|
||||
return cv2.resize(face_img, size)
|
||||
|
||||
def detect_landmarks(face_img):
|
||||
landmakrs = face_recognition.face_landmarks(face_img)
|
||||
return landmakrs[0] if len(landmakrs) > 0 else None
|
||||
Reference in New Issue
Block a user