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.execome 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:
| Intervento | Perché aiuta |
|---|---|
| Conversione in scala di grigi | Riduce il rumore cromatico che confonde il riconoscimento dei caratteri |
| Aumento del contrasto | Separa più nettamente testo e sfondo |
| Correzione dell'inclinazione (deskew) | Un documento fotografito storto riduce drasticamente l'accuratezza OCR |
| Ridimensionamento a risoluzione adeguata | Immagini 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.