tesseract-ocrをMacで使ってみた
2014年1月5日:OCR
OCRライブラリの一つであるtesseract-ocrをMacで使ってみました。
Homebrewのインストール
tesseractをインストールする前に、Homebrewをインストールします。
HomebrewはMacへのインストールをかんたんにできるプログラムです。
コマンドプロンプトに
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 test.png result -l eng
すると、result.txtが生成され
1234ABCDabc
と書かれています。
これでは英数字しか読めないので、日本語も読めるようにしましょう。以下のリンクから「tesseract-ocr-3.02.jpn.tar.gz 」をダウンロードして解凍します。
そしたら、「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
当たり前ですが、数字は読めてますが、英語は読めてませんね。
ただ、読み取る種類が減っているので、数字を読み取る精度は高くなります。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー