tesseract-ocrをMacで使ってみた

OCRライブラリの一つであるtesseract-ocrをMacで使ってみました。

Homebrewのインストール

tesseractをインストールする前に、Homebrewをインストールします。

HomebrewはMacへのインストールをかんたんにできるプログラムです。

>>Homebrewのページ

コマンドプロンプトに

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

とうち実行します。すると、インストールが実行されます。インストールされれば

brew -v

とすれば、バージョンが表示されます。

tesseract-ocrのインストールと実行

tesseract-ocrはコマンドプロンプトに

brew install tesseract

としてインストール完了です。

tesseract-ocrを使ってみる

では、tesseract-ocrをコマンドプロンプトで使ってみます。今回使用する画像は

tesseract-ocr

です。以下のようにコマンドを打ちます。

tesseract test.png result -l eng

すると、result.txtが生成され

1234ABCDabc

と書かれています。

これでは英数字しか読めないので、日本語も読めるようにしましょう。以下のリンクから「tesseract-ocr-3.02.jpn.tar.gz 」をダウンロードして解凍します。

>>tesseract-ocrのページ

そしたら、「jpn.traineddata」というファイルができるので、「eng.traineddata」というファイルのあるディレクトリに保存します。

/usr/local/Cellar/tesseract/3.02.02/share/tessdata/

にあります。Finderで「移動>>フォルダへ移動」で移動できます。

終わったら、コマンドプロンプトで

tesseract test.png result2 -l jpn

を実行します。すると

ー23饗ABCDabc

が得られます。日本語ではあまり認識がよくないのがわかります。

文字を特定のものに指定したい場合は

tessedit_char_whitelist 0123456789

とかかれたテキストファイルdigits.txtをつくって

tesseract test.png result2 digits.txt

を実行します。

プログラムで使ってみる

では、以下のようにプログラムをつくります。

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

int main(){
    tesseract::TessBaseAPI *myOCR = new tesseract::TessBaseAPI();
    if (myOCR->Init(NULL, "eng")) { //英語で指定
          exit(1);
    }

    Pix *pix = pixRead("test.png"); //使用するファイル名
    myOCR->SetImage(pix);

    char* outText = myOCR->GetUTF8Text();
    printf(outText);

    myOCR->Clear();
    myOCR->End();
    delete [] outText;
    pixDestroy(&pix);

    return 0;
}

そして、

g++ -llept -ltesseract -I/usr/local/include -L/usr/local/lib test.cpp

でコンパイルします。ヘッダーの場所とライブラリの場所を指定しています。

./a.out

で実行します。すると

1234ABCDabc

と表示されます。

 

では、次に読み取る文字を限定させてみます。ここでは

「0123456789」

と数字のみの読み取りにします。この場合のプログラムは以下の通りです。

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

int main(){
    tesseract::TessBaseAPI *myOCR = new tesseract::TessBaseAPI();
    if (myOCR->Init(NULL, "eng")) { //英語で指定
          exit(1);
	}
	myOCR->SetVariable("tessedit_char_whitelist", "0123456789");

    Pix *pix = pixRead("test.png"); //使用するファイル名
    myOCR->SetImage(pix);

    char* outText = myOCR->GetUTF8Text();
    printf(outText);

    myOCR->Clear();
    myOCR->End();
    delete [] outText;
    pixDestroy(&pix);

    return 0;
}

SetVariableというメソッドを使用しています。結果は以下の通りです。

12341813613 41 6

当たり前ですが、数字は読めてますが、英語は読めてませんね。

 

ただ、読み取る種類が減っているので、数字を読み取る精度は高くなります。

著者:安井 真人(やすい まさと)