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());
英語の使用例
入力画像
結果
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.
きれいな画像とはいえ,完璧.
日本語の使用例
入力画像
結果
来るぺきもの【ま`今来な〈ともし丶ずれ[ま来る。 今来れ【ま`後ーニ[ま来な し丶。後江ニ来な【ナれ【ま`今来るナ三【ナのこと。肝腎なのーま覚悟ナ三。 L`つ死 んナ三らし丶し丶ヵ丶` そんなこと【ま考えてみナニところで` 言佳ーニも半ーーり【ましな し`。 戸斤詮` ぁなナニイ壬せさ。 (ノ 丶ムレ`ント` 第5幕第2場)
日本語は結構厳しい.フォントにもよりそう.自分で学習データ作ったほうが良いのかも.
ホワイトリスト
ホワイトリストを指定すれば,文字の種類を限定でき読み取り精度が上がる可能性がある.以下のようにTesseract.SetVariableメソッドでホワイトリストを指定できる.
数字のみの場合
tesseract.SetVariable("tessedit_char_whitelist", "1234567890");
アルファベットのみの場合
tesseract.SetVariable("tessedit_char_whitelist", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
学習
学習のインターフェースはついていないようなので,ラッパではなくてtesseract-ocr本体を使う必要がありそう.
日本語だと以下のページが参考になりそう.
日々是酩酊: TesseractOCR トレーニング その1
日々是酩酊: TesseractOCR トレーニング その2