AryanS17/Computer-Vision-Accessibility-Tool
1
1"""2ocr_reader.py3-------------4Wraps EasyOCR so the app can read signs, menus, room numbers, etc.5Loaded lazily/cached because EasyOCR's model init is slow (~2-5s) and6should only happen once per session, not once per frame.7"""8 9from typing import List, Tuple10import numpy as np11import easyocr12 13 14class TextReader:15 def __init__(self, languages: List[str] = None, gpu: bool = False):16 """17 languages: EasyOCR language codes, e.g. ['en'] or ['en', 'fr'].18 gpu: set True if a CUDA GPU is available -- big speedup for OCR.19 """20 self.languages = languages or ["en"]21 self.reader = easyocr.Reader(self.languages, gpu=gpu)22 23 def read_text(self, frame: np.ndarray, min_confidence: float = 0.4) -> List[Tuple[str, float]]:24 """25 Runs OCR on a single frame.26 Returns a list of (text, confidence) tuples, left-to-right / top-to-bottom27 in the order EasyOCR detects them, filtered by min_confidence.28 """29 raw_results = self.reader.readtext(frame) # [(bbox, text, confidence), ...]30 31 filtered = []32 for _, text, confidence in raw_results:33 cleaned = text.strip()34 if cleaned and confidence >= min_confidence:35 filtered.append((cleaned, confidence))36 37 return filtered38 39 def read_text_as_sentence(self, frame: np.ndarray, min_confidence: float = 0.4) -> str:40 """Convenience method: joins all detected text fragments into one spoken sentence."""41 results = self.read_text(frame, min_confidence)42 if not results:43 return ""44 return ". ".join(text for text, _ in results)45 