File size: 2,119 Bytes
dfff0b8 8bef43b dfff0b8 8bef43b dfff0b8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
from fastapi import FastAPI, UploadFile, File, HTTPException
from fastapi.responses import JSONResponse
import numpy as np
from PIL import Image
import io
import uvicorn
import os
# Configurar variables de entorno para EasyOCR antes de importarlo
os.environ['EASYOCR_MODULE_PATH'] = '/app/model'
os.environ['HOME'] = '/app'
import easyocr
app = FastAPI()
# Inicializar el lector OCR
reader = easyocr.Reader(['es', 'en'])
@app.post("/ocr")
async def extract_text(file: UploadFile = File(...)):
"""
Extrae texto de una imagen usando OCR
"""
try:
# Verificar que el archivo sea una imagen
if not file.content_type.startswith('image/'):
raise HTTPException(status_code=400, detail="El archivo debe ser una imagen")
# Leer el archivo
contents = await file.read()
# Convertir a PIL Image
image = Image.open(io.BytesIO(contents))
# Convertir a RGB si es necesario
if image.mode != 'RGB':
image = image.convert('RGB')
# Convertir a numpy array
image_array = np.array(image)
# Realizar OCR
results = reader.readtext(image_array)
# Formatear resultados
extracted_text = []
for (bbox, text, confidence) in results:
extracted_text.append({
"text": text,
"confidence": float(confidence),
"bbox": bbox
})
# Texto completo concatenado
full_text = " ".join([item["text"] for item in extracted_text])
return JSONResponse(content={
"success": True,
"full_text": full_text,
"detailed_results": extracted_text
})
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error procesando la imagen: {str(e)}")
@app.get("/")
async def root():
return {"message": "OCR API funcionando", "endpoint": "/ocr"}
if __name__ == "__main__":
port = int(os.environ.get("PORT", 7860))
uvicorn.run(app, host="0.0.0.0", port=port)
|