|
import cv2 |
|
|
|
def discover_square_crop_points(points, image, step=3, maximum_step=30): |
|
|
|
x = points["x"] |
|
y = points["y"] |
|
w = points["w"] |
|
h = points["h"] |
|
|
|
if step >= maximum_step: |
|
return {"initial_x": x, "initial_y": y, "final_x": x + w, "final_y": x + h} |
|
|
|
img_height = image.shape[0] |
|
img_width = image.shape[1] |
|
|
|
crop_offset = ((w + h) / 2) / step |
|
|
|
initial_x = x - crop_offset |
|
initial_y = y - crop_offset |
|
final_x = x + w + crop_offset |
|
final_y = y + h + crop_offset |
|
|
|
if initial_x < 0 or initial_y < 0 or final_x > img_width or final_y > img_height: |
|
return discover_square_crop_points(points, image, step+1, maximum_step) |
|
|
|
initial_x = int(initial_x) |
|
initial_y = int(initial_y) |
|
final_x = int(final_x) |
|
final_y = int(final_y) |
|
|
|
print(f"step: {step}") |
|
return {"initial_x": initial_x, "initial_y": initial_y, "final_x": final_x, "final_y": final_y} |
|
|
|
def crop_faces(cv2_image): |
|
gray = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2GRAY) |
|
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml') |
|
|
|
multiScaleValues = [1.01] |
|
|
|
for value in multiScaleValues: |
|
faces = face_cascade.detectMultiScale(image=gray, scaleFactor=value, minNeighbors=4, minSize=(512, 512)) |
|
if len(faces) > 0: |
|
break |
|
|
|
cropped_faces = [] |
|
|
|
for (x, y, w, h) in faces: |
|
points = {"x": x, "y": y, "w": w, "h": h} |
|
points = discover_square_crop_points(points, cv2_image) |
|
|
|
initial_x = points["initial_x"] |
|
initial_y = points["initial_y"] |
|
final_x = points["final_x"] |
|
final_y = points["final_y"] |
|
|
|
face = cv2_image[initial_y:final_y, initial_x:final_x] |
|
cropped_faces.append(face) |
|
|
|
return cropped_faces |