from fastapi import FastAPI from pydantic import BaseModel import easyocr import numpy as np from PIL import Image import cv2 import base64 import io import os app = FastAPI(title="OCR Base64 API") model_storage_dir = '/code/.EasyOCR' os.makedirs(model_storage_dir, exist_ok=True) reader = easyocr.Reader(['en'], gpu=False, model_storage_directory=model_storage_dir) class ImageRequest(BaseModel): image_base64: str def preprocess_image(image): gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) scale_percent = 200 width = int(gray.shape[1] * scale_percent / 100) height = int(gray.shape[0] * scale_percent / 100) resized = cv2.resize(gray, (width, height), interpolation=cv2.INTER_LINEAR) _, thresh = cv2.threshold(resized, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) return thresh @app.post("/extract-text/") def extract_text(request: ImageRequest): try: b64_data = request.image_base64 if "base64," in b64_data: b64_data = b64_data.split("base64,")[1] image_bytes = base64.b64decode(b64_data) image = Image.open(io.BytesIO(image_bytes)).convert("RGB") img_np = np.array(image) processed_img = preprocess_image(img_np) results = reader.readtext(processed_img) extracted_text = [text.replace(" ", "") for _, text, _ in results] text_result = " ".join(extracted_text) if extracted_text else "" return { "success": True, "text": text_result } except Exception as e: return { "success": False, "error": str(e) } @app.get("/") def read_root(): return {"message": "API is running!"}