test_facedetect.py 2.69 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/env python

'''
face detection using haar cascades
'''

# Python 2/3 compatibility
from __future__ import print_function

import numpy as np
import cv2

def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
                                     flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

21
from tests_common import NewOpenCVTests, intersectionRate
22 23 24 25

class facedetect_test(NewOpenCVTests):

    def test_facedetect(self):
26 27
        cascade_fn = self.repoPath + '/data/haarcascades/haarcascade_frontalface_alt.xml'
        nested_fn  = self.repoPath + '/data/haarcascades/haarcascade_eye.xml'
28 29 30 31

        cascade = cv2.CascadeClassifier(cascade_fn)
        nested = cv2.CascadeClassifier(nested_fn)

32
        samples = ['samples/data/lena.jpg', 'cv/cascadeandhog/images/mona-lisa.png']
33 34 35 36 37 38 39 40 41 42

        faces = []
        eyes = []

        testFaces = [
        #lena
        [[218, 200, 389, 371],
        [ 244, 240, 294, 290],
        [ 309, 246, 352, 289]],

43 44 45 46
        #lisa
        [[167, 119, 307, 259],
        [188, 153, 229, 194],
        [236, 153, 277, 194]]
47 48 49 50
        ]

        for sample in samples:

51
            img = self.get_sample(  sample)
52
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
53
            gray = cv2.GaussianBlur(gray, (5, 5), 5.1)
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

            rects = detect(gray, cascade)
            faces.append(rects)

            if not nested.empty():
                for x1, y1, x2, y2 in rects:
                    roi = gray[y1:y2, x1:x2]
                    subrects = detect(roi.copy(), nested)

                    for rect in subrects:
                        rect[0] += x1
                        rect[2] += x1
                        rect[1] += y1
                        rect[3] += y1

                    eyes.append(subrects)

        faces_matches = 0
        eyes_matches = 0

        eps = 0.8

        for i in range(len(faces)):
            for j in range(len(testFaces)):
                if intersectionRate(faces[i][0], testFaces[j][0]) > eps:
                    faces_matches += 1
                    #check eyes
                    if len(eyes[i]) == 2:
82
                        if intersectionRate(eyes[i][0], testFaces[j][1]) > eps and intersectionRate(eyes[i][1] , testFaces[j][2]) > eps:
83
                            eyes_matches += 1
84
                        elif intersectionRate(eyes[i][1], testFaces[j][1]) > eps and intersectionRate(eyes[i][0], testFaces[j][2]) > eps:
85 86 87
                            eyes_matches += 1

        self.assertEqual(faces_matches, 2)
88 89 90 91 92
        self.assertEqual(eyes_matches, 2)


if __name__ == '__main__':
    NewOpenCVTests.bootstrap()