personal
OCR de tickets
App Flutter con backend Python que lee tickets con OCR y reparte automáticamente cada artículo entre las personas que lo consumieron.
Dividir una cuenta entre seis personas cuando cada uno ha pedido algo distinto es un problema aburrido que se resuelve mal en la práctica: alguien pone el ticket sobre la mesa, se hacen cuentas a ojo y siempre acaba pagando de más el mismo.
Esta app hace la foto, lee el ticket y reparte.
El flujo#
La aplicación está pensada para usarse en la mesa, en dos minutos, con una mano.


1. Capturar y preprocesar#
Antes de intentar leer nada, la imagen pasa por OpenCV: corrección de contraste, binarización y enderezado. Un ticket fotografiado sobre una mesa siempre llega torcido y con sombras, y esa fase previa marca la diferencia entre un OCR usable y uno inservible.
2. Corregir lo que falle#
El OCR acierta la mayoría de líneas, pero no todas. En lugar de fingir que el reconocimiento es perfecto, la app asume que va a fallar y hace que corregirlo sea trivial: tocar el campo y escribir.

3. Repartir#
Aquí está el valor real. Se añaden los comensales, se marca quién consumió cada artículo —los compartidos se dividen solos— y se indica quién puso el dinero.



4. El resultado#
La app calcula el saldo neto de cada persona y reduce las transferencias al mínimo necesario, en lugar de listar quién debe qué a quién en todas las combinaciones posibles.

Arquitectura#
El cliente es Flutter, con SQLite local para que los tickets guardados sigan accesibles sin conexión. El backend es FastAPI desplegado en Railway y se ocupa únicamente del OCR: recibe la imagen, devuelve las líneas reconocidas.
Mantener el reparto en el cliente y el OCR en el servidor fue una decisión deliberada: la parte cara computacionalmente se externaliza, pero la app sigue siendo útil sin cobertura para consultar tickets pasados.
Lo que aprendí#
El preprocesado de imagen importa más que el motor de OCR. Pasé mucho tiempo probando alternativas de reconocimiento antes de darme cuenta de que la mayor parte de los fallos venían de la foto, no del modelo. Con una buena binarización y corrección de perspectiva, un OCR modesto rinde mucho mejor que uno bueno alimentado con imágenes malas.