def update_preview_state(self, frame, contours): """ Get the average color value for the contour for every X amount of frames to prevent flickering and more precise results. """ max_average_rounds = 8 for index, (x, y, w, h) in enumerate(contours): if index in self.average_sticker_colors and len( self.average_sticker_colors[index]) == max_average_rounds: sorted_items = {} for bgr in self.average_sticker_colors[index]: key = str(bgr) if key in sorted_items: sorted_items[key] += 1 else: sorted_items[key] = 1 most_common_color = max(sorted_items, key=lambda i: sorted_items[i]) self.average_sticker_colors[index] = [] self.preview_state[index] = eval(most_common_color) break roi = frame[y + 7:y + h - 7, x + 14:x + w - 14] avg_bgr = ColorDetector.get_dominant_color(roi) closest_color = ColorDetector.get_closest_color( avg_bgr)['color_bgr'] self.preview_state[index] = closest_color if index in self.average_sticker_colors: self.average_sticker_colors[index].append(closest_color) else: self.average_sticker_colors[index] = [closest_color]
def update_snapshot_state(self, frame): """Update the snapshot state based on the current preview state.""" self.snapshot_state = list(self.preview_state) center_color_name = ColorDetector.get_closest_color( self.snapshot_state[4])['color_name'] self.sides[center_color_name] = self.snapshot_state self.draw_snapshot_stickers(frame)
def update_preview(self, frame): self.preview = list(self.state) center_color_name = ColorDetector.get_closest_color( self.preview[4])['color_name'] self.sides[center_color_name] = self.preview self.draw_stickers(self.preview_stickers, frame, self.preview)