document_scanner Programmazione

OCR in Delphi: estrarre testo da immagini e documenti scansionati

calendar_today personTeam EGSOFT schedule3 min di lettura

OCR (Optical Character Recognition, riconoscimento ottico dei caratteri) è la tecnologia che estrae testo modificabile e ricercabile da un'immagine: una scansione di un documento, la foto di una targa, un modulo compilato a mano stampato. In un gestionale aziendale è alla base della digitalizzazione documentale — pensiamo alla lettura automatica di libretti di circolazione o documenti di identità in EGAUTO. Vediamo come integrarlo in un'applicazione Delphi.

Tesseract: la libreria OCR open source di riferimento

Tesseract è il motore OCR open source più diffuso, sviluppato originariamente da HP e oggi mantenuto sotto l'egida Google, con supporto per oltre 100 lingue incluso l'italiano. Da Delphi si può integrare in due modi:

  • Chiamata al programma a riga di comando — il modo più semplice: si invoca tesseract.exe come processo esterno passando il file immagine, e si legge il file di testo generato in output
  • Binding diretto alla libreria — tramite wrapper Delphi per libtesseract (disponibili come progetti community), che evitano l'overhead di lanciare un processo esterno per ogni immagine, preferibile per volumi alti

Esempio della via più semplice, invocando Tesseract come processo esterno:

uses
  System.SysUtils, System.IOUtils, Winapi.Windows, Winapi.ShellAPI;

function EseguiOCR(const PercorsoImmagine: string): string;
var
  FileOutput: string;
  Info: TShellExecuteInfo;
begin
  FileOutput := TPath.ChangeExtension(PercorsoImmagine, '');

  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Info.lpFile := 'tesseract.exe';
  Info.lpParameters := PChar(Format('"%s" "%s" -l ita', [PercorsoImmagine, FileOutput]));
  Info.nShow := SW_HIDE;

  if ShellExecuteEx(@Info) then
  begin
    WaitForSingleObject(Info.hProcess, 30000);
    CloseHandle(Info.hProcess);
    Result := TFile.ReadAllText(FileOutput + '.txt', TEncoding.UTF8);
  end;
end;

Il parametro -l ita specifica il pacchetto lingua italiano di Tesseract (va scaricato e installato separatamente dal core del motore). La qualità del risultato dipende moltissimo dalla qualità dell'immagine in ingresso: risoluzione, contrasto e inclinazione del testo influenzano l'accuratezza più del motore OCR stesso.

API OCR cloud: quando conviene

Servizi come Azure AI Vision, Google Cloud Vision o Amazon Textract offrono OCR basato su deep learning, generalmente più accurato di Tesseract su documenti complessi (tabelle, moduli strutturati, calligrafia), con il consueto compromesso: costo per chiamata e dipendenza da una connessione internet. Molti offrono anche l'estrazione strutturata (es. riconoscere automaticamente "questo è un indirizzo", "questo è una data"), non solo testo grezzo — una differenza importante quando serve popolare campi specifici di un form, non solo ottenere del testo libero.

Pre-elaborazione dell'immagine: il passaggio spesso trascurato

Prima di passare un'immagine a qualunque motore OCR, alcuni interventi semplici migliorano sensibilmente l'accuratezza:

InterventoPerché aiuta
Conversione in scala di grigiRiduce il rumore cromatico che confonde il riconoscimento dei caratteri
Aumento del contrastoSepara più nettamente testo e sfondo
Correzione dell'inclinazione (deskew)Un documento fotografito storto riduce drasticamente l'accuratezza OCR
Ridimensionamento a risoluzione adeguataImmagini troppo piccole o troppo compresse perdono dettagli dei caratteri

In Delphi, queste operazioni si possono implementare con la libreria System.Vcl.Imaging per le trasformazioni di base, o affidarsi a librerie di elaborazione immagini più complete quando serve un deskew automatico accurato.

Un caso d'uso concreto: automatizzare l'acquisizione documenti

Un flusso tipico che integra tutto quanto visto: l'operatore fotografa un documento con lo smartphone (o lo scansiona), l'app carica l'immagine, esegue OCR (locale con Tesseract o via API cloud), e i campi riconosciuti popolano automaticamente un form — con l'operatore che verifica e corregge, invece di digitare tutto da zero. È esattamente il tipo di automazione che restituisce il tempo maggiore rispetto allo sforzo di implementazione, perché elimina un'attività ripetitiva e soggetta a errori di trascrizione manuale.

document_scannerAltri articoli su Programmazione grid_viewTutti gli articoli
Scrivici su WhatsApp