# API The Flask app lives in `app/app.py`. ## `GET /` Serves the browser interface from `app/templates/index.html`. Response type: `text/html` ## `GET /video_feed` Returns an MJPEG stream of annotated frames. Response type: ```text multipart/x-mixed-replace; boundary=frame ``` The stream uses the latest annotated frame produced by the demo worker or upload handler. ## `GET /result` Returns the latest pipeline result as JSON. Example: ```json { "text": "hello", "dot_count": 14, "cell_count": 5, "confidence": 1.0, "spacing": 22.0 } ``` Fields: - `text`: decoded text - `dot_count`: number of detected dots after filtering - `cell_count`: number of segmented Braille cells - `confidence`: fraction of cells decoded to known characters - `spacing`: estimated within-cell dot spacing in pixels When no result exists yet: ```json { "text": "", "dot_count": 0, "cell_count": 0, "confidence": 0.0, "spacing": 0.0 } ``` ## `POST /upload` Accepts multipart form data with an `image` field. Example: ```bash curl -F "image=@data/samples/hello.png" http://127.0.0.1:7860/upload ``` Response: ```json { "text": "hello", "dot_count": 14, "cell_count": 5, "confidence": 1.0, "spacing": 22.0, "annotated_image_b64": "data:image/jpeg;base64,..." } ``` Current behavior: - Saves the uploaded image into `data/samples/`. - Runs the pipeline once. - Updates the latest server-side result. - Returns an annotated JPEG data URL. Current limitations: - File size is not limited. - MIME/type validation is minimal. - Uploaded files are kept in `data/samples/`. ## `GET /health` Health check for local development, Docker, and deployment probes. Example: ```bash curl http://127.0.0.1:7860/health ``` Response: ```json {"status": "ok", "version": "1.0"} ```