Blame view

3rdparty/opencv-4.5.4/modules/objdetect/misc/python/test/test_facedetect.py 2.69 KB
f4334277   Hu Chunming   提交3rdparty
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  #!/usr/bin/env python
  
  '''
  face detection using haar cascades
  '''
  
  # Python 2/3 compatibility
  from __future__ import print_function
  
  import numpy as np
  import cv2 as cv
  
  def detect(img, cascade):
      rects = cascade.detectMultiScale(img, scaleFactor=1.275, minNeighbors=4, minSize=(30, 30),
                                       flags=cv.CASCADE_SCALE_IMAGE)
      if len(rects) == 0:
          return []
      rects[:,2:] += rects[:,:2]
      return rects
  
  from tests_common import NewOpenCVTests, intersectionRate
  
  class facedetect_test(NewOpenCVTests):
  
      def test_facedetect(self):
          cascade_fn = self.repoPath + '/data/haarcascades/haarcascade_frontalface_alt.xml'
          nested_fn  = self.repoPath + '/data/haarcascades/haarcascade_eye.xml'
  
          cascade = cv.CascadeClassifier(cascade_fn)
          nested = cv.CascadeClassifier(nested_fn)
  
          samples = ['samples/data/lena.jpg', 'cv/cascadeandhog/images/mona-lisa.png']
  
          faces = []
          eyes = []
  
          testFaces = [
          #lena
          [[218, 200, 389, 371],
          [ 244, 240, 294, 290],
          [ 309, 246, 352, 289]],
  
          #lisa
          [[167, 119, 307, 259],
          [188, 153, 229, 194],
          [236, 153, 277, 194]]
          ]
  
          for sample in samples:
  
              img = self.get_sample(  sample)
              gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
              gray = cv.GaussianBlur(gray, (5, 5), 0)
  
              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:
                          if intersectionRate(eyes[i][0], testFaces[j][1]) > eps and intersectionRate(eyes[i][1] , testFaces[j][2]) > eps:
                              eyes_matches += 1
                          elif intersectionRate(eyes[i][1], testFaces[j][1]) > eps and intersectionRate(eyes[i][0], testFaces[j][2]) > eps:
                              eyes_matches += 1
  
          self.assertEqual(faces_matches, 2)
          self.assertEqual(eyes_matches, 2)
  
  
  if __name__ == '__main__':
      NewOpenCVTests.bootstrap()