|
import numpy as np |
|
import cv2 |
|
|
|
|
|
def crop_face(img, lmk_extractor, expand=1.5): |
|
result = lmk_extractor(img) |
|
|
|
if result is None: |
|
return None |
|
|
|
H, W, _ = img.shape |
|
lmks = result['lmks'] |
|
lmks[:, 0] *= W |
|
lmks[:, 1] *= H |
|
|
|
x_min = np.min(lmks[:, 0]) |
|
x_max = np.max(lmks[:, 0]) |
|
y_min = np.min(lmks[:, 1]) |
|
y_max = np.max(lmks[:, 1]) |
|
|
|
width = x_max - x_min |
|
height = y_max - y_min |
|
|
|
center_x = x_min + width / 2 |
|
center_y = y_min + height / 2 |
|
|
|
width *= expand |
|
height *= expand |
|
|
|
size = max(width, height) |
|
|
|
x_min = int(center_x - size / 2) |
|
x_max = int(center_x + size / 2) |
|
y_min = int(center_y - size / 2) |
|
y_max = int(center_y + size / 2) |
|
|
|
top = max(0, -y_min) |
|
bottom = max(0, y_max - img.shape[0]) |
|
left = max(0, -x_min) |
|
right = max(0, x_max - img.shape[1]) |
|
img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=0) |
|
|
|
cropped_img = img[y_min + top:y_max + top, x_min + left:x_max + left] |
|
|
|
return cropped_img |
|
|