-
Notifications
You must be signed in to change notification settings - Fork 0
/
FaceDetector.py
59 lines (46 loc) · 1.95 KB
/
FaceDetector.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
51
52
53
54
55
56
57
58
59
from OpenCVClassifierParser import OpenCVClassifierParser
import IntegralImage as IntegralImage
from Area import Area
from Utils import merge
class FaceDetector:
def __init__(self, classifiers_path):
parser = OpenCVClassifierParser(classifiers_path)
self.stages = parser.parse()
self.feature_size = parser.feature_size
self.all_scales = []
def detect(
self,
image,
base_scale,
scale_increment,
position_increment,
min_neighbors
):
integral_image = IntegralImage.to_integral_image(image)
found_faces = [] # Areas
self.calculate_scales(base_scale, scale_increment, image.shape[0], image.shape[1])
for stage in self.stages:
stage.calculate_scaled_features(self.all_scales)
for scale_index in range(0, len(self.all_scales)):
step = int(self.all_scales[scale_index] * self.feature_size * position_increment)
size = int(self.all_scales[scale_index] * self.feature_size)
for x in range(0, image.shape[0] - size + 1, step):
for y in range(0, image.shape[1] - size + 1, step):
result = True
for stage in self.stages:
if not stage.calculate_prediction(
integral_image, (x, y), scale_index
):
result = False
break
if result:
found_faces.append(Area(x, y, size))
return merge(found_faces, min_neighbors)
def calculate_scales(self, base_scale, scale_increment, width, height):
self.all_scales = []
max_scale = min(width, height) / self.feature_size
scale = base_scale
while scale < max_scale:
self.all_scales.append(scale)
scale *= scale_increment
self.all_scales.append(max_scale)