예제 #1
0
    def detect(self, img, cascade):
        faces = []
        bias = 15
        rects = cascade.detectMultiScale(img, **self.haar_params)
        if len(rects) == 0:
            return []
        rects[:, 2:] += rects[:, :2]
        for x1, y1, x2, y2 in rects:
            if x1 - bias > 0:
                x1 = x1 - bias
            else:
                x1 = x1

            if y1 - bias > 0:
                y1 = y1 - bias
            else:
                y1 = y1

            if x2 + bias < imtools.get_width(img):
                x2 = x2 + bias
            else:
                x2 = x2

            if y2 + bias < imtools.get_height(img):
                y2 = y2 + bias
            else:
                y2 = y2

            faces.append([x1, y1, x2, y2])

        return faces
    def detect_face(self, img):
        self.rects = []
        self.faces = []
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)

        rects = self.detect(gray, self.cascade_1)
        if len(rects) == 0:
            rects = self.detect(gray, self.cascade_3)
        if len(rects) == 0:
            rects = self.detect(gray, self.cascade_2)
        self.rects = rects
        copy = img.copy()
        self.draw_rects(copy, rects, self.colors['green'])

        if len(rects) > 0:
            self.last_rects = rects
            self.face_hit += 1
        else:
            if self.take_last_rects:
                rects = self.last_rects
            self.face_miss += 1

        for rect in rects:
            (x1, y1, x2, y2) = rect
            # get detected face images
            face = self.fetch_face(img, (x1, y1, x2, y2))
            self.faces.append(face)
            name = self.recognize_face(face)

            if name is not None:  # and name in self.name_rect:
                self.name_rect[name] = rect
                self.trace_face(name, imtools.get_width(img))
                if str(name) == str(self.target):
                    self.id_hit += 1
                    color = self.colors['red']
                else:
                    self.id_miss += 1
                    color = self.colors['green']

                cv2.rectangle(copy, (x1, y1), (x2, y2), color, 2)
                cv2.putText(copy, name, (x1, y1 - 10),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)

        # detect eyes and draw the roi of eyes
        # for x1, y1, x2, y2 in rects:
        #     roi = gray[y1:y2, x1:x2]
        #     copy_roi = copy[y1:y2, x1:x2]
        #     subrects = self.detect(roi.copy(), self.cascade_eye)
        #     self.draw_rects(copy_roi, subrects, self.colors['red'])

        return copy