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