Spaces:
Running
Running
import os, io, sys, inspect | |
from google.cloud import vision, storage | |
from PIL import Image, ImageDraw | |
currentdir = os.path.dirname(os.path.abspath( | |
inspect.getfile(inspect.currentframe()))) | |
parentdir = os.path.dirname(currentdir) | |
sys.path.append(parentdir) | |
def draw_boxes(image, bounds, color): | |
if bounds: | |
draw = ImageDraw.Draw(image) | |
width, height = image.size | |
line_width = int((width + height) / 2 * 0.001) # This sets the line width as 0.5% of the average dimension | |
for bound in bounds: | |
draw.polygon( | |
[ | |
bound["vertices"][0]["x"], bound["vertices"][0]["y"], | |
bound["vertices"][1]["x"], bound["vertices"][1]["y"], | |
bound["vertices"][2]["x"], bound["vertices"][2]["y"], | |
bound["vertices"][3]["x"], bound["vertices"][3]["y"], | |
], | |
outline=color, | |
width=line_width | |
) | |
return image | |
def detect_text(path, client): | |
# client = vision.ImageAnnotatorClient() | |
with io.open(path, 'rb') as image_file: | |
content = image_file.read() | |
image = vision.Image(content=content) | |
response = client.document_text_detection(image=image) | |
texts = response.text_annotations | |
if response.error.message: | |
raise Exception( | |
'{}\nFor more info on error messages, check: ' | |
'https://cloud.google.com/apis/design/errors'.format( | |
response.error.message)) | |
# Extract bounding boxes | |
bounds = [] | |
text_to_box_mapping = {} | |
for text in texts[1:]: # Skip the first entry, as it represents the entire detected text | |
# Convert BoundingPoly to dictionary | |
bound_dict = { | |
"vertices": [ | |
{"x": vertex.x, "y": vertex.y} for vertex in text.bounding_poly.vertices | |
] | |
} | |
bounds.append(bound_dict) | |
text_to_box_mapping[str(bound_dict)] = text.description | |
if texts: | |
# cleaned_text = texts[0].description.replace("\n", " ").replace("\t", " ").replace("|", " ") | |
cleaned_text = texts[0].description | |
return cleaned_text, bounds, text_to_box_mapping | |
else: | |
return '', None, None | |
def overlay_boxes_on_image(path, bounds): | |
image = Image.open(path) | |
draw_boxes(image, bounds, "green") | |
return image | |
# ''' Google Vision''' | |
# def detect_text(path): | |
# """Detects text in the file located in the local filesystem.""" | |
# client = vision.ImageAnnotatorClient() | |
# with io.open(path, 'rb') as image_file: | |
# content = image_file.read() | |
# image = vision.Image(content=content) | |
# response = client.document_text_detection(image=image) | |
# texts = response.text_annotations | |
# if response.error.message: | |
# raise Exception( | |
# '{}\nFor more info on error messages, check: ' | |
# 'https://cloud.google.com/apis/design/errors'.format( | |
# response.error.message)) | |
# return texts[0].description if texts else '' | |