Ejemplo n.º 1
0
    def identify(self, bounding_box_content: numpy.ndarray, mask: numpy.ndarray=None) -> Subject:
        bounding_box_content, mask = self.__extract_person(bounding_box_content, mask)

        image_hsv = cv2.cvtColor(bounding_box_content, cv2.COLOR_BGR2HSV)
        hue_channel, saturation_channel, _ = cv2.split(image_hsv)
        hue_images = self.__split_image(hue_channel)
        sat_images = self.__split_image(saturation_channel)

        image_bgr = bounding_box_content
        blue_channel, green_channel, red_channel = cv2.split(image_bgr)
        blue_images = self.__split_image(blue_channel)
        green_images = self.__split_image(green_channel)
        red_images = self.__split_image(red_channel)

        image_ycrcb = cv2.cvtColor(bounding_box_content, cv2.COLOR_BGR2YCrCb)
        _, cr_channel, cb_channel = cv2.split(image_ycrcb)
        cr_images = self.__split_image(cr_channel)
        cb_images = self.__split_image(cb_channel)

        masks = self.__split_image(mask)

        hue_histograms = self.__calculate_histograms(masks, 19, (0, 180), hue_images)
        sat_histograms = self.__calculate_histograms(masks, 16, (0, 256), sat_images)
        blue_histograms = self.__calculate_histograms(masks, 16, (0, 256), blue_images)
        green_histograms = self.__calculate_histograms(masks, 16, (0, 256), green_images)
        red_histograms = self.__calculate_histograms(masks, 16, (0, 256), red_images)
        cr_histograms = self.__calculate_histograms(masks, 16, (0, 256), cr_images)
        cb_histograms = self.__calculate_histograms(masks, 16, (0, 256), cb_images)

        new_histograms = SubjectHistograms(hue_histograms, sat_histograms, blue_histograms, green_histograms,
                                           red_histograms, cr_histograms, cb_histograms)
        self.__new_histograms = new_histograms

        if self.__feature_matching_enabled:
            new_descriptors = self.__get_descriptors((image_bgr, mask))
        else:
            new_descriptors = None

        if self.__add_to_db:
            if self.__subject is None:
                self.__subject = Subject(self.__add_to_db, new_histograms, new_descriptors)
                Database.add_subject(self.__subject)
            else:
                self.__subject.add_histograms(new_histograms)

                if self.__feature_matching_enabled:
                    self.__subject.add_descriptors(new_descriptors)

        for subject in self.__subjects:
            overall_score = subject.check_similarities(new_histograms)

            if self.__feature_matching_enabled:
                self.__do_feature_match(subject.descriptors[0], new_descriptors)

            try:
                self.__scores[subject.name][1] += overall_score
            except KeyError:
                self.__scores[subject.name] = {}
                self.__scores[subject.name][0], self.__scores[subject.name][1] = subject, overall_score

            if self.__best_match is None or self.__scores[subject.name][1] > self.__scores[self.__best_match.name][1]:
                self.__best_match = subject

        if self.__feature_matching_enabled:
            ordered_scores = OrderedDict(sorted(self.__scores.items(), key=lambda t: t[1][1], reverse=True))

            counter = 0
            highest_feature_match = 0
            for subject_with_score in ordered_scores.values():
                feature_match = self.__do_feature_match(subject_with_score[0].descriptors[0], new_descriptors)
                print(subject_with_score[0].name, feature_match)

                if feature_match > highest_feature_match:
                    self.__best_match = subject_with_score[0]
                    highest_feature_match = feature_match

                if counter > 8:
                    break
                counter += 1

        return self.__best_match