- vision/document.py: pad_quad() expands the detected quad outward
before warping so a straight-line contour fit doesn't clip the first
character of every line on a slightly curled/wrinkled receipt
- ocr/extract.py + llm/vision.py: extract transaction time (HH:MM) so
same-day repeat visits to a vendor get distinct filenames
(2023-03-20_1525_walmart.pdf vs. a later same-day trip)
- vision/orient.py: downscale before Tesseract OSD/confidence-sweep
rotation detection — this was the dominant cost in the detection
phase (7x speedup: 472s -> 67s on a 36s test video)
- vision/refine.py: tighten crops to the paper band (removes mat
margins and hands beside receipts) and inpaint border-connected
skin regions so fingers disappear from output
- llm/vision.py: identify documents with a local Ollama vision model
(qwen2.5vl); extracts vendor/date/total/form code and flags quality
issues (fingers, blur, glare); falls back to Tesseract when down
- pipeline: drop blank pages, dedupe consecutive captures of the same
document, record refine/LLM fields in report and export summary