C#で文字認識(tesseract-ocrのラッパを使う方法)

tesseract-ocr

tesseract-ocrはオープンソースのOCR(光学文字認識)エンジン.60以上の言語に対応しており,日本語の文字認識も可能.

A .Net wrapper for tesseract-ocr

tesseract-ocrはapiが用意されているが,そのC#ラッパー「A .Net wrapper for tesseract-ocr」を使う.

インストールはNuGetから行える.プロジェクトの右クリックメニューから「Nugetパッケージの管理」をクリックし,出てきたダイアログで「ocr」で検索すれば「A .Net wrapper for tesseract-ocr」が出てくるのでインストールする.

言語データのダウンロード

tesseract-ocrでは言語ごとに学習済みのデータファイルが用意されており,それを読み込む必要がある.以下のページからダウンロード可能である.

Downloads - tesseract-ocr - An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google. - Google Project Hosting

英語ならtesseract-ocr-3.02.eng.tar.gz,日本語ならtesseract-ocr-3.02.jpn.tar.gzをダウンロードして解凍する.

解凍すると○○.traineddataというファイルが出てくる.各言語のファイルを同じフォルダに入れておくと便利.

サンプルコード

以下に使用例を示す.Bitmapクラスを使用しているため,コンソールでプロジェクトを作った場合はSystem.Drawing.dllへの参照を追加する必要があるので注意.

// OCRを行うオブジェクトの生成
//  言語データの場所と言語名を引数で指定する
var tesseract = new Tesseract.TesseractEngine(
    @"C:\tessdata", // 言語ファイルを「C:\tessdata」に置いた場合
    "jpn");         // 英語なら"eng" 「○○.traineddata」の○○の部分

// 画像ファイルの読み込み
var img = new System.Drawing.Bitmap(@"gazou.jpg");
// OCRの実行と表示
var page = tesseract.Process(img);
System.Console.Write(page.GetText());
英語の使用例

f:id:whoopsidaisies:20131216170917j:plain
入力画像

結果

Hamlet: If it be now, ‘tis not to come; if it be not to come, it will
be now; if it be not now, yet it will come: the readiness is all.
Since no man, of aught the leaves, Knows: what is’ t to leave
betimes? Let be.

きれいな画像とはいえ,完璧.

日本語の使用例

入力画像
f:id:whoopsidaisies:20131216170659j:plain

結果

来るぺきもの【ま`今来な〈ともし丶ずれ[ま来る。 今来れ【ま`後ーニ[ま来な
し丶。後江ニ来な【ナれ【ま`今来るナ三【ナのこと。肝腎なのーま覚悟ナ三。 L`つ死
んナ三らし丶し丶ヵ丶` そんなこと【ま考えてみナニところで` 言佳ーニも半ーーり【ましな
し`。 戸斤詮` ぁなナニイ壬せさ。 (ノ 丶ムレ`ント` 第5幕第2場)

日本語は結構厳しい.フォントにもよりそう.自分で学習データ作ったほうが良いのかも.

ホワイトリスト

ホワイトリストを指定すれば,文字の種類を限定でき読み取り精度が上がる可能性がある.以下のようにTesseract.SetVariableメソッドでホワイトリストを指定できる.

数字のみの場合
tesseract.SetVariable("tessedit_char_whitelist", "1234567890");
アルファベットのみの場合
tesseract.SetVariable("tessedit_char_whitelist", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");

学習

学習のインターフェースはついていないようなので,ラッパではなくてtesseract-ocr本体を使う必要がありそう.
日本語だと以下のページが参考になりそう.
日々是酩酊: TesseractOCR トレーニング その1
日々是酩酊: TesseractOCR トレーニング その2