Spieghiamo di seguito come procedere per utilizzare Tesseract (ottimo OCR) in un proprio applicativo.
Innanzitutto vi rimando al sito dove potete trovare tutto quel che serve compreso un un semplice esempio di utilizzo ed anche come fare per compilarselo alla bisogna.
Per un ulteriore modesto esempio, brevemente spiegato qui di seguito, potete dare un'occhiata al mio programma "Sudoku Schema Reader", il file con l'esempio di utilizzo è cWinImage.cpp.
Prima di tutto importiamo le librerie nel nostro progetto:
Installare il software Tesseract (usando ad esempio Synoptic, o da riga di comando come al solito). I pacchetti da installare sono i seguenti:
tesserat-ocr
tesseract-ocr-dev
tesseract-ocr-ita
tesseract-ocr-end
libtesseract-dev
libtesseract3
Vengono installati i dizionari nella directory:
/usr/share/tesseract-ocr
Mentre gli header si troveranno in
/usr/include/tesseract/
E le librerie (libtesseract.*) in
/usr/lib
E' bene installare pure la libreria leptonica (semplice libreria per lagestione delle immagini):
libleptonica-dev
Se necessario nel sito dedicato a Tesseract si trovano i dizionari (io ho usato quello standard inglese).
Aggiungere le librerie nel progetto, ad esempio con Qt Creator è semplicissimo, basta cliccare con il tasto desto sulla radice dell’albero del progetto, selezionare l'opzione dedicata e compilare il form che appare.
A questo punto siamo pronti per utilizzare i metodi della libreria:
Includere gli header (tesseract e leptonica):
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
Creare un'immagine (la struttura è definita nella libreria leptonica e compatibile con tesseract):
PIX* pImgLeptPix = pixCreate(wn,hn,32); //Width [pixel], Height [pixel], Depth [bits]
Copiamo la porzione di immagine che ci interessa in quella creata al passo "b2" (nell'esempio passiamo da una monocromatica ad una RGB 32 bit):
l_int32 ImgLeptWpl = pixGetWpl(pImgLeptPix);
l_uint32* pImgLeptData = pixGetData(pImgLeptPix);
l_uint32* ppixel;
l_uint8 ColorVal;
for (int i = 0; i < hn; i++) {
ppixel = pImgLeptData + i * ImgLeptWpl;
for (int j = 0; j < wn; j++) {
ColorVal = qGray(pEdgeImage->pixel(xul+j,yul+i));
SET_DATA_BYTE(ppixel, COLOR_RED, ColorVal);
SET_DATA_BYTE(ppixel, COLOR_GREEN, ColorVal);
SET_DATA_BYTE(ppixel, COLOR_BLUE, ColorVal);
ppixel++;
}
}
Creiamo ed inizializziamo l'oggetto Tesseract:
//Create Tesseract object
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (api->Init(NULL,"eng")) {
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
Imponiamo che l'immagine da cui estrarre il testo sia quella creata al passo "b3":
api->SetImage(pImgLeptPix);
Infine leggiamo il testo contenuto nell'immagine:
//Identify number using OCR
char *outText;
outText = api->GetUTF8Text(); // Get OCR result