51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
import logging
|
|
from pathlib import Path
|
|
from typing import List, Optional
|
|
import easyocr
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class TweetOCRExtractor:
|
|
"""
|
|
Classe responsable de l'extraction de texte à partir de captures d'écran en utilisant EasyOCR.
|
|
"""
|
|
def __init__(self, languages: Optional[List[str]] = None):
|
|
"""
|
|
Initialise le lecteur EasyOCR.
|
|
:param languages: Liste des langues à charger (par défaut ['fr', 'en']).
|
|
"""
|
|
if languages is None:
|
|
languages = ['fr', 'en']
|
|
self.languages = languages
|
|
self._reader = None
|
|
|
|
@property
|
|
def reader(self) -> easyocr.Reader:
|
|
"""
|
|
Initialisation tardive (lazy loading) d'EasyOCR pour économiser de la mémoire si non utilisé.
|
|
"""
|
|
if self._reader is None:
|
|
logger.info("Initialisation de l'OCR EasyOCR (ceci peut prendre quelques secondes)...")
|
|
self._reader = easyocr.Reader(self.languages)
|
|
return self._reader
|
|
|
|
def extract_text(self, image_path: Path) -> str:
|
|
"""
|
|
Extrait le texte d'une image.
|
|
:param image_path: Chemin vers le fichier image.
|
|
:return: Texte brut extrait.
|
|
"""
|
|
if not image_path.exists():
|
|
raise FileNotFoundError(f"Le fichier image n'existe pas : {image_path}")
|
|
|
|
try:
|
|
# easyocr accepte un chemin de fichier sous forme de string
|
|
results = self.reader.readtext(str(image_path))
|
|
# On joint les blocs de texte détectés
|
|
text_blocks = [text for (_, text, _) in results]
|
|
extracted_text = " ".join(text_blocks).strip()
|
|
return extracted_text
|
|
except Exception as e:
|
|
logger.error(f"Erreur lors de l'extraction OCR sur {image_path.name} : {e}")
|
|
raise RuntimeError(f"Échec de l'OCR : {e}") from e
|