|
import dlib |
|
import cv2 |
|
def compute_aspect_preserved_bbox(bbox, increase_area, h, w): |
|
left, top, right, bot = bbox |
|
width = right - left |
|
height = bot - top |
|
|
|
width_increase = max(increase_area, ((1 + 2 * increase_area) * height - width) / (2 * width)) |
|
height_increase = max(increase_area, ((1 + 2 * increase_area) * width - height) / (2 * height)) |
|
|
|
left_t = int(left - width_increase * width) |
|
top_t = int(top - height_increase * height) |
|
right_t = int(right + width_increase * width) |
|
bot_t = int(bot + height_increase * height) |
|
|
|
left_oob = -min(0, left_t) |
|
right_oob = right - min(right_t, w) |
|
top_oob = -min(0, top_t) |
|
bot_oob = bot - min(bot_t, h) |
|
|
|
if max(left_oob, right_oob, top_oob, bot_oob) > 0: |
|
max_w = max(left_oob, right_oob) |
|
max_h = max(top_oob, bot_oob) |
|
if max_w > max_h: |
|
return left_t + max_w, top_t + max_w, right_t - max_w, bot_t - max_w |
|
else: |
|
return left_t + max_h, top_t + max_h, right_t - max_h, bot_t - max_h |
|
|
|
else: |
|
return (left_t, top_t, right_t, bot_t) |
|
|
|
def crop_src_image(src_img,save_img, detector=None): |
|
if detector is None: |
|
detector = dlib.get_frontal_face_detector() |
|
|
|
img = cv2.imread(src_img) |
|
faces = detector(img, 0) |
|
h, width, _ = img.shape |
|
if len(faces) > 0: |
|
bbox = [faces[0].left(), faces[0].top(),faces[0].right(), faces[0].bottom()] |
|
l = bbox[3]-bbox[1] |
|
bbox[1]= bbox[1]-l*0.1 |
|
bbox[3]= bbox[3]-l*0.1 |
|
bbox[1] = max(0,bbox[1]) |
|
bbox[3] = min(h,bbox[3]) |
|
bbox = compute_aspect_preserved_bbox(tuple(bbox), 0.5, img.shape[0], img.shape[1]) |
|
img = img[bbox[1] :bbox[3] , bbox[0]:bbox[2]] |
|
img = cv2.resize(img, (256, 256)) |
|
cv2.imwrite(save_img,img) |
|
else: |
|
img = cv2.resize(img,(256,256)) |
|
cv2.imwrite(save_img, img) |
|
|
|
if __name__ == '__main__': |
|
src_img = "" |
|
out_img = "" |
|
crop_src_image(src_img,out_img) |