diff --git a/vision-env/src/colors_detection.py b/vision-env/src/colors_detection.py new file mode 100644 index 0000000..70304a8 --- /dev/null +++ b/vision-env/src/colors_detection.py @@ -0,0 +1,69 @@ +from scipy.spatial import KDTree +from webcolors import ( + hex_to_rgb, +) + +COLORS = { + "aqua": ["#00ffff", (0,255,255)], + "black": ["#000000", (0,0,0)], + "blue": ["#0000ff", (0,0,255)], + "fuchsia": ["#ff00ff", (255,0,255)], + "green": ["#008000", (0,128,0)], + "gray": ["#808080", (128,128,128)], + "lime": ["#00ff00", (0,255,0)], + "olive": ["#808000", (128,128,0)], + "purple": ["#800080", (128,0,128)], + "red": ["#ff0000", (255,0,0)], + "silver": ["#c0c0c0", (192,192,192)], + "teal": ["#008080", (0,128,128)], + "white": ["#ffffff", (255,255,255)], + "yellow": ["#ffff00", (255,255,0)], + "beige": ["#f5f5dc", (245,245,220)], + "brown": ["#a52a2a", (165,42,42)], + "gold": ["#ffd700", (255,215,0)], + "pink": ["#ffc0cb", (255,192,203)], + "lavender": ["#e6e6fa", (230,230,250)], + "turquoise": ["#40e0d0", (64,224,208)], + "violet": ["#ee82ee", (238,130,238)], + "orange": ["#ffa500", (255,165,0)], + "lightblue": ["#add8e6", (173,216,230)] +} + +COLORS_HEX = { + "aqua": "#00ffff", + "black": "#000000", + "blue": "#0000ff", + "fuchsia": "#ff00ff", + "green": "#008000", + "gray": "#808080", + "lime": "#00ff00", + "olive": "#808000", + "purple": "#800080", + "red": "#ff0000", + "silver": "#c0c0c0", + "teal": "#008080", + "white": "#ffffff", + "yellow": "#ffff00", + "beige": "#f5f5dc", + "brown": "#a52a2a", + "gold": "#ffd700", + "pink": "#ffc0cb", + "lavender": "#e6e6fa", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "orange": "#ffa500", + "lightblue": "#add8e6", +} + +def convert_rgb_to_names(rgb_tuple): + # A dictionary of all the color names and their respective hex in color_db + color_db = COLORS_HEX + names = [] + rgb_values = [] + for color_name, color_hex in color_db.items(): + names.append(color_name) + rgb_values.append(hex_to_rgb(color_hex)) + + kdt_db = KDTree(rgb_values) + distance, index = kdt_db.query(rgb_tuple) + return str(names[index]) diff --git a/vision-env/src/vision-test.py b/vision-env/src/vision-test.py index 1dfc2c4..cfe4bf6 100644 --- a/vision-env/src/vision-test.py +++ b/vision-env/src/vision-test.py @@ -1,16 +1,22 @@ -from genericpath import isfile import io import os import sys import numpy as np import cv2 +import math +import colors_detection import json +from genericpath import isfile from pyautogui import size from google.cloud import vision # Minimum score required for labels detection MIN_SCORE_REQUIRED = 0.80 +# Minimum pixel_fraction required for color detection. +# Actually unused but useful for filtering colors. +MIN_PFRACTION_REQUIRED = 0.02 + def shape_selection(event, x, y, flags, param): # grab references to the global variables global ref_point, crop @@ -138,15 +144,45 @@ client = vision.ImageAnnotatorClient() image = vision.Image(content=content) # Performs label detection on the image file -response = client.label_detection(image=image) -labels = response.label_annotations +label_response = client.label_detection(image=image) +labels = label_response.label_annotations + +# Performs image_properties detection on the image file +colors_response = client.image_properties(image=image) +colors = colors_response.image_properties_annotation.dominant_colors.colors # Labels sorted by attribute score sorted_labels = sorted(labels, key=lambda x:x.score, reverse=True) - # Labels filtered by attribute score filtered_labels = filter(lambda x:x.score > MIN_SCORE_REQUIRED, sorted_labels) -print('Labels:') +# Labels sorted by attribute score +sorted_colors = sorted(colors, key=lambda x:x.pixel_fraction, reverse=True) +# Colors filtered by attribute pixel_fraction +#filtered_colors = filter(lambda x:x.pixel_fraction > MIN_PFRACTION_REQUIRED, sorted_colors) +# Actually no filtering policy +filtered_colors = sorted_colors + +print('\nLabels:') for label in filtered_labels: - print(label.description + ' ---> ' + str(label.score)) + print('--- Label: ' + label.description + ' ---> ' + str(math.trunc(label.score*100)) + '%' + + '\n') + +print('\nColors:') +for color_info in filtered_colors: + color = color_info.color + + red = math.trunc(color.red) + green = math.trunc(color.green) + blue = math.trunc(color.blue) + + rgb_triplet = (red, green, blue) + rgb_triplet_str = (str(red) + '%, ', str(green) + '%, ', str(blue) + '%') + color_name = colors_detection.convert_rgb_to_names(rgb_triplet) + + # uncomment for verbose output + #print(str(color_info.pixel_fraction) + ' == ' + str(math.trunc(color_info.pixel_fraction*100)) + '%' + ' score: ' + str(color_info.score) + '---> ' + color_name) + print('--- Pixel Fraction: ' + str(round(color_info.pixel_fraction*100, 3)) + '%' + + '\tScore: ' + str(round(color_info.score, 5)) + + '\tColor Name: ' + color_name + + '\n')