-
Notifications
You must be signed in to change notification settings - Fork 15
/
face_crop_simple.py
50 lines (41 loc) · 1.7 KB
/
face_crop_simple.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# -*- coding: utf-8 -*-
import cv2
import sys
import os
from os import path
import math
from math import sin, cos
cascades_dir = path.normpath(path.join(cv2.__file__, '..', '..', '..', '..', 'share', 'OpenCV', 'haarcascades'))
color = (255, 255, 255) # color of rectangle for face detection
def face_detect(file):
image = cv2.imread(file)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cascade_f = cv2.CascadeClassifier(path.join(cascades_dir, 'haarcascade_frontalface_alt2.xml'))
cascade_e = cv2.CascadeClassifier(path.join(cascades_dir, 'haarcascade_eye.xml'))
facerect = cascade_f.detectMultiScale(image_gray, scaleFactor=1.08, minNeighbors=1, minSize=(50, 50))
# print("face rectangle")
# print(facerect)
if not os.path.exists("face_images"):
os.mkdir("face_images")
base = os.path.splitext(os.path.basename(sys.argv[1]))[0] + "_"
if len(facerect) > 0:
# filename numbering
numb = 0
for rect in facerect:
x, y, w, h = rect
# eyes in face?
y_offset = int(h * 0.1)
eye_area = image_gray[y + y_offset: y + h, x: x + w]
eyes = cascade_e.detectMultiScale(eye_area, 1.05)
eyes = filter(lambda e: (e[0] > w / 2 or e[0] + e[2] < w / 2) and e[1] + e[3] < h / 2, eyes)
# print(len(eyes))
if len(eyes) > 0:
image_face = image[y:y+h, x:x+h]
cv2.imwrite("face_images/" + base + str("{0:02d}".format(numb)) + ".jpg", image_face)
numb += 1
if __name__ == '__main__':
param = sys.argv
if (len(param) != 2):
print ("Usage: $ python " + param[0] + " sample.jpg")
quit()
face_detect(param[1])